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

import (
	"go.fuchsia.dev/fuchsia/tools/build"
	"go.fuchsia.dev/fuchsia/tools/testing/runtests"
)

// TestingOutputs are the outputs of a testing Swarming task that are analyzed by a FailureModeCheck.
type TestingOutputs struct {
	TestSummary           *runtests.TestSummary
	SwarmingSummary       *SwarmingTaskSummary
	SerialLogs            [][]byte
	SwarmingOutput        []byte
	SwarmingOutputPerTest []TestLog
	Syslogs               [][]byte
}

type logType string

// It's not necessary for correctness, but it makes the output easier for users if these
// strings match the file names that the recipes use for these logs. See the link above
// each constant for the relevant recipes code.
const (
	// https://fuchsia.googlesource.com/infra/recipes/+/cac1bc9f13f9349228e917dfae26bb85b1a290a8/recipe_modules/testing_requests/api.py#32
	serialLogType logType = "serial_log.txt"
	// https://fuchsia.googlesource.com/infra/recipes/+/cac1bc9f13f9349228e917dfae26bb85b1a290a8/recipe_modules/testing/api.py#22
	swarmingOutputType logType = "infra_and_test_std_and_klog.txt"
	// https://fuchsia.googlesource.com/infra/recipes/+/cac1bc9f13f9349228e917dfae26bb85b1a290a8/recipe_modules/testing_requests/api.py#33
	syslogType logType = "syslog.txt"
)

type logBlock struct {
	startString string
	endString   string
}

// FailureModeCheck checks whether a failure mode appears.
type FailureModeCheck interface {
	// Check analyzes TestingOutputs and returns true if the failure mode was detected.
	Check(*TestingOutputs) bool
	// Name is the name of this check.
	Name() string
	// DebugText is human-readable text intended to help debug a check failure.
	DebugText() string
	// OutputFiles are paths associated with this check. Often empty.
	OutputFiles() []string
	// IsFlake is true if the check is associated with a flaked test and
	// this check should also be reported as a flake instead of a failure.
	IsFlake() bool
	// Tags are the tags to append to the test result.
	Tags() []build.TestTag
}

// baseCheck provides default implementations of the FailureModeCheck interface.
// All types that inherit from baseCheck should override the Check() and Name() functions.
type baseCheck struct {
}

func (c baseCheck) Check(*TestingOutputs) bool {
	return true
}

func (c baseCheck) Name() string {
	return ""
}

func (c baseCheck) DebugText() string {
	return ""
}

func (c baseCheck) OutputFiles() []string {
	return []string{}
}

func (c baseCheck) IsFlake() bool {
	return false
}

func (c baseCheck) Tags() []build.TestTag {
	return nil
}
