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

import (
	"testing"

	buildbucketpb "go.chromium.org/luci/buildbucket/proto"
)

func mockBuild(revision string) *buildbucketpb.Build {
	return &buildbucketpb.Build{
		Input: &buildbucketpb.Build_Input{
			GitilesCommit: &buildbucketpb.GitilesCommit{
				Id: revision,
			},
		},
	}
}

func revisionAccessor(build *buildbucketpb.Build) interface{} {
	return build.Input.GitilesCommit.Id
}

func TestGetLastKnownGoodRevision(t *testing.T) {
	t.Parallel()
	var tests = []struct {
		builds      [][]*buildbucketpb.Build
		gitilesRef  string
		f           accessorFunc
		expected    interface{}
		expectedErr bool
	}{
		{
			builds:      [][]*buildbucketpb.Build{},
			gitilesRef:  "",
			f:           revisionAccessor,
			expected:    nil,
			expectedErr: true,
		},
		{
			builds: [][]*buildbucketpb.Build{
				{
					mockBuild("b"),
					mockBuild("c"),
					mockBuild("d"),
					mockBuild("e"),
				},
			},
			gitilesRef:  "",
			f:           revisionAccessor,
			expected:    "b",
			expectedErr: false,
		},
		{
			builds: [][]*buildbucketpb.Build{
				{
					mockBuild("b"),
					mockBuild("c"),
					mockBuild("d"),
					mockBuild("e"),
					mockBuild("f"),
					mockBuild("h"),
				},
				{
					mockBuild("a"),
					mockBuild("b"),
					mockBuild("c"),
					mockBuild("e"),
					mockBuild("f"),
				},
				{
					mockBuild("c"),
					mockBuild("e"),
					mockBuild("f"),
					mockBuild("i"),
				},
				{
					mockBuild("b"),
					mockBuild("e"),
					mockBuild("f"),
					mockBuild("g"),
					mockBuild("i"),
				},
			},
			gitilesRef:  "",
			f:           revisionAccessor,
			expected:    "e",
			expectedErr: false,
		},
		{
			builds: [][]*buildbucketpb.Build{
				{
					mockBuild("b"),
					mockBuild("c"),
					mockBuild("d"),
				},
				{
					mockBuild("a"),
					mockBuild("b"),
					mockBuild("c"),
				},
				{
					mockBuild("c"),
					mockBuild("i"),
				},
				{
					mockBuild("e"),
					mockBuild("f"),
					mockBuild("h"),
				},
			},
			gitilesRef:  "",
			f:           revisionAccessor,
			expected:    nil,
			expectedErr: true,
		},
	}
	for _, test := range tests {
		resp, err := getLastKnownGood(test.builds, test.gitilesRef, test.f)
		if err == nil {
			if test.expectedErr {
				t.Errorf("expected error, got nil")
			}
		} else if !test.expectedErr {
			t.Errorf("got unexpected err %v", err)
		}
		if resp != test.expected {
			t.Fatalf("got %s, expected %s", resp, test.expected)
		}
	}
}
