// Copyright 2019 The Fuchsia 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 testsharder

import (
	"encoding/json"
	"testing"

	"go.fuchsia.dev/fuchsia/tools/build"
)

func deepCopy(x, y interface{}) error {
	b, err := json.Marshal(x)
	if err != nil {
		return err
	}
	return json.Unmarshal(b, y)
}

func TestValidation(t *testing.T) {
	platforms := []build.DimensionSet{
		{
			DeviceType: "qemu",
			CPU:        "arm64",
		},
		{
			DeviceType: "nuc",
			CPU:        "x64",
		},
		{
			OS:  "Fuchsia",
			CPU: "x64",
		},
	}

	validate := func(t *testing.T, specs []build.TestSpec, expectSuccess bool) {
		if err := ValidateTests(specs, platforms); (err == nil) != expectSuccess {
			t.Fatal(err)
		}
	}

	genericTestSpec := build.TestSpec{
		Test: build.Test{
			Name:       "//src/foo:tests",
			Path:       "path/to/test",
			OS:         "fuchsia",
			PackageURL: "URL",
		},
		Envs: []build.Environment{
			{
				Dimensions: build.DimensionSet{
					OS: "Fuchsia",
				},
			},
		},
	}

	// Returns a deep copy of genericTestSpec.
	getSpec := func(t *testing.T) build.TestSpec {
		var spec build.TestSpec
		if err := deepCopy(&genericTestSpec, &spec); err != nil {
			t.Fatalf("failed to make a deep copy: %v", err)
		}
		return spec
	}

	t.Run("test with no name is invalid", func(t *testing.T) {
		spec := getSpec(t)
		spec.Name = ""
		validate(t, []build.TestSpec{spec}, false)
	})
	t.Run("test with no install path nor command nor URL is invalid", func(t *testing.T) {
		spec := getSpec(t)
		spec.Path = ""
		spec.PackageURL = ""
		validate(t, []build.TestSpec{spec}, false)
	})
	t.Run("test with no OS is invalid", func(t *testing.T) {
		spec := getSpec(t)
		spec.OS = ""
		validate(t, []build.TestSpec{spec}, false)
	})
	t.Run("test with a non-matching environment is invalid", func(t *testing.T) {
		spec := getSpec(t)
		spec.Envs = []build.Environment{
			{
				Dimensions: build.DimensionSet{
					OS: "Mac",
				},
			},
		}
		validate(t, []build.TestSpec{spec}, false)
	})
	t.Run("test with no environments is valid", func(t *testing.T) {
		spec := getSpec(t)
		spec.Envs = nil
		validate(t, []build.TestSpec{spec}, true)
	})
	t.Run("test with a matching environment is valid", func(t *testing.T) {
		spec := getSpec(t)
		validate(t, []build.TestSpec{spec}, true)
	})
}
