blob: 8a6408bcd3cf664d2e51cd6049653267316f49b9 [file] [log] [blame]
// Copyright 2021 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package intel
import (
"context"
"time"
"go.chromium.org/tast-tests/cros/common/servo"
"go.chromium.org/tast-tests/cros/common/utils"
"go.chromium.org/tast-tests/cros/remote/powercontrol"
"go.chromium.org/tast/core/ctxutil"
"go.chromium.org/tast/core/testing"
"go.chromium.org/tast/core/testing/hwdep"
)
type sdCardTestParams struct {
powerMode string
cbmemSleepState int
iterCount int
}
func init() {
testing.AddTest(&testing.Test{
Func: SDCardFunctionality,
LacrosStatus: testing.LacrosVariantUnneeded,
Desc: "Verifies micro SD card functionality before and after performing, shutdown or reboot",
Contacts: []string{"intel.chrome.automation.team@intel.com", "pathan.jilani@intel.com"},
BugComponent: "b:157291", // ChromeOS > External > Intel
ServiceDeps: []string{"tast.cros.security.BootLockboxService"},
SoftwareDeps: []string{"chrome", "reboot"},
Vars: []string{"servo", "intel.sdCardDetectionName"},
HardwareDeps: hwdep.D(hwdep.ChromeEC()),
Attr: []string{"group:intel-usb-set1"},
Timeout: 15 * time.Minute,
Params: []testing.Param{{
Name: "shutdown",
Val: sdCardTestParams{
powerMode: "shutdown",
cbmemSleepState: 5, // cbmemSleepState must be 5 for coldboot validation.
iterCount: 1,
},
}, {
Name: "shutdown_stress",
Val: sdCardTestParams{
powerMode: "shutdown",
cbmemSleepState: 5, // cbmemSleepState must be 5 for coldboot validation.
iterCount: 10,
},
}, {
Name: "reboot",
Val: sdCardTestParams{
powerMode: "reboot",
cbmemSleepState: 0, // cbmemSleepState must be 0 for warmboot validation.
iterCount: 1,
},
}},
})
}
// SDCardFunctionality checks SD card functionality while performing shutdown and reboot.
// Pre-requisite: SD card must be inserted into DUT SD card slot.
func SDCardFunctionality(ctx context.Context, s *testing.State) {
cleanupCtx := ctx
ctx, cancel := ctxutil.Shorten(ctx, 3*time.Minute)
defer cancel()
sdCardName := s.RequiredVar("intel.sdCardDetectionName")
dut := s.DUT()
servoSpec, ok := s.Var("servo")
if !ok {
servoSpec = ""
}
pxy, err := servo.NewProxy(ctx, servoSpec, dut.KeyFile(), dut.KeyDir())
if err != nil {
s.Fatal("Failed to connect to servo: ", err)
}
defer pxy.Close(cleanupCtx)
testOpt := s.Param().(sdCardTestParams)
defer func(ctx context.Context) {
testing.ContextLog(ctx, "Performing cleanup")
if err := powercontrol.PowerOntoDUT(ctx, pxy, dut); err != nil {
s.Fatal("Failed to wake up DUT: ", err)
}
}(cleanupCtx)
// Performing chrome intital login.
if err := powercontrol.ChromeOSLogin(ctx, dut, s.RPCHint()); err != nil {
s.Fatal("Failed to login to chrome: ", err)
}
if err := utils.PlugSDCardViaServo(ctx, pxy); err != nil {
s.Fatal("Failed to plug SD card via servo: ", err)
}
defer utils.UnplugSDCardViaServo(cleanupCtx, pxy)
for i := 1; i <= testOpt.iterCount; i++ {
s.Logf("Iteration: %d/%d", i, testOpt.iterCount)
if err := utils.WaitForSDCardDetection(ctx, dut, sdCardName); err != nil {
s.Fatal("Failed to detect SD card: ", err)
}
if testOpt.powerMode == "shutdown" {
powerState := "S5"
if err := powercontrol.ShutdownAndWaitForPowerState(ctx, pxy, dut, powerState); err != nil {
s.Fatalf("Failed to shutdown and wait for %q powerstate: %v", powerState, err)
}
if err := powercontrol.PowerOntoDUT(ctx, pxy, dut); err != nil {
s.Fatal("Failed to wake up DUT: ", err)
}
}
if testOpt.powerMode == "reboot" {
if err := dut.Reboot(ctx); err != nil {
s.Fatal("Failed to reboot DUT: ", err)
}
waitCtx, cancel := context.WithTimeout(ctx, 1*time.Minute)
defer cancel()
if err := dut.WaitConnect(waitCtx); err != nil {
s.Fatal("Failed to wait connect DUT after reboot: ", err)
}
}
// Performing chrome login after powering on DUT from coldboot/warmboot.
if err := powercontrol.ChromeOSLogin(ctx, dut, s.RPCHint()); err != nil {
s.Fatalf("Failed to login to chrome after %q: %v", testOpt.powerMode, err)
}
if err := powercontrol.ValidatePrevSleepState(ctx, dut, testOpt.cbmemSleepState); err != nil {
s.Fatal("Failed to validate previous sleep state: ", err)
}
}
}