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