// Copyright 2018 The Chromium OS 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 driver_test

import (
	"testing"

	"github.com/golang/protobuf/proto"
	"github.com/google/go-cmp/cmp"
	configpb "go.chromium.org/chromiumos/config/go/api"

	"chromiumos/tast/cmd/tast/internal/run/config"
	"chromiumos/tast/cmd/tast/internal/run/driver"
	"chromiumos/tast/cmd/tast/internal/run/runtest"
	frameworkprotocol "chromiumos/tast/framework/protocol"
	"chromiumos/tast/internal/protocol"
)

func TestDriver_GetDUTInfo(t *testing.T) {
	want := &protocol.DUTInfo{
		Features: &frameworkprotocol.DUTFeatures{
			Software: &frameworkprotocol.SoftwareFeatures{
				Available:   []string{"dep1", "dep2"},
				Unavailable: []string{"dep3"},
			},
			Hardware: &frameworkprotocol.HardwareFeatures{
				HardwareFeatures: &configpb.HardwareFeatures{
					Screen: &configpb.HardwareFeatures_Screen{
						PanelProperties: &configpb.Component_DisplayPanel_Properties{},
						TouchSupport:    configpb.HardwareFeatures_PRESENT,
					},
					Fingerprint: &configpb.HardwareFeatures_Fingerprint{
						Location: configpb.HardwareFeatures_Fingerprint_NOT_PRESENT,
					},
					EmbeddedController: &configpb.HardwareFeatures_EmbeddedController{
						Present: configpb.HardwareFeatures_PRESENT,
						EcType:  configpb.HardwareFeatures_EmbeddedController_EC_CHROME,
					},
				},
				DeprecatedDeviceConfig: &frameworkprotocol.DeprecatedDeviceConfig{
					Id: &frameworkprotocol.DeprecatedConfigId{
						Platform: "platform_id",
						Model:    "model_id",
						Brand:    "brand_id",
					},
				},
			},
		},
		OsVersion:                "octopus-release/R86-13312.0.2020_07_02_1108",
		DefaultBuildArtifactsUrl: "gs://chromeos-image-archive/octopus-release/R86-13312.0.2020_07_02_1108/",
	}
	extraUseFlags := []string{"use1", "use2"}

	env := runtest.SetUp(t, runtest.WithGetDUTInfo(func(req *protocol.GetDUTInfoRequest) (*protocol.GetDUTInfoResponse, error) {
		if diff := cmp.Diff(req.GetExtraUseFlags(), extraUseFlags); diff != "" {
			t.Errorf("ExtraUseFlags mismatch (-got +want):\n%s", diff)
		}
		return &protocol.GetDUTInfoResponse{DutInfo: want}, nil
	}))
	ctx := env.Context()
	cfg := env.Config(func(cfg *config.MutableConfig) {
		cfg.CheckTestDeps = true
		cfg.ExtraUSEFlags = extraUseFlags
	})

	drv, err := driver.New(ctx, cfg, cfg.Target(), "")
	if err != nil {
		t.Fatalf("driver.New failed: %v", err)
	}
	defer drv.Close(ctx)

	got, err := drv.GetDUTInfo(ctx)
	if err != nil {
		t.Fatalf("GetDUTInfo failed: %v", err)
	}

	if diff := cmp.Diff(got, want, cmp.Comparer(proto.Equal)); diff != "" {
		t.Errorf("DUTInfo mismatch (-got +want):\n%s", diff)
	}
}

func TestDriver_GetDUTInfo_NoCheckTestDeps(t *testing.T) {
	env := runtest.SetUp(t, runtest.WithGetDUTInfo(func(req *protocol.GetDUTInfoRequest) (*protocol.GetDUTInfoResponse, error) {
		t.Error("GetDUTInfo called unexpectedly")
		return &protocol.GetDUTInfoResponse{}, nil
	}))
	ctx := env.Context()
	cfg := env.Config(func(cfg *config.MutableConfig) {
		// With "never", the runner shouldn't be called and dependencies shouldn't be checked.
		cfg.CheckTestDeps = false
	})

	drv, err := driver.New(ctx, cfg, cfg.Target(), "")
	if err != nil {
		t.Fatalf("driver.New failed: %v", err)
	}
	defer drv.Close(ctx)

	if _, err := drv.GetDUTInfo(ctx); err != nil {
		t.Fatalf("GetDUTInfo failed: %v", err)
	}
}
