// 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 main

import (
	"io/ioutil"
	"testing"

	"go.fuchsia.dev/jiri/jiritest"
	"go.fuchsia.dev/jiri/project"
)

func TestResolveProjects(t *testing.T) {
	_, fakeroot, cleanup := setupUniverse(t)
	defer cleanup()

	if err := fakeroot.UpdateUniverse(false); err != nil {
		t.Errorf("%v", err)
	}
	localProjects, err := project.LocalProjects(fakeroot.X, project.FastScan)
	projects, _, _, err := project.LoadManifestFile(fakeroot.X, fakeroot.X.JiriManifestFile(), localProjects, false)
	lockPath := fakeroot.X.Root + "/jiri.lock"
	resolveFlag.lockFilePath = lockPath
	resolveFlag.enablePackageLock = true
	resolveFlag.enableProjectLock = true
	args := []string{}
	if err := runResolve(fakeroot.X, args); err != nil {
		t.Errorf("resolve failed due to error %v", err)
	}
	data, err := ioutil.ReadFile(lockPath)
	if err != nil {
		t.Errorf("%+v", err)
	}

	projLocks, _, err := project.UnmarshalLockEntries(data)
	if err != nil {
		t.Errorf("parse generated lockfile failed due to error: %v", err)
	}

	if len(projects) != len(projLocks) {
		t.Errorf("expecting %v project locks, got %v", len(projects), len(projLocks))
	}

	for k, v := range projects {
		if projLock, ok := projLocks[project.ProjectLockKey(k)]; ok {
			if v.Revision != projLock.Revision {
				t.Errorf("expecting revision %q for project %q, got %q", v.Revision, v.Name, projLock.Revision)
			}
		} else {
			t.Errorf("project %q not found in lockfile", v.Name)
		}
	}
}

func TestResolvePackages(t *testing.T) {
	fakeroot, cleanup := jiritest.NewFakeJiriRoot(t)
	defer cleanup()
	// Replace the .jiri_manifest with package declarations
	pkgData := []byte(`
<manifest>
	<packages>
		<package name="gn/gn/${platform}"
             version="git_revision:bdb0fd02324b120cacde634a9235405061c8ea06"
             path="buildtools/{{.OS}}-x64"/>
    	<package name="infra/tools/luci/vpython/${platform}"
             version="git_revision:9a931a5307c46b16b1c12e01e8239d4a73830b89"
             path="buildtools/{{.OS}}-x64"/>
	</packages>
</manifest>
`)
	// Currently jiri is hard coded to only verify cipd packages for linux-amd64 and mac-amd64.
	// If new supported platform added, this test should be updated.
	expectedLocks := []project.PackageLock{
		{
			PackageName: "gn/gn/linux-amd64",
			VersionTag:  "git_revision:bdb0fd02324b120cacde634a9235405061c8ea06",
			InstanceID:  "0uGjKAZkJXPZjtYktgEwHiNbwsut_qRsk7ZCGGxi82IC",
		},
		{
			PackageName: "gn/gn/mac-amd64",
			VersionTag:  "git_revision:bdb0fd02324b120cacde634a9235405061c8ea06",
			InstanceID:  "rN2F641yR4Bj-H1q8OwC_RiqRpUYxy3hryzRfPER9wcC",
		},
		{
			PackageName: "infra/tools/luci/vpython/linux-amd64",
			VersionTag:  "git_revision:9a931a5307c46b16b1c12e01e8239d4a73830b89",
			InstanceID:  "uCjugbKg6wMIF6_H_BHECZQdcGRebhnZ6LzSodPHQ7AC",
		},
		{
			PackageName: "infra/tools/luci/vpython/mac-amd64",
			VersionTag:  "git_revision:9a931a5307c46b16b1c12e01e8239d4a73830b89",
			InstanceID:  "yAdok-mh5vfwq1vCAHprmejM9iE7R1t9Wn6RxrWmAAEC",
		},
	}
	if err := ioutil.WriteFile(fakeroot.X.JiriManifestFile(), pkgData, 0644); err != nil {
		t.Errorf("failed to write package information into .jiri_manifest due to error: %v", err)
	}
	lockPath := fakeroot.X.Root + "/jiri.lock"
	resolveFlag.lockFilePath = lockPath
	resolveFlag.enablePackageLock = true
	resolveFlag.enableProjectLock = true
	resolveFlag.enablePackageVersion = true
	args := []string{}
	if err := runResolve(fakeroot.X, args); err != nil {
		t.Errorf("resolve failed due to error: %v", err)
	}
	data, err := ioutil.ReadFile(lockPath)
	if err != nil {
		t.Errorf("read generated lockfile failed due to error: %v", err)
	}
	_, pkgLocks, err := project.UnmarshalLockEntries(data)
	if err != nil {
		t.Errorf("parse generated lockfile failed due to error: %v", err)
	}
	if len(expectedLocks) != len(pkgLocks) {
		t.Errorf("expecting %v locks, got %v", len(expectedLocks), len(pkgLocks))
	}
	for _, v := range expectedLocks {
		if pkgLock, ok := pkgLocks[v.Key()]; ok {
			if pkgLock != v {
				t.Errorf("expecting instance id %q for package %q, got %q", v.InstanceID, v.PackageName, pkgLock.InstanceID)
			}
		} else {
			t.Errorf("package %q not found in generated lockfile", v.PackageName)
		}
	}
}

func TestResolvePackagesPartial(t *testing.T) {
	fakeroot, cleanup := jiritest.NewFakeJiriRoot(t)
	defer cleanup()
	// Replace the .jiri_manifest with package declarations
	pkgData := []byte(`
<manifest>
	<packages>
		<package name="gn/gn/${platform}"
             version="git_revision:bdb0fd02324b120cacde634a9235405061c8ea06"
             path="buildtools/{{.OS}}-x64"/>
		<package name="infra/tools/luci/vpython/${platform}"
             version="git_revision:9a931a5307c46b16b1c12e01e8239d4a73830b89"
             path="buildtools/{{.OS}}-x64"/>
	</packages>
</manifest>
`)
	lockData := []byte(`
[
	{
		"package": "gn/gn/linux-amd64",
		"version": "git_revision:bdb0fd02324b120cacde634a9235405061c8ea06",
		"instance_id": "0uGjKAZkJXPZjtYktgEwHiNbwsut_qRsk7ZCGGxi82IC"
	},
	{
		"package": "gn/gn/mac-amd64",
		"version": "git_revision:bdb0fd02324b120cacde634a9235405061c8ea06",
		"instance_id": "rN2F641yR4Bj-H1q8OwC_RiqRpUYxy3hryzRfPER9wcC"
	},
	{
		"package": "infra/tools/luci/vpython/linux-amd64",
		"version": "git_revision:d7d9ae19b9ace8164177c38a3f0afd2f698c02a7",
		"instance_id": "uiXWd9vshjd1KMvVmdopnRnfAPbWpyvqJqsWn2Rcs9kC"
	},
	{
		"package": "infra/tools/luci/vpython/mac-amd64",
		"version": "git_revision:d7d9ae19b9ace8164177c38a3f0afd2f698c02a7",
		"instance_id": "DEbIUasQv4NGfzxj9b6gYzMrZKr9kQ6mF6ZX41a_9_8C"
	}
]
`)
	// Currently jiri is hard coded to only verify cipd packages for linux-amd64 and mac-amd64.
	// If new supported platform added, this test should be updated.
	expectedLocks := []project.PackageLock{
		{
			PackageName: "gn/gn/linux-amd64",
			VersionTag:  "git_revision:bdb0fd02324b120cacde634a9235405061c8ea06",
			InstanceID:  "0uGjKAZkJXPZjtYktgEwHiNbwsut_qRsk7ZCGGxi82IC",
		},
		{
			PackageName: "gn/gn/mac-amd64",
			VersionTag:  "git_revision:bdb0fd02324b120cacde634a9235405061c8ea06",
			InstanceID:  "rN2F641yR4Bj-H1q8OwC_RiqRpUYxy3hryzRfPER9wcC",
		},
		{
			PackageName: "infra/tools/luci/vpython/linux-amd64",
			VersionTag:  "git_revision:9a931a5307c46b16b1c12e01e8239d4a73830b89",
			InstanceID:  "uCjugbKg6wMIF6_H_BHECZQdcGRebhnZ6LzSodPHQ7AC",
		},
		{
			PackageName: "infra/tools/luci/vpython/mac-amd64",
			VersionTag:  "git_revision:9a931a5307c46b16b1c12e01e8239d4a73830b89",
			InstanceID:  "yAdok-mh5vfwq1vCAHprmejM9iE7R1t9Wn6RxrWmAAEC",
		},
	}
	if err := ioutil.WriteFile(fakeroot.X.JiriManifestFile(), pkgData, 0644); err != nil {
		t.Errorf("failed to write package information into .jiri_manifest due to error: %v", err)
	}
	lockPath := fakeroot.X.Root + "/jiri.lock"
	if err := ioutil.WriteFile(lockPath, lockData, 0644); err != nil {
		t.Errorf("failed to write lockfile information into jiri.lock due to error: %v", err)
	}
	resolveFlag.lockFilePath = lockPath
	resolveFlag.enablePackageLock = true
	resolveFlag.enableProjectLock = true
	resolveFlag.enablePackageVersion = true
	resolveFlag.fullResolve = false
	args := []string{}
	if err := runResolve(fakeroot.X, args); err != nil {
		t.Errorf("resolve failed due to error: %v", err)
	}
	data, err := ioutil.ReadFile(lockPath)
	if err != nil {
		t.Errorf("read generated lockfile failed due to error: %v", err)
	}
	_, pkgLocks, err := project.UnmarshalLockEntries(data)
	if err != nil {
		t.Errorf("parse generated lockfile failed due to error: %v", err)
	}
	if len(expectedLocks) != len(pkgLocks) {
		t.Errorf("expecting %v locks, got %v", len(expectedLocks), len(pkgLocks))
	}
	for _, v := range expectedLocks {
		if pkgLock, ok := pkgLocks[v.Key()]; ok {
			if pkgLock != v {
				t.Errorf("expecting instance id %q for package %q, got %q", v.InstanceID, v.PackageName, pkgLock.InstanceID)
			}
		} else {
			t.Errorf("package %q not found in generated lockfile", v.PackageName)
		}
	}
}
