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  }