blob: 46fe5bf3e03587df479d855f050d9b1494433280 [file] [log] [blame]
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)
}