// 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 (
	"crypto/tls"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/http/cookiejar"
	"strings"
	"time"

	"v.io/x/ref/test/v23tests"
)

//go:generate v23 test generate .

const urlRE = "^(https://.*)$"

func seekBlessings(i *v23tests.T, principal *v23tests.Binary, httpAddr string) {
	args := []string{
		"seekblessings",
		"--browser=false",
		fmt.Sprintf("--from=%s/auth/google", httpAddr),
		"-v=3",
	}
	inv := principal.Start(args...)
	// Reproduce the sleep that was present in the shell test to see if
	// this allows the test to pass on macjenkins.
	// TODO(sjr): I suspect the failure is caused by race conditions
	// exacerbated by our new binary caching.
	time.Sleep(10 * time.Second)
	line := inv.ExpectSetEventuallyRE(urlRE)[0][1]
	// Scan the output of "principal seekblessings", looking for the
	// URL that can be used to retrieve the blessings.
	transport := &http.Transport{
		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
	}
	jar, err := cookiejar.New(&cookiejar.Options{})
	if err != nil {
		i.Fatalf("failed to create a cookie jar: %v", err)
	}
	client := &http.Client{
		Jar:       jar,
		Transport: transport,
	}
	resp, err := client.Get(line)
	if err != nil {
		i.Fatalf("Get(%q) failed: %v", line, err)
	}
	output, err := ioutil.ReadAll(resp.Body)
	resp.Body.Close()
	if err != nil {
		i.Fatalf("ReadAll() failed: %v", err)
	}
	if want := "Received blessings"; !strings.Contains(string(output), want) {
		i.Fatalf("failed to seek blessings: %v", string(output))
	}
}

func V23TestIdentityServer(i *v23tests.T) {
	v23tests.RunRootMT(i, "--v23.tcp.address=127.0.0.1:0")
	// Start identityd:
	//
	// identityd must have credentials that recognize the root mounttable.
	// In production, the two share a common root certificate and thus
	// recognize each other. The same is done here, i.Principal()
	// wields the root key.
	identityd := i.BuildV23Pkg("v.io/x/ref/services/identity/internal/identityd_test")
	creds, err := i.Shell().NewChildCredentials("identityd")
	if err != nil {
		i.Fatal(err)
	}
	identityd = identityd.WithStartOpts(identityd.StartOpts().WithCustomCredentials(creds))
	httpAddr := identityd.Start(
		"-v23.tcp.address=127.0.0.1:0",
		"-http-addr=127.0.0.1:0").ExpectVar("HTTP_ADDR")

	// Use the principal tool to seekblessings.
	// This tool will not run with any credentials: Its whole purpose is to "seek" them!
	principal := i.BuildGoPkg("v.io/x/ref/cmd/principal")
	// Test an initial seekblessings call.
	seekBlessings(i, principal, httpAddr)
	// Test that a subsequent call succeeds with the same
	// credentials. This means that the blessings and principal from the
	// first call works correctly.
	// TODO(ashankar): Does anyone recall what was the intent here? Running
	// the tool twice doesn't seem to help?
	seekBlessings(i, principal, httpAddr)
}
