// Copyright 2020 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 artifactory

import (
	"encoding/json"
	"io/ioutil"
	"os"
	"path"
	"path/filepath"
	"testing"

	"github.com/google/go-cmp/cmp"
	"go.fuchsia.dev/fuchsia/tools/build"
)

func TestHostTestUploads(t *testing.T) {
	checkoutDir := t.TempDir()
	buildDir := filepath.Join(checkoutDir, "out", "build_dir")
	runtimeDepsRelPath := "runtime_deps.json"
	testSpecs := []build.TestSpec{
		{Test: build.Test{OS: "linux", Path: "foo"}},
		{Test: build.Test{OS: "something else"}},
		{Test: build.Test{OS: "mac", Path: "bar", RuntimeDepsFile: runtimeDepsRelPath}},
	}
	runtimeDeps := []string{"a", filepath.Join("b", "c.txt"), "a", testSpecs[0].Test.Path}
	runtimeDepsBytes, err := json.Marshal(runtimeDeps)
	if err != nil {
		t.Fatalf("failed to Marhsal(runtimeDeps): %v", err)
	}
	if err := ioutil.WriteFile(filepath.Join(buildDir, runtimeDepsRelPath), runtimeDepsBytes, 0o400); err != nil {
		t.Fatalf("failed to write runtimeDepsRelPath: %v", err)
	}
	// The regular files inside runtime deps, some of which are directories.
	runtimeDepFilePaths := []string{filepath.Join(runtimeDeps[0], "a.txt"), runtimeDeps[1], runtimeDeps[3]}
	for _, filePath := range runtimeDepFilePaths {
		absPath := filepath.Join(buildDir, filePath)
		parentDir := filepath.Dir(absPath)
		if err = os.MkdirAll(parentDir, 0o700); err != nil {
			t.Fatalf("os.MkdirAll(%s) failed: %v", parentDir, err)
		}
		if err = ioutil.WriteFile(absPath, []byte("\n"), 0o700); err != nil {
			t.Fatalf("ioutil.WriteFile(%s) failed: %v", absPath, err)
		}
	}

	uploads, err := HostTestUploads(testSpecs, buildDir, "namespace")
	if err != nil {
		t.Errorf("HostTestUploads() failed: %v", err)
	}
	wantUploads := []Upload{
		{
			Source:      filepath.Join(buildDir, testSpecs[0].Test.Path),
			Destination: path.Join("namespace", "out", "build_dir", testSpecs[0].Test.Path),
		},
		// testSpecs[1] is not a host test
		{
			Source:      filepath.Join(buildDir, testSpecs[2].Test.Path),
			Destination: path.Join("namespace", "out", "build_dir", testSpecs[2].Test.Path),
		},
	}
	// runtimeDepFilePaths[2] has the same path as testSpecs[0], so we don't expect to
	// see it twice.
	for _, filePath := range runtimeDepFilePaths[:2] {
		wantUploads = append(wantUploads, Upload{
			Source:      filepath.Join(buildDir, filePath),
			Destination: path.Join("namespace", "out", "build_dir", filePath),
		})
	}
	if diff := cmp.Diff(wantUploads, uploads); diff != "" {
		t.Errorf("HostTestUploads()=%v\nwant=%v\ndiff (-want +got):\n%s", uploads, wantUploads, diff)
	}
}
