| package chrome_branch |
| |
| import ( |
| "context" |
| "fmt" |
| "strings" |
| "testing" |
| |
| "github.com/stretchr/testify/require" |
| "go.skia.org/infra/go/deepequal/assertdeep" |
| "go.skia.org/infra/go/mockhttpclient" |
| "go.skia.org/infra/go/testutils/unittest" |
| ) |
| |
| const ( |
| fakeData = `[ |
| { |
| "os": "linux", |
| "versions": [ |
| { |
| "channel": "beta", |
| "current_version": "81.0.4044.17", |
| "true_branch": "4044" |
| }, |
| { |
| "channel": "stable", |
| "current_version": "80.0.3987.100", |
| "true_branch": "3987_137" |
| } |
| ] |
| } |
| ]` |
| ) |
| |
| func dummyBranches() *Branches { |
| return &Branches{ |
| Master: &Branch{ |
| Milestone: 82, |
| Number: 0, |
| Ref: RefMaster, |
| }, |
| Beta: &Branch{ |
| Milestone: 81, |
| Number: 4044, |
| Ref: fmt.Sprintf(refTmplRelease, 4044), |
| }, |
| Stable: &Branch{ |
| Milestone: 80, |
| Number: 3987, |
| Ref: fmt.Sprintf(refTmplRelease, 3987), |
| }, |
| } |
| } |
| |
| func TestBranchCopy(t *testing.T) { |
| unittest.SmallTest(t) |
| |
| b := dummyBranches() |
| assertdeep.Copy(t, b.Beta, b.Beta.Copy()) |
| } |
| |
| func TestBranchesCopy(t *testing.T) { |
| unittest.SmallTest(t) |
| |
| b := dummyBranches() |
| assertdeep.Copy(t, b, b.Copy()) |
| } |
| |
| func TestBranchValidate(t *testing.T) { |
| unittest.SmallTest(t) |
| |
| test := func(fn func(*Branch), expectErr string) { |
| b := dummyBranches().Beta |
| fn(b) |
| err := b.Validate() |
| if expectErr == "" { |
| require.NoError(t, err) |
| } else { |
| require.NotNil(t, err) |
| require.True(t, strings.Contains(err.Error(), expectErr)) |
| } |
| } |
| |
| // OK. |
| test(func(b *Branch) {}, "") |
| test(func(b *Branch) { |
| b.Ref = RefMaster |
| b.Number = 0 |
| }, "") |
| |
| // Not OK. |
| test(func(b *Branch) { |
| b.Milestone = 0 |
| }, "Milestone is required") |
| test(func(b *Branch) { |
| b.Number = 0 |
| }, "Number is required") |
| test(func(b *Branch) { |
| b.Ref = RefMaster |
| }, "Number must be zero for master branch") |
| } |
| |
| func TestBranchesValidate(t *testing.T) { |
| unittest.SmallTest(t) |
| |
| test := func(fn func(*Branches), expectErr string) { |
| b := dummyBranches() |
| fn(b) |
| err := b.Validate() |
| if expectErr == "" { |
| require.NoError(t, err) |
| } else { |
| require.NotNil(t, err) |
| require.True(t, strings.Contains(err.Error(), expectErr), err) |
| } |
| } |
| |
| // OK. |
| test(func(b *Branches) {}, "") |
| |
| // Missing branch. |
| test(func(b *Branches) { |
| b.Beta = nil |
| }, "Beta branch is missing") |
| test(func(b *Branches) { |
| b.Stable = nil |
| }, "Stable branch is missing") |
| test(func(b *Branches) { |
| b.Master = nil |
| }, "Master branch is missing") |
| |
| // Each Branch should be validated. |
| test(func(b *Branches) { |
| b.Beta.Milestone = 0 |
| }, "Milestone is required") |
| test(func(b *Branches) { |
| b.Stable.Number = 0 |
| }, "Number is required") |
| test(func(b *Branches) { |
| b.Master.Number = 42 |
| }, "Number must be zero for master branch.") |
| } |
| |
| func TestGet(t *testing.T) { |
| unittest.SmallTest(t) |
| |
| ctx := context.Background() |
| urlmock := mockhttpclient.NewURLMock() |
| c := urlmock.Client() |
| |
| // Everything okay. |
| urlmock.MockOnce(jsonUrl, mockhttpclient.MockGetDialogue([]byte(fakeData))) |
| b, err := Get(ctx, c) |
| require.NoError(t, err) |
| assertdeep.Equal(t, dummyBranches(), b) |
| |
| // OS missing altogether. |
| urlmock.MockOnce(jsonUrl, mockhttpclient.MockGetDialogue([]byte("[]"))) |
| b, err = Get(ctx, c) |
| require.Nil(t, b) |
| require.NotNil(t, err) |
| require.True(t, strings.Contains(err.Error(), "No branches found for OS")) |
| |
| // Beta channel is missing. |
| urlmock.MockOnce(jsonUrl, mockhttpclient.MockGetDialogue([]byte(strings.ReplaceAll(fakeData, branchBeta, "dev")))) |
| b, err = Get(ctx, c) |
| require.Nil(t, b) |
| require.NotNil(t, err) |
| require.True(t, strings.Contains(err.Error(), "Beta branch is missing"), err) |
| |
| // Missing number. |
| urlmock.MockOnce(jsonUrl, mockhttpclient.MockGetDialogue([]byte(strings.ReplaceAll(fakeData, "true_branch", "nope")))) |
| b, err = Get(ctx, c) |
| require.Nil(t, b) |
| require.NotNil(t, err) |
| require.True(t, strings.Contains(err.Error(), "invalid branch number"), err) |
| |
| // Missing milestone. |
| urlmock.MockOnce(jsonUrl, mockhttpclient.MockGetDialogue([]byte(strings.ReplaceAll(fakeData, "current_version", "nope")))) |
| b, err = Get(ctx, c) |
| require.Nil(t, b) |
| require.NotNil(t, err) |
| require.True(t, strings.Contains(err.Error(), "invalid milestone"), err) |
| } |