// Copyright 2015 The Vanadium 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_test

import (
	"fmt"
	"os"
	"strings"

	"v.io/v23/naming"
	"v.io/v23/services/build"
	"v.io/x/ref/test/v23tests"
)

//go:generate jiri test generate

func profileCommandOutput(i *v23tests.T, profileBin *v23tests.Binary, expectError bool, command, name, suffix string) string {
	labelArgs := []string{
		command, naming.Join(name, suffix),
	}
	labelCmd := profileBin.Start(labelArgs...)
	out := labelCmd.Output()
	err := labelCmd.Wait(os.Stdout, os.Stderr)
	if err != nil && !expectError {
		i.Fatalf("%s %q failed: %v\n%v", profileBin.Path(), strings.Join(labelArgs, " "), err, out)
	}
	if err == nil && expectError {
		i.Fatalf("%s %q did not fail when it should", profileBin.Path(), strings.Join(labelArgs, " "))
	}
	return strings.TrimSpace(out)
}

func putProfile(i *v23tests.T, profileBin *v23tests.Binary, name, suffix string) {
	putArgs := []string{
		"put", naming.Join(name, suffix),
	}
	profileBin.Start(putArgs...).WaitOrDie(os.Stdout, os.Stderr)
}

func removeProfile(i *v23tests.T, profileBin *v23tests.Binary, name, suffix string) {
	removeArgs := []string{
		"remove", naming.Join(name, suffix),
	}
	profileBin.Start(removeArgs...).WaitOrDie(os.Stdout, os.Stderr)
}

func V23TestProfileRepository(i *v23tests.T) {
	v23tests.RunRootMT(i, "--v23.tcp.address=127.0.0.1:0")

	// Start the profile repository.
	profileRepoName := "test-profile-repo"
	profileRepoStore := i.NewTempDir("")
	args := []string{
		"-name=" + profileRepoName, "-store=" + profileRepoStore,
		"-v23.tcp.address=127.0.0.1:0",
	}
	i.BuildV23Pkg("v.io/x/ref/services/profile/profiled").Start(args...)

	clientBin := i.BuildV23Pkg("v.io/x/ref/services/profile/profile")

	// Create a profile.
	const profile = "test-profile"
	putProfile(i, clientBin, profileRepoName, profile)

	// Retrieve the profile label and check it matches the
	// expected label.
	profileLabel := profileCommandOutput(i, clientBin, false, "label", profileRepoName, profile)
	if got, want := profileLabel, "example"; got != want {
		i.Fatalf("unexpected output: got %v, want %v", got, want)
	}

	// Retrieve the profile description and check it matches the
	// expected description.
	profileDesc := profileCommandOutput(i, clientBin, false, "description", profileRepoName, profile)
	if got, want := profileDesc, "Example profile to test the profile manager implementation."; got != want {
		i.Fatalf("unexpected output: got %v, want %v", got, want)
	}

	// Retrieve the profile specification and check it matches the
	// expected specification.
	profileSpec := profileCommandOutput(i, clientBin, false, "specification", profileRepoName, profile)
	if got, want := profileSpec, fmt.Sprintf(`profile.Specification{Label:"example", Description:"Example profile to test the profile manager implementation.", Arch:%d, Os:%d, Format:%d, Libraries:map[profile.Library]struct {}{profile.Library{Name:"foo", MajorVersion:"1", MinorVersion:"0"}:struct {}{}}}`, build.ArchitectureAmd64, build.OperatingSystemLinux, build.FormatElf); got != want {
		i.Fatalf("unexpected output: got %v, want %v", got, want)
	}

	// Remove the profile.
	removeProfile(i, clientBin, profileRepoName, profile)

	// Check that the profile no longer exists.
	profileCommandOutput(i, clientBin, true, "label", profileRepoName, profile)
	profileCommandOutput(i, clientBin, true, "description", profileRepoName, profile)
	profileCommandOutput(i, clientBin, true, "specification", profileRepoName, profile)
}
