Rob Findley | 17fd2f2 | 2020-08-26 09:30:25 -0400 | [diff] [blame] | 1 | // Copyright 2020 The Go Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
| 5 | package regtest |
| 6 | |
| 7 | import ( |
| 8 | "flag" |
| 9 | "fmt" |
| 10 | "testing" |
| 11 | |
Rob Findley | 17fd2f2 | 2020-08-26 09:30:25 -0400 | [diff] [blame] | 12 | "golang.org/x/tools/internal/lsp/protocol" |
| 13 | ) |
| 14 | |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 15 | func printBenchmarkResults(result testing.BenchmarkResult) { |
| 16 | fmt.Println("Benchmark Statistics:") |
| 17 | fmt.Println(result.String()) |
| 18 | fmt.Println(result.MemString()) |
| 19 | } |
| 20 | |
| 21 | var iwlOptions struct { |
Rob Findley | 06cc1d0 | 2020-08-26 12:54:06 -0400 | [diff] [blame] | 22 | workdir string |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 23 | } |
Rob Findley | 06cc1d0 | 2020-08-26 12:54:06 -0400 | [diff] [blame] | 24 | |
| 25 | func init() { |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 26 | flag.StringVar(&iwlOptions.workdir, "iwl_workdir", "", "if set, run IWL benchmark in this directory") |
Rob Findley | 06cc1d0 | 2020-08-26 12:54:06 -0400 | [diff] [blame] | 27 | } |
| 28 | |
| 29 | func TestBenchmarkIWL(t *testing.T) { |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 30 | if iwlOptions.workdir == "" { |
Rob Findley | 06cc1d0 | 2020-08-26 12:54:06 -0400 | [diff] [blame] | 31 | t.Skip("-iwl_workdir not configured") |
| 32 | } |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 33 | |
| 34 | opts := stressTestOptions(iwlOptions.workdir) |
Rob Findley | 06cc1d0 | 2020-08-26 12:54:06 -0400 | [diff] [blame] | 35 | // Don't skip hooks, so that we can wait for IWL. |
| 36 | opts = append(opts, SkipHooks(false)) |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 37 | |
| 38 | results := testing.Benchmark(func(b *testing.B) { |
Rob Findley | 06cc1d0 | 2020-08-26 12:54:06 -0400 | [diff] [blame] | 39 | for i := 0; i < b.N; i++ { |
Rob Findley | d7fc70a | 2020-09-28 16:19:01 -0400 | [diff] [blame] | 40 | withOptions(opts...).run(t, "", func(t *testing.T, env *Env) {}) |
Rob Findley | 06cc1d0 | 2020-08-26 12:54:06 -0400 | [diff] [blame] | 41 | } |
| 42 | }) |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 43 | |
| 44 | printBenchmarkResults(results) |
Rob Findley | 06cc1d0 | 2020-08-26 12:54:06 -0400 | [diff] [blame] | 45 | } |
| 46 | |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 47 | var symbolOptions struct { |
Rob Findley | 17fd2f2 | 2020-08-26 09:30:25 -0400 | [diff] [blame] | 48 | workdir, query, matcher, style string |
| 49 | printResults bool |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 50 | } |
Rob Findley | 17fd2f2 | 2020-08-26 09:30:25 -0400 | [diff] [blame] | 51 | |
| 52 | func init() { |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 53 | flag.StringVar(&symbolOptions.workdir, "symbol_workdir", "", "if set, run symbol benchmark in this directory") |
| 54 | flag.StringVar(&symbolOptions.query, "symbol_query", "test", "symbol query to use in benchmark") |
| 55 | flag.StringVar(&symbolOptions.matcher, "symbol_matcher", "", "symbol matcher to use in benchmark") |
| 56 | flag.StringVar(&symbolOptions.style, "symbol_style", "", "symbol style to use in benchmark") |
| 57 | flag.BoolVar(&symbolOptions.printResults, "symbol_print_results", false, "whether to print symbol query results") |
Rob Findley | 17fd2f2 | 2020-08-26 09:30:25 -0400 | [diff] [blame] | 58 | } |
| 59 | |
| 60 | func TestBenchmarkSymbols(t *testing.T) { |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 61 | if symbolOptions.workdir == "" { |
Rob Findley | 17fd2f2 | 2020-08-26 09:30:25 -0400 | [diff] [blame] | 62 | t.Skip("-symbol_workdir not configured") |
| 63 | } |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 64 | |
| 65 | opts := stressTestOptions(symbolOptions.workdir) |
Rob Findley | 797bd0f | 2020-09-15 22:04:47 -0400 | [diff] [blame] | 66 | conf := EditorConfig{} |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 67 | if symbolOptions.matcher != "" { |
| 68 | conf.SymbolMatcher = &symbolOptions.matcher |
Rob Findley | 17fd2f2 | 2020-08-26 09:30:25 -0400 | [diff] [blame] | 69 | } |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 70 | if symbolOptions.style != "" { |
| 71 | conf.SymbolStyle = &symbolOptions.style |
Rob Findley | 17fd2f2 | 2020-08-26 09:30:25 -0400 | [diff] [blame] | 72 | } |
Rob Findley | 797bd0f | 2020-09-15 22:04:47 -0400 | [diff] [blame] | 73 | opts = append(opts, conf) |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 74 | |
Rob Findley | 17fd2f2 | 2020-08-26 09:30:25 -0400 | [diff] [blame] | 75 | withOptions(opts...).run(t, "", func(t *testing.T, env *Env) { |
| 76 | // We can't Await in this test, since we have disabled hooks. Instead, run |
| 77 | // one symbol request to completion to ensure all necessary cache entries |
| 78 | // are populated. |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 79 | symbols, err := env.Editor.Server.Symbol(env.Ctx, &protocol.WorkspaceSymbolParams{ |
| 80 | Query: symbolOptions.query, |
Rob Findley | 17fd2f2 | 2020-08-26 09:30:25 -0400 | [diff] [blame] | 81 | }) |
| 82 | if err != nil { |
| 83 | t.Fatal(err) |
| 84 | } |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 85 | |
| 86 | if symbolOptions.printResults { |
Rob Findley | 17fd2f2 | 2020-08-26 09:30:25 -0400 | [diff] [blame] | 87 | fmt.Println("Results:") |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 88 | for i := 0; i < len(symbols); i++ { |
| 89 | fmt.Printf("\t%d. %s (%s)\n", i, symbols[i].Name, symbols[i].ContainerName) |
Rob Findley | 17fd2f2 | 2020-08-26 09:30:25 -0400 | [diff] [blame] | 90 | } |
| 91 | } |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 92 | |
| 93 | results := testing.Benchmark(func(b *testing.B) { |
Rob Findley | 17fd2f2 | 2020-08-26 09:30:25 -0400 | [diff] [blame] | 94 | for i := 0; i < b.N; i++ { |
| 95 | if _, err := env.Editor.Server.Symbol(env.Ctx, &protocol.WorkspaceSymbolParams{ |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 96 | Query: symbolOptions.query, |
Rob Findley | 17fd2f2 | 2020-08-26 09:30:25 -0400 | [diff] [blame] | 97 | }); err != nil { |
| 98 | t.Fatal(err) |
| 99 | } |
| 100 | } |
| 101 | }) |
Danish Dua | 06f3a46 | 2020-09-22 18:04:19 -0400 | [diff] [blame] | 102 | printBenchmarkResults(results) |
Rob Findley | 17fd2f2 | 2020-08-26 09:30:25 -0400 | [diff] [blame] | 103 | }) |
| 104 | } |