// Copyright 2019 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 runtests

import (
	"path"
	"reflect"
	"testing"
)

type fakeViewer struct {
	s           TestSummary
	allSinks    []string
	copiedFiles map[string]string
}

func (v fakeViewer) summary(_ string) (*TestSummary, error) {
	return &v.s, nil
}

func (v fakeViewer) getAllDataSinks(remote string) ([]string, error) {
	return v.allSinks, nil
}

func (v fakeViewer) copyFile(remote, local string) error {
	v.copiedFiles[remote] = local
	return nil
}

func (v fakeViewer) removeAll(_ string) error {
	return nil
}

func (v fakeViewer) close() error {
	return nil
}

func TestGetAllDataSinks(t *testing.T) {
	expectedSinks := []DataSink{
		{
			Name: "sink1",
			File: "sink1",
		},
		{
			Name: "sink2",
			File: "sink2",
		},
	}
	viewer := fakeViewer{allSinks: []string{"sink1", "sink2"}, copiedFiles: map[string]string{}}
	copier := DataSinkCopier{viewer: viewer}
	dataSinks, err := copier.GetAllDataSinks("REMOTE_DIR")
	if err != nil {
		t.Fatalf("failed to get data sinks: %s", err)
	} else if !reflect.DeepEqual(dataSinks, expectedSinks) {
		t.Errorf("got data sinks %v, expected %v", dataSinks, expectedSinks)
	}
}

func TestCopyDataSinks(t *testing.T) {
	expectedSinks := map[string]DataSinkReference{
		"foo_test": {
			DataSinkMap{
				"sink": {
					{
						Name: "sink1",
						File: "a/b/c/sink1",
					},
					{
						Name: "sink2",
						File: "a/d/e/sink2",
					},
				},
			}, "REMOTE_DIR",
		},
	}
	summary := TestSummary{
		Tests: []TestDetails{
			{
				Name:      "foo_test",
				DataSinks: expectedSinks["foo_test"].Sinks,
			},
		},
	}

	viewer := fakeViewer{s: summary, copiedFiles: map[string]string{}}
	copier := DataSinkCopier{viewer: viewer}
	dataSinks, err := copier.GetReferences("REMOTE_DIR")
	if err != nil {
		t.Fatalf("failed to get data sinks: %s", err)
	} else if !reflect.DeepEqual(dataSinks, expectedSinks) {
		t.Errorf("got data sinks %v, expected %v", dataSinks, expectedSinks)
	}
	var sinkRefs []DataSinkReference
	for _, ref := range dataSinks {
		sinkRefs = append(sinkRefs, ref)
	}
	_, err = copier.Copy(sinkRefs, "LOCAL_DIR")
	if err != nil {
		t.Fatalf("failed to copy data sinks: %s", err)
	}

	for _, ref := range dataSinks {
		for _, sink := range ref.Sinks["sink"] {
			src := path.Join("REMOTE_DIR", sink.File)
			expectedDest := path.Join("LOCAL_DIR", sink.File)
			actualDest, ok := viewer.copiedFiles[src]
			if !ok {
				t.Errorf("sink %q was not copied", sink.File)
			}
			if expectedDest != actualDest {
				t.Errorf("sink %q was copied to the wrong destination:\nexpected: %s\nactual %s",
					sink.File, expectedDest, actualDest)
			}
		}
	}
}
