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)
			}
		}
	}
}
