// Copyright 2020 The Fuchsia 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 testsharder

import "go.fuchsia.dev/fuchsia/tools/build"

// RunAlgorithm descibes how to run a test using the test's `Runs` field.
type RunAlgorithm string

const (
	// KeepGoing means to run the test for as many times as `Runs`
	// regardless of the result of each test run.
	KeepGoing RunAlgorithm = "KEEP_GOING"
	// StopOnFailure means to try the test up to `Runs` times
	// and to break on the first failure.
	StopOnFailure RunAlgorithm = "STOP_ON_FAILURE"
	// StopOnSuccess means to try the test up to `Runs` times
	// and to break on the first success.
	StopOnSuccess RunAlgorithm = "STOP_ON_SUCCESS"
)

// Test is a struct used to hold information about a build.Test and how to run it.
type Test struct {
	build.Test

	// Runs is the number of times this test should be run.
	Runs int `json:"runs,omitempty"`

	// RunAlgorithm determines how `Runs` will be used to run the test.
	RunAlgorithm RunAlgorithm `json:"run_algorithm,omitempty"`

	// RealmLabel is an optional arg passed to run-test-component to specify a realm
	RealmLabel string `json:"realm_label,omitempty"`

	// TimeoutSecs is the duration for which to keep running a test.
	TimeoutSecs int `json:"timeout,omitempty"`
}

func (t *Test) applyModifier(m TestModifier) {
	if m.MaxAttempts > 0 {
		t.Runs = m.MaxAttempts
		if t.Runs > 1 {
			t.RunAlgorithm = StopOnSuccess
		} else {
			t.RunAlgorithm = ""
		}
	}
}

func (t *Test) minRequiredRuns() int {
	if t.RunAlgorithm == KeepGoing || t.RunAlgorithm == StopOnFailure {
		return t.Runs
	}
	return 1
}
