| // Copyright 2023 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. |
| |
| //go:build go1.22 |
| |
| package main |
| |
| import ( |
| _ "embed" |
| "reflect" |
| "sort" |
| "testing" |
| |
| "golang.org/x/telemetry/internal/chartconfig" |
| "golang.org/x/telemetry/internal/telemetry" |
| ) |
| |
| func TestGenerate(t *testing.T) { |
| defer func(vers map[string][]string) { |
| versionsForTesting = vers |
| }(versionsForTesting) |
| versionsForTesting = map[string][]string{ |
| "golang.org/toolchain": {"v0.0.1-go1.21.0.linux-arm", "v0.0.1-go1.20.linux-arm"}, |
| "golang.org/x/tools/gopls": {"v0.13.0", "v0.14.0", "v0.15.0-pre.1", "v0.15.0"}, |
| } |
| const raw = ` |
| title: Editor Distribution |
| counter: gopls/editor:{emacs,vim,vscode,other} |
| description: measure editor distribution for gopls users. |
| type: partition |
| issue: https://go.dev/issue/61038 |
| program: golang.org/x/tools/gopls |
| version: v0.14.0 |
| ` |
| gcfgs, err := chartconfig.Parse([]byte(raw)) |
| if err != nil { |
| t.Fatal(err) |
| } |
| got, err := generate(gcfgs, padding{2, 1, 1, 2, 2}) |
| if err != nil { |
| t.Fatal(err) |
| } |
| want := telemetry.UploadConfig{ |
| GOOS: goos(), |
| GOARCH: goarch(), |
| SampleRate: SamplingRate, |
| GoVersion: []string{"go1.20", "go1.21.0", "devel"}, |
| Programs: []*telemetry.ProgramConfig{{ |
| Name: "golang.org/x/tools/gopls", |
| Versions: []string{ |
| "v0.14.0", |
| "v0.15.0-pre.1", |
| "v0.15.0", |
| "v0.15.1-pre.1", |
| "v0.15.1-pre.2", |
| "v0.15.1", |
| "v0.15.2-pre.1", |
| "v0.15.2-pre.2", |
| "v0.15.2", |
| "v0.16.0-pre.1", |
| "v0.16.0-pre.2", |
| "v0.16.0", |
| "v0.16.1-pre.1", |
| "v0.16.1-pre.2", |
| "v0.16.1", |
| "v1.0.0-pre.1", |
| "v1.0.0-pre.2", |
| "v1.0.0", |
| "v1.0.1-pre.1", |
| "v1.0.1-pre.2", |
| "v1.0.1", |
| "devel", // Added for go.dev/issues/62271, |
| }, |
| Counters: []telemetry.CounterConfig{{ |
| Name: "gopls/editor:{emacs,vim,vscode,other}", |
| Rate: 1.0, |
| }}, |
| }}, |
| } |
| if !reflect.DeepEqual(*got, want) { |
| if len(got.Programs) != len(want.Programs) { |
| t.Errorf("generate(): got %d programs, want %d", len(got.Programs), len(want.Programs)) |
| } else { |
| for i, gotp := range got.Programs { |
| want := *want.Programs[i] |
| if !reflect.DeepEqual(*gotp, want) { |
| t.Errorf("generate() program #%d =\n%+v\nwant:\n%+v", i, *gotp, want) |
| |
| } |
| } |
| } |
| t.Errorf("generate() =\n%+v\nwant:\n%+v", *got, want) |
| } |
| } |
| |
| func TestByGoVersion_Less(t *testing.T) { |
| got := []string{ |
| "go1.21.0", |
| "go1.21rc1", |
| "go1.9", |
| "go1.9rc1", |
| "go1.6", |
| "go1.6beta1", |
| } |
| want := []string{ |
| "go1.6beta1", |
| "go1.6", |
| "go1.9rc1", |
| "go1.9", |
| "go1.21rc1", |
| "go1.21.0", |
| } |
| sort.Sort(byGoVersion(got)) |
| if !reflect.DeepEqual(got, want) { |
| t.Errorf("sort.Sort(byGoVersion(got)) = %v, want %v", got, want) |
| } |
| } |
| |
| func TestContains(t *testing.T) { |
| baseline := func() *telemetry.UploadConfig { |
| return &telemetry.UploadConfig{ |
| GOOS: goos(), |
| GOARCH: goarch(), |
| GoVersion: []string{"go1.20", "go1.21.0"}, |
| Programs: []*telemetry.ProgramConfig{{ |
| Name: "golang.org/x/tools/gopls", |
| Versions: []string{ |
| "v0.14.0", |
| "v0.15.0-pre.1", |
| "v0.15.0", |
| "v0.15.1-pre.1", |
| "v0.15.1-pre.2", |
| "v0.15.1", |
| "devel", // Added for go.dev/issues/62271, |
| }, |
| Counters: []telemetry.CounterConfig{{ |
| Name: "gopls/editor:{emacs,vim,vscode,other}", |
| Rate: 1.0, |
| }}, |
| }}, |
| } |
| } |
| |
| tests := []struct { |
| name string |
| outerMut, innerMut func(*telemetry.UploadConfig) |
| want bool |
| }{ |
| { |
| "additional arch", |
| func(cfg *telemetry.UploadConfig) { cfg.GOARCH = append(cfg.GOARCH, "fake") }, |
| func(cfg *telemetry.UploadConfig) {}, |
| false, |
| }, |
| { |
| "additional program", |
| func(cfg *telemetry.UploadConfig) { cfg.Programs = append(cfg.Programs, new(telemetry.ProgramConfig)) }, |
| func(cfg *telemetry.UploadConfig) {}, |
| false, |
| }, |
| { |
| "additional counter", |
| func(cfg *telemetry.UploadConfig) { |
| cfg.Programs[0].Counters = append(cfg.Programs[0].Counters, telemetry.CounterConfig{}) |
| }, |
| func(cfg *telemetry.UploadConfig) {}, |
| false, |
| }, |
| { |
| "additional version", |
| func(cfg *telemetry.UploadConfig) { |
| cfg.Programs[0].Versions = append(cfg.Programs[0].Versions, "v99.99.99") |
| }, |
| func(cfg *telemetry.UploadConfig) {}, |
| true, |
| }, |
| } |
| |
| for _, test := range tests { |
| t.Run(test.name, func(t *testing.T) { |
| outer := baseline() |
| test.outerMut(outer) |
| inner := baseline() |
| test.innerMut(inner) |
| if got := contains(outer, inner); got != test.want { |
| t.Errorf("contains(...) = %v, want %v", got, test.want) |
| } |
| }) |
| } |
| } |
| |
| func TestPadVersions(t *testing.T) { |
| tests := []struct { |
| versions []string |
| prereleasePatterns []string |
| padding padding |
| want []string |
| }{ |
| { |
| nil, |
| []string{"pre.1"}, |
| padding{1, 1, 1, 1, 2}, |
| []string{ |
| "v0.0.1-pre.1", |
| "v0.0.1", |
| "v0.1.0-pre.1", |
| "v0.1.0", |
| "v1.0.0-pre.1", |
| "v1.0.0", |
| }, |
| }, |
| { |
| []string{"v0.8.3", "v0.9.1", "v0.9.2", "v1.0.0", "v1.0.1", "v1.0.2-pre.1", "v1.0.2-pre.2", "v1.0.2-pre.3"}, |
| []string{"pre.1", "pre.2", "pre.3", "pre.4"}, |
| padding{2, 1, 2, 2, 2}, |
| []string{ |
| "v0.8.3", |
| "v0.9.1", |
| "v0.9.2", |
| "v1.0.0", |
| "v1.0.1", |
| "v1.0.2-pre.1", |
| "v1.0.2-pre.2", |
| "v1.0.2-pre.3", |
| "v1.0.2", |
| "v1.0.3-pre.1", |
| "v1.0.3-pre.2", |
| "v1.0.3", |
| "v1.1.0-pre.1", |
| "v1.1.0-pre.2", |
| "v1.1.0", |
| "v1.1.1-pre.1", |
| "v1.1.1-pre.2", |
| "v1.1.1", |
| "v1.2.0-pre.1", |
| "v1.2.0-pre.2", |
| "v1.2.0", |
| "v2.0.0-pre.1", |
| "v2.0.0-pre.2", |
| "v2.0.0", |
| "v2.0.1-pre.1", |
| "v2.0.1-pre.2", |
| "v2.0.1", |
| "v2.1.0-pre.1", |
| "v2.1.0-pre.2", |
| "v2.1.0", |
| }, |
| }, |
| } |
| |
| for _, test := range tests { |
| got := padVersions(test.versions, test.prereleasePatterns, test.padding) |
| if !reflect.DeepEqual(got, test.want) { |
| t.Errorf("padVersions(%v, %v) =\n%v\nwant:\n%v", test.versions, test.prereleasePatterns, got, test.want) |
| } |
| } |
| } |