// Copyright 2021 The Go 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 harnesses

import (
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
	"runtime"

	"golang.org/x/benchmarks/sweet/common"
	"golang.org/x/benchmarks/sweet/common/log"
)

type GVisor struct{}

func (h GVisor) CheckPrerequisites() error {
	if runtime.GOOS != "linux" {
		return fmt.Errorf("requires Linux")
	}
	return nil
}

func (h GVisor) Get(srcDir string) error {
	return gitCloneToCommit(
		srcDir,
		"https://github.com/google/gvisor",
		"go",
		"6392b0f3bea052af0de9d95677233dd9e442dbd5", // release-20210906.0-38-gb28bd31bb
	)
}

func (h GVisor) Build(cfg *common.Config, bcfg *common.BuildConfig) error {
	// Build benchmarking client which will handle a bunch of coordination.
	if err := cfg.GoTool().BuildPath(filepath.Join(bcfg.BenchDir), filepath.Join(bcfg.BinDir, "gvisor-bench")); err != nil {
		return err
	}

	// Build the runsc package in the repository. CGO_ENABLED must be 0.
	// See https://github.com/google/gvisor#using-go-get.
	cfg.BuildEnv.Env = cfg.BuildEnv.MustSet("CGO_ENABLED=0")
	bin := filepath.Join(bcfg.BinDir, "runsc")
	if err := cfg.GoTool().BuildPath(filepath.Join(bcfg.SrcDir, "runsc"), bin); err != nil {
		return err
	}

	// Make sure the binary has all the right permissions set.
	// See https://gvisor.dev/docs/user_guide/install/#install-directly
	log.CommandPrintf("chmod 755 %s", bin)
	if err := os.Chmod(bin, 0755); err != nil {
		return fmt.Errorf("failed to set permissions on runsc: %v", err)
	}
	return nil
}

func (h GVisor) Run(cfg *common.Config, rcfg *common.RunConfig) error {
	cmd := exec.Command(
		filepath.Join(rcfg.BinDir, "gvisor-bench"),
		append(rcfg.Args, []string{
			"-runsc", filepath.Join(rcfg.BinDir, "runsc"),
			"-assets-dir", rcfg.AssetsDir,
			"-tmp", rcfg.TmpDir,
		}...)...,
	)
	cmd.Env = cfg.ExecEnv.Collapse()
	cmd.Stdout = rcfg.Results
	cmd.Stderr = rcfg.Results
	log.TraceCommand(cmd, false)
	return cmd.Run()
}
