blob: 497aee5d81356ff85e028b657ca89e8442337b76 [file] [log] [blame] [edit]
package dkms
import (
"context"
"fmt"
"testing"
"cos.googlesource.com/cos/tools.git/src/pkg/fakes"
"cos.googlesource.com/cos/tools.git/src/pkg/fs"
"cos.googlesource.com/cos/tools.git/src/pkg/gcs"
)
func TestCompareVersions(t *testing.T) {
sortedVersions := []string{
"1.0",
"1.0.0",
"2.0.0",
"2.1.0",
"2.1.1",
"2.1.1-a",
"2.1.1-b",
"2.3.100",
"2.10.1",
"3.0.0",
}
for i := 0; i < len(sortedVersions); i++ {
for j := 0; j < len(sortedVersions); j++ {
a := sortedVersions[i]
b := sortedVersions[j]
comparison := CompareVersions(a, b)
if i < j && comparison >= 0 {
t.Fatalf("version %s should be less than %s", a, b)
} else if i == j && comparison != 0 {
t.Fatalf("version %s should be equal to %s", a, b)
} else if i > j && comparison <= 0 {
t.Fatalf("version %s should be greater than %s", a, b)
}
}
}
}
type compatibleVersionTestCase struct {
pkg Package
compatible bool
}
func compatibleVersionsTestCases(trees *Trees) []compatibleVersionTestCase {
return []compatibleVersionTestCase {
{
pkg: Package {
Name: "mypackage",
Version: "0.0.1",
KernelVersion: "6.6.59",
Arch: "x86_64",
BuildId: "12345.0.0",
Board: "lakitu",
Trees: trees,
},
compatible: true,
},
{
pkg: Package {
Name: "mypackage",
Version: "0.1.0",
KernelVersion: "6.6.59",
Arch: "x86_64",
BuildId: "12345.0.0",
Board: "lakitu",
Trees: trees,
},
compatible: true,
},
{
pkg: Package {
Name: "mypackage-2", // different name
Version: "1.3.0",
KernelVersion: "6.6.59",
Arch: "x86_64",
BuildId: "12345.0.0",
Board: "lakitu",
Trees: trees,
},
compatible: false,
},
{
pkg: Package {
Name: "mypackage",
Version: "1.3.1",
KernelVersion: "6.6.60", // different kernel version
Arch: "x86_64",
BuildId: "12345.0.0",
Board: "lakitu",
Trees: trees,
},
compatible: false,
},
{
pkg: Package {
Name: "mypackage",
Version: "1.3.4",
KernelVersion: "6.6.59",
Arch: "arm64", // different arch
BuildId: "12345.0.0",
Board: "lakitu",
Trees: trees,
},
compatible: false,
},
{
pkg: Package {
Name: "mypackage",
Version: "1.3.5",
KernelVersion: "6.6.59",
Arch: "x86_64",
BuildId: "12346.0.0", // different build id
Board: "lakitu",
Trees: trees,
},
compatible: false,
},
{
pkg: Package {
Name: "mypackage",
Version: "1.3.6",
KernelVersion: "6.6.59",
Arch: "x86_64",
BuildId: "12345.0.0",
Board: "lakitu-2", // different board
Trees: trees,
},
compatible: false,
},
{
pkg: Package {
Name: "mypackage",
Version: "1.1.0",
KernelVersion: "6.6.59",
Arch: "x86_64",
BuildId: "12345.0.0",
Board: "lakitu",
Trees: trees,
},
compatible: true,
},
}
}
func TestCompatiblePackageVersions(t *testing.T) {
srcDir := t.TempDir()
trees := &Trees {
Dkms: t.TempDir(),
Source: srcDir,
}
testCases := compatibleVersionsTestCases(trees)
options := Options {}
for _, testCase := range testCases {
err := fs.CopyDir("testdata/source-tree/mymodule-1.0", fmt.Sprintf("%s/%s-%s", srcDir, testCase.pkg.Name, testCase.pkg.Version), 0777)
if err != nil {
t.Fatalf("failed to create package sources: %v", err)
}
if err := Add(&testCase.pkg, &options); err != nil {
t.Fatalf("error adding package: %v", err)
}
}
containsString := func (strings []string, s string) bool {
for _, t := range strings {
if s == t {
return true
}
}
return false
}
testPackage := testCases[0].pkg
compatibleVersions, err := CompatiblePackageVersions(&testPackage)
if err != nil {
t.Fatalf("%v", err)
}
for _, testCase := range testCases {
if testCase.compatible {
if !containsString(compatibleVersions, testCase.pkg.Version) {
t.Fatalf("expected version %s to be in compatible versions list", testCase.pkg.Version)
}
} else {
if containsString(compatibleVersions, testCase.pkg.Version) {
t.Fatalf("expected version %s not to be in compatible versions list", testCase.pkg.Version)
}
}
}
}
func TestCachedCompatiblePackageVersions(t *testing.T) {
srcDir := t.TempDir()
trees := &Trees {
Dkms: t.TempDir(),
Source: srcDir,
}
testCases := compatibleVersionsTestCases(trees)
fakeGCS := fakes.GCSForTest(t)
fakeGCS.LogMissing = false
cache := gcs.NewGCSBucket(fakeGCS.Client, "test", "test/prefix/")
options := Options {
Upload: true,
}
for _, testCase := range testCases {
err := fs.CopyDir("testdata/source-tree/mymodule-1.0", fmt.Sprintf("%s/%s-%s", srcDir, testCase.pkg.Name, testCase.pkg.Version), 0777)
if err != nil {
t.Fatalf("failed to create package sources: %v", err)
}
if err := CachedAdd(context.Background(), &testCase.pkg, cache, &options); err != nil {
t.Fatalf("error adding package: %v", err)
}
}
containsString := func (strings []string, s string) bool {
for _, t := range strings {
if s == t {
return true
}
}
return false
}
testPackage := testCases[0].pkg
compatibleVersions, err := CachedCompatiblePackageVersions(context.Background(), &testPackage, cache)
if err != nil {
t.Fatalf("%v", err)
}
for _, testCase := range testCases {
if testCase.compatible {
if !containsString(compatibleVersions, testCase.pkg.Version) {
t.Fatalf("expected version %s to be in compatible versions list", testCase.pkg.Version)
}
} else {
if containsString(compatibleVersions, testCase.pkg.Version) {
t.Fatalf("expected version %s not to be in compatible versions list", testCase.pkg.Version)
}
}
}
}