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

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"
	"time"

	"v.io/jiri"
	"v.io/x/devtools/internal/test"
)

const (
	defaultMojoTestTimeout = 10 * time.Minute
)

// vanadiumMojoDiscoveryTest runs the tests for the Vanadium Mojo Discovery service.
func vanadiumMojoDiscoveryTest(jirix *jiri.X, testName string, _ ...Opt) (*test.Result, error) {
	testDir := filepath.Join(jirix.Root, "release", "mojo", "discovery")
	if r, err := runMakefileTest(jirix, testName, testDir, "test", nil, []string{"v23:mojo", "v23:dart"}, defaultMojoTestTimeout); err != nil {
		return r, err
	}
	// For android, just make sure that everything builds.
	initExtraDeps := func() (func() error, error) {
		s := jirix.NewSeq()

		args := []string{"-v", "profile-v23", "install", "--target=arm-android", "v23:mojo"}
		fmt.Fprintf(jirix.Stdout(), "Running: jiri %s\n", strings.Join(args, " "))
		if err := s.Last("jiri", args...); err != nil {
			return nil, fmt.Errorf("jiri %v: %v", strings.Join(args, " "), err)
		}
		fmt.Fprintf(jirix.Stdout(), "jiri %v: success\n", strings.Join(args, " "))

		args = []string{"profile", "update"}
		if err := s.Capture(os.Stdout, os.Stderr).Last("jiri", args...); err != nil {
			return nil, fmt.Errorf("jiri %v: %v", strings.Join(args, " "), err)
		}
		fmt.Fprintf(jirix.Stdout(), "jiri %v: success\n", strings.Join(args, " "))

		return func() error { return nil }, nil
	}
	return runMakefileTestWithExtraDeps(jirix, testName, testDir, "build", map[string]string{"ANDROID": "1"}, []string{"v23:android", "v23:mojo", "v23:dart"}, initExtraDeps, defaultMojoTestTimeout)
}

// vanadiumMojoSyncbaseTest runs the tests for the Vanadium Mojo Syncbase service.
func vanadiumMojoSyncbaseTest(jirix *jiri.X, testName string, _ ...Opt) (*test.Result, error) {
	testDir := filepath.Join(jirix.Root, "release", "mojo", "syncbase")
	return runMakefileTest(jirix, testName, testDir, "test", nil, []string{"v23:mojo", "v23:dart"}, defaultMojoTestTimeout)
}

// vanadiumMojoV23ProxyUnitTest runs the unit tests for the vanadium <-> mojo "v23proxy"
func vanadiumMojoV23ProxyUnitTest(jirix *jiri.X, testName string, _ ...Opt) (*test.Result, error) {
	testDir := filepath.Join(jirix.Root, "release", "mojo", "v23proxy")
	return runMakefileTest(jirix, testName, testDir, "test-unit", nil, []string{"v23:mojo", "v23:dart"}, defaultMojoTestTimeout)
}

// vanadiumMojoV23ProxyIntegrationTest runs the integration tests for the vanadium <-> mojo "v23proxy"
func vanadiumMojoV23ProxyIntegrationTest(jirix *jiri.X, testName string, _ ...Opt) (*test.Result, error) {
	testDir := filepath.Join(jirix.Root, "release", "mojo", "v23proxy")
	return runMakefileTest(jirix, testName, testDir, "test-integration", nil, []string{"v23:mojo", "v23:dart"}, defaultMojoTestTimeout)
}

// vanadiumMojoV23ProxyGoOnlyIntegrationTest runs the integration tests for the vanadium <-> mojo "v23proxy". This test does not test dart.
func vanadiumMojoV23ProxyGoOnlyIntegrationTest(jirix *jiri.X, testName string, _ ...Opt) (*test.Result, error) {
	testDir := filepath.Join(jirix.Root, "release", "mojo", "v23proxy")
	return runMakefileTest(jirix, testName, testDir, "test-integration-go-go", nil, []string{"v23:mojo"}, defaultMojoTestTimeout)
}
