blob: 3e8afd56990001a16a032aeb980689d74e5c3dbe [file] [log] [blame]
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package chromeos_version
import (
"io/ioutil"
"os"
"path/filepath"
"reflect"
"testing"
"go.chromium.org/chromiumos/infra/go/internal/assert"
"go.chromium.org/chromiumos/infra/go/internal/cmd"
"go.chromium.org/chromiumos/infra/go/internal/git"
)
func TestVersionsEqual(t *testing.T) {
a := VersionInfo{
ChromeBranch: 1,
BuildNumber: 2,
BranchBuildNumber: 3,
PatchNumber: 4,
}
b := a
b.BranchBuildNumber = 5
assert.Assert(t, VersionsEqual(a, a))
assert.Assert(t, !VersionsEqual(a, b))
}
func assertVersionEqual(t *testing.T, v VersionInfo, expected []int) {
assert.IntsEqual(t, v.ChromeBranch, expected[0])
assert.IntsEqual(t, v.BuildNumber, expected[1])
assert.IntsEqual(t, v.BranchBuildNumber, expected[2])
assert.IntsEqual(t, v.PatchNumber, expected[3])
}
func TestGetVersionInfoFromRepo_success(t *testing.T) {
VersionFileProjectPath = "chromeos_version.sh"
versionInfo, err := GetVersionInfoFromRepo("test_data")
assert.NilError(t, err)
assertVersionEqual(t, versionInfo, []int{77, 12302, 1, 0})
}
const versionFileContents string = `
if [ -z "${FLAGS_version}" ]; then
# Release Build number.
# Increment by 1 for every release build.
CHROMEOS_BUILD=12302
# Release Branch number.
# Increment by 1 for every release build on a branch.
# Reset to 0 when increasing release build number.
CHROMEOS_BRANCH=1
# Patch number.
# Increment by 1 in case a non-scheduled branch release build is necessary.
# Reset to 0 when increasing branch number.
CHROMEOS_PATCH=0
# Official builds must set CHROMEOS_OFFICIAL=1.
if [ ${CHROMEOS_OFFICIAL:-0} -ne 1 ]; then
# For developer builds, overwrite CHROMEOS_PATCH with a date string
# for use by auto-updater.
CHROMEOS_PATCH=$(date +%Y_%m_%d_%H%M)
fi
# Version string. Not indentied to appease bash.
CHROMEOS_VERSION_STRING=\
"${CHROMEOS_BUILD}.${CHROMEOS_BRANCH}.${CHROMEOS_PATCH}"
else
CHROMEOS_BUILD=$(echo "${FLAGS_version}" | cut -f 1 -d ".")
CHROMEOS_BRANCH=$(echo "${FLAGS_version}" | cut -f 2 -d ".")
CHROMEOS_PATCH=$(echo "${FLAGS_version}" | cut -f 3 -d ".")
CHROMEOS_VERSION_STRING="${FLAGS_version}"
fi
# Major version for Chrome.
CHROME_BRANCH=77
`
func TestParseVersionInfo_success(t *testing.T) {
versionInfo, err := ParseVersionInfo([]byte(versionFileContents))
assert.NilError(t, err)
assertVersionEqual(t, versionInfo, []int{77, 12302, 1, 0})
}
func TestParseVersionInfo_error(t *testing.T) {
_, err := ParseVersionInfo([]byte("foo"))
assert.ErrorContains(t, err, "did not find field")
}
func TestIncrementVersion_ChromeBranch(t *testing.T) {
VersionFileProjectPath = "chromeos_version.sh"
versionInfo, err := GetVersionInfoFromRepo("test_data")
versionInfo.IncrementVersion(ChromeBranch)
assert.NilError(t, err)
assertVersionEqual(t, versionInfo, []int{78, 12302, 1, 0})
}
func TestIncrementVersion_Build(t *testing.T) {
VersionFileProjectPath = "chromeos_version.sh"
versionInfo, err := GetVersionInfoFromRepo("test_data")
versionInfo.IncrementVersion(Build)
assert.NilError(t, err)
assertVersionEqual(t, versionInfo, []int{77, 12303, 0, 0})
}
func TestIncrementVersion_Branch(t *testing.T) {
VersionFileProjectPath = "chromeos_version.sh"
versionInfo, err := GetVersionInfoFromRepo("test_data")
versionInfo.IncrementVersion(Branch)
assert.NilError(t, err)
assertVersionEqual(t, versionInfo, []int{77, 12302, 2, 0})
}
func TestIncrementVersion_Branch_nonzero(t *testing.T) {
VersionFileProjectPath = "chromeos_version.sh"
versionInfo, err := GetVersionInfoFromRepo("test_data")
versionInfo.PatchNumber = 1
versionInfo.IncrementVersion(Branch)
assert.NilError(t, err)
assertVersionEqual(t, versionInfo, []int{77, 12302, 2, 0})
}
func TestIncrementVersion_Patch(t *testing.T) {
VersionFileProjectPath = "chromeos_version.sh"
versionInfo, err := GetVersionInfoFromRepo("test_data")
versionInfo.IncrementVersion(Patch)
assert.NilError(t, err)
assertVersionEqual(t, versionInfo, []int{77, 12302, 1, 1})
}
func TestVersionString(t *testing.T) {
var v VersionInfo
v.BuildNumber = 123
v.BranchBuildNumber = 1
v.PatchNumber = 0
assert.StringsEqual(t, v.VersionString(), "123.1.0")
}
func TestVersionComponents(t *testing.T) {
var v VersionInfo
v.BuildNumber = 123
v.BranchBuildNumber = 1
v.PatchNumber = 0
components := []int{123, 1, 0}
if !reflect.DeepEqual(v.VersionComponents(), components) {
t.Fatalf("version mismatch: got %+v, expected %+v", v.VersionComponents(), components)
}
}
func TestStrippedVersionString(t *testing.T) {
var v VersionInfo
v.BuildNumber = 123
assert.StringsEqual(t, v.StrippedVersionString(), "123")
v.BranchBuildNumber = 1
assert.StringsEqual(t, v.StrippedVersionString(), "123.1")
}
func TestUpdateVersionFile_noVersionFile(t *testing.T) {
var v VersionInfo
err := v.UpdateVersionFile()
assert.ErrorContains(t, err, "associated version file")
}
func TestUpdateVersionFile_success(t *testing.T) {
tmpDir := "repotest_tmp_dir"
tmpDir, err := ioutil.TempDir("", tmpDir)
defer os.RemoveAll(tmpDir)
assert.NilError(t, err)
tmpPath := filepath.Join(tmpDir, "chromeos_version.sh")
// We're modifying chromeos_version.sh, so need to copy it to a tmp file.
fileContents, err := ioutil.ReadFile("test_data/chromeos_version.sh")
assert.NilError(t, err)
err = ioutil.WriteFile(tmpPath, fileContents, 0644)
assert.NilError(t, err)
// Set git mock expectations.
git.CommandRunnerImpl = &cmd.FakeCommandRunner{
ExpectedDir: tmpDir,
ExpectedCmd: []string{"git", "checkout", "-B", pushBranch},
}
// Call UpdateVersionFile.
var v VersionInfo
v.ChromeBranch = 1337
v.BuildNumber = 0xdead
v.BranchBuildNumber = 0xbeef
v.PatchNumber = 0
v.VersionFile = tmpPath
err = v.UpdateVersionFile()
assert.NilError(t, err)
// Read version info back in from file, make sure it's correct.
versionInfo, err := GetVersionInfoFromRepo(tmpDir)
assert.NilError(t, err)
if !reflect.DeepEqual(versionInfo, v) {
t.Fatalf("version mismatch: got %+v, expected %+v", v, versionInfo)
}
}