golang.org/x/build@v0.0.0-20240506185731-218518f32b70/internal/task/version_test.go (about) 1 // Copyright 2023 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 task 6 7 import ( 8 "context" 9 "flag" 10 "fmt" 11 "strings" 12 "testing" 13 14 "golang.org/x/build/gerrit" 15 "golang.org/x/build/internal/workflow" 16 ) 17 18 var flagRunVersionTest = flag.Bool("run-version-test", false, "run version test, which will submit CLs to go.googlesource.com/scratch. Must have a Gerrit cookie in gitcookies.") 19 20 func TestGetNextVersionLive(t *testing.T) { 21 if !testing.Verbose() || flag.Lookup("test.run").Value.String() != "^TestGetNextVersionLive$" { 22 t.Skip("not running a live test requiring manual verification if not explicitly requested with go test -v -run=^TestGetNextVersionLive$") 23 } 24 25 cl := gerrit.NewClient("https://go-review.googlesource.com", nil) 26 tasks := &VersionTasks{ 27 Gerrit: &RealGerritClient{Client: cl}, 28 GoProject: "go", 29 } 30 ctx := &workflow.TaskContext{ 31 Context: context.Background(), 32 Logger: &testLogger{t, ""}, 33 } 34 35 var out strings.Builder 36 currentMajor, _, err := tasks.GetCurrentMajor(ctx) 37 if err != nil { 38 t.Fatal(err) 39 } 40 for _, tc := range [...]struct { 41 major int 42 kind ReleaseKind 43 }{ 44 {currentMajor + 1, KindMajor}, // Next major release. 45 {currentMajor + 1, KindRC}, // Next RC. 46 {currentMajor + 1, KindBeta}, // Next beta. 47 {currentMajor, KindMinor}, // Current minor only. 48 {currentMajor - 1, KindMinor}, // Previous minor only. 49 } { 50 v, err := tasks.GetNextVersion(ctx, tc.major, tc.kind) 51 if err != nil { 52 t.Fatal(err) 53 } 54 fmt.Fprintf(&out, "tasks.GetNextVersion(ctx, %d, %#v) = %q\n", tc.major, tc.kind, v) 55 } 56 // It's hard to check correctness automatically. 57 t.Logf("manually verify results:\n%s", &out) 58 } 59 60 func TestGetNextVersion(t *testing.T) { 61 tasks := &VersionTasks{ 62 Gerrit: &versionsClient{ 63 tags: []string{ 64 "go1.3beta1", "go1.3beta2", "go1.3rc1", "go1.3", "go1.3.1", "go1.3.2", "go1.3.3", 65 "go1.4beta1", "go1.4beta2", "go1.4rc1", "go1.4.0", "go1.4.1", 66 "go1.5beta1", "go1.5rc1", 67 }, 68 }, 69 GoProject: "go", 70 } 71 ctx := &workflow.TaskContext{ 72 Context: context.Background(), 73 Logger: &testLogger{t, ""}, 74 } 75 for _, tc := range [...]struct { 76 name string 77 major int 78 kind ReleaseKind 79 want string 80 }{ 81 {major: 5, kind: KindBeta, want: "go1.5beta2", name: "next beta"}, 82 {major: 5, kind: KindRC, want: "go1.5rc2", name: "next RC"}, 83 {major: 5, kind: KindMajor, want: "go1.5.0", name: "next major"}, 84 {major: 4, kind: KindMinor, want: "go1.4.2", name: "next current minor"}, 85 {major: 3, kind: KindMinor, want: "go1.3.4", name: "next previous minor"}, 86 } { 87 t.Run(tc.name, func(t *testing.T) { 88 got, err := tasks.GetNextVersion(ctx, tc.major, tc.kind) 89 if err != nil { 90 t.Fatal(err) 91 } 92 if got != tc.want { 93 t.Errorf("got %v, want %v", got, tc.want) 94 } 95 }) 96 } 97 } 98 99 func TestGetDevelVersion(t *testing.T) { 100 if testing.Short() { 101 t.Skip("skipping test that uses internet in short mode") 102 } 103 104 cl := gerrit.NewClient("https://go-review.googlesource.com", nil) 105 tasks := &VersionTasks{ 106 Gerrit: &RealGerritClient{Client: cl}, 107 GoProject: "go", 108 } 109 ctx := &workflow.TaskContext{ 110 Context: context.Background(), 111 Logger: &testLogger{t, ""}, 112 } 113 got, err := tasks.GetDevelVersion(ctx) 114 if err != nil { 115 t.Fatal(err) 116 } 117 if got < 22 { 118 t.Errorf("GetDevelVersion: got %d, want 22 or higher", got) 119 } 120 } 121 122 type versionsClient struct { 123 tags []string 124 GerritClient 125 } 126 127 func (c *versionsClient) ListTags(ctx context.Context, project string) ([]string, error) { 128 return c.tags, nil 129 } 130 131 func TestVersion(t *testing.T) { 132 if !*flagRunVersionTest { 133 t.Skip("Not enabled by flags") 134 } 135 cl := gerrit.NewClient("https://go-review.googlesource.com", gerrit.GitCookiesAuth()) 136 tasks := &VersionTasks{ 137 Gerrit: &RealGerritClient{Client: cl}, 138 GoProject: "scratch", 139 } 140 ctx := &workflow.TaskContext{ 141 Context: context.Background(), 142 Logger: &testLogger{t, ""}, 143 } 144 145 changeID, err := tasks.CreateAutoSubmitVersionCL(ctx, "master", "go1.2.3", nil, "VERSION file content") 146 if err != nil { 147 t.Fatal(err) 148 } 149 _, err = tasks.AwaitCL(ctx, changeID, "") 150 if strings.Contains(err.Error(), "trybots failed") { 151 t.Logf("Trybots failed, as they usually do: %v. Abandoning CL and ending test.", err) 152 if err := cl.AbandonChange(ctx, changeID, "test is done"); err != nil { 153 t.Fatal(err) 154 } 155 return 156 } 157 158 changeID, err = tasks.Gerrit.CreateAutoSubmitChange(ctx, gerrit.ChangeInput{ 159 Project: "scratch", 160 Branch: "master", 161 Subject: "Clean up VERSION", 162 }, nil, map[string]string{"VERSION": ""}) 163 if err != nil { 164 t.Fatalf("cleaning up VERSION: %v", err) 165 } 166 if _, err := tasks.AwaitCL(ctx, changeID, ""); err != nil { 167 t.Fatalf("cleaning up VERSION: %v", err) 168 } 169 }