mirror of https://github.com/golang/go.git
105 lines
2.9 KiB
Go
105 lines
2.9 KiB
Go
// Copyright 2020 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package regtest
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"golang.org/x/tools/internal/lsp/protocol"
|
|
)
|
|
|
|
func printBenchmarkResults(result testing.BenchmarkResult) {
|
|
fmt.Println("Benchmark Statistics:")
|
|
fmt.Println(result.String())
|
|
fmt.Println(result.MemString())
|
|
}
|
|
|
|
var iwlOptions struct {
|
|
workdir string
|
|
}
|
|
|
|
func init() {
|
|
flag.StringVar(&iwlOptions.workdir, "iwl_workdir", "", "if set, run IWL benchmark in this directory")
|
|
}
|
|
|
|
func TestBenchmarkIWL(t *testing.T) {
|
|
if iwlOptions.workdir == "" {
|
|
t.Skip("-iwl_workdir not configured")
|
|
}
|
|
|
|
opts := stressTestOptions(iwlOptions.workdir)
|
|
// Don't skip hooks, so that we can wait for IWL.
|
|
opts = append(opts, SkipHooks(false))
|
|
|
|
results := testing.Benchmark(func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
withOptions(opts...).run(t, "", func(t *testing.T, env *Env) {})
|
|
}
|
|
})
|
|
|
|
printBenchmarkResults(results)
|
|
}
|
|
|
|
var symbolOptions struct {
|
|
workdir, query, matcher, style string
|
|
printResults bool
|
|
}
|
|
|
|
func init() {
|
|
flag.StringVar(&symbolOptions.workdir, "symbol_workdir", "", "if set, run symbol benchmark in this directory")
|
|
flag.StringVar(&symbolOptions.query, "symbol_query", "test", "symbol query to use in benchmark")
|
|
flag.StringVar(&symbolOptions.matcher, "symbol_matcher", "", "symbol matcher to use in benchmark")
|
|
flag.StringVar(&symbolOptions.style, "symbol_style", "", "symbol style to use in benchmark")
|
|
flag.BoolVar(&symbolOptions.printResults, "symbol_print_results", false, "whether to print symbol query results")
|
|
}
|
|
|
|
func TestBenchmarkSymbols(t *testing.T) {
|
|
if symbolOptions.workdir == "" {
|
|
t.Skip("-symbol_workdir not configured")
|
|
}
|
|
|
|
opts := stressTestOptions(symbolOptions.workdir)
|
|
conf := EditorConfig{}
|
|
if symbolOptions.matcher != "" {
|
|
conf.SymbolMatcher = &symbolOptions.matcher
|
|
}
|
|
if symbolOptions.style != "" {
|
|
conf.SymbolStyle = &symbolOptions.style
|
|
}
|
|
opts = append(opts, conf)
|
|
|
|
withOptions(opts...).run(t, "", func(t *testing.T, env *Env) {
|
|
// We can't Await in this test, since we have disabled hooks. Instead, run
|
|
// one symbol request to completion to ensure all necessary cache entries
|
|
// are populated.
|
|
symbols, err := env.Editor.Server.Symbol(env.Ctx, &protocol.WorkspaceSymbolParams{
|
|
Query: symbolOptions.query,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if symbolOptions.printResults {
|
|
fmt.Println("Results:")
|
|
for i := 0; i < len(symbols); i++ {
|
|
fmt.Printf("\t%d. %s (%s)\n", i, symbols[i].Name, symbols[i].ContainerName)
|
|
}
|
|
}
|
|
|
|
results := testing.Benchmark(func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
if _, err := env.Editor.Server.Symbol(env.Ctx, &protocol.WorkspaceSymbolParams{
|
|
Query: symbolOptions.query,
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
})
|
|
printBenchmarkResults(results)
|
|
})
|
|
}
|