blob: 666a5ce6c24d02e5ef7b7060ad3a6c2e9139c6b7 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package ufspb
import (
"testing"
. "github.com/smartystreets/goconvey/convey"
ufspb "infra/unifiedfleet/api/v1/models"
chromeosLab "infra/unifiedfleet/api/v1/models/chromeos/lab"
)
func TestValidateHostnames(t *testing.T) {
Convey("ValidateHostnames", t, func() {
Convey("Different hostnames - successful path", func() {
const h1, h2 = "h1", "h2"
err := validateHostnames([]string{h1, h2}, "")
So(err, ShouldBeNil)
})
Convey("Duplicated hostnames - returns error", func() {
const h1, h2 = "h1", "h1"
err := validateHostnames([]string{h1, h2}, "")
So(err, ShouldNotBeNil)
})
Convey("Empty hostname - returns error", func() {
const h1, h2 = "", "h1"
err := validateHostnames([]string{h1, h2}, "")
So(err, ShouldNotBeNil)
})
Convey("Nil input - successful path", func() {
err := validateHostnames(nil, "")
So(err, ShouldBeNil)
})
})
}
func TestValidateUpdateDeviceRecoveryDataRequest(t *testing.T) {
Convey("ValidateDutId", t, func() {
Convey("ChromeOS device - successful path", func() {
req := &UpdateDeviceRecoveryDataRequest{
DeviceId: "deviceId-1",
ResourceType: UpdateDeviceRecoveryDataRequest_RESOURCE_TYPE_CHROMEOS_DEVICE,
DeviceRecoveryData: &UpdateDeviceRecoveryDataRequest_Chromeos{
Chromeos: &ChromeOsRecoveryData{
DutState: &chromeosLab.DutState{
Id: &chromeosLab.ChromeOSDeviceID{
Value: "deviceId-1",
},
},
},
},
}
err := req.validateDutId()
So(err, ShouldBeNil)
})
Convey("ChromeOS device - empty device Id - returns error", func() {
req := &UpdateDeviceRecoveryDataRequest{
DeviceId: "",
ResourceType: UpdateDeviceRecoveryDataRequest_RESOURCE_TYPE_CHROMEOS_DEVICE,
DeviceRecoveryData: &UpdateDeviceRecoveryDataRequest_Chromeos{
Chromeos: &ChromeOsRecoveryData{
DutState: &chromeosLab.DutState{
Id: &chromeosLab.ChromeOSDeviceID{
Value: "deviceId-1",
},
},
},
},
}
err := req.validateDutId()
So(err, ShouldNotBeNil)
})
Convey("ChromeOS device - invalid device Id - returns error", func() {
req := &UpdateDeviceRecoveryDataRequest{
DeviceId: "",
ResourceType: UpdateDeviceRecoveryDataRequest_RESOURCE_TYPE_CHROMEOS_DEVICE,
DeviceRecoveryData: &UpdateDeviceRecoveryDataRequest_Chromeos{
Chromeos: &ChromeOsRecoveryData{
DutState: &chromeosLab.DutState{
Id: &chromeosLab.ChromeOSDeviceID{
Value: "deviceId-foo",
},
},
},
},
}
err := req.validateDutId()
So(err, ShouldNotBeNil)
})
Convey("ChromeOS device - missing dut state - returns error", func() {
req := &UpdateDeviceRecoveryDataRequest{
DeviceId: "",
ResourceType: UpdateDeviceRecoveryDataRequest_RESOURCE_TYPE_CHROMEOS_DEVICE,
DeviceRecoveryData: &UpdateDeviceRecoveryDataRequest_Chromeos{
Chromeos: &ChromeOsRecoveryData{},
},
}
err := req.validateDutId()
So(err, ShouldNotBeNil)
})
Convey("ChromeOS device - mismatching device and dut stats Ids - returns error", func() {
req := &UpdateDeviceRecoveryDataRequest{
DeviceId: "deviceId-1",
ResourceType: UpdateDeviceRecoveryDataRequest_RESOURCE_TYPE_CHROMEOS_DEVICE,
DeviceRecoveryData: &UpdateDeviceRecoveryDataRequest_Chromeos{
Chromeos: &ChromeOsRecoveryData{
DutState: &chromeosLab.DutState{
Id: &chromeosLab.ChromeOSDeviceID{
Value: "deviceId-2",
},
},
},
},
}
err := req.validateDutId()
So(err, ShouldNotBeNil)
})
Convey("Attached device - successful path", func() {
req := &UpdateDeviceRecoveryDataRequest{
DeviceId: "deviceId-1",
ResourceType: UpdateDeviceRecoveryDataRequest_RESOURCE_TYPE_ATTACHED_DEVICE,
}
err := req.validateDutId()
So(err, ShouldBeNil)
})
Convey("Attached device - invalid device Id - returns error", func() {
req := &UpdateDeviceRecoveryDataRequest{
DeviceId: "deviceId-***",
ResourceType: UpdateDeviceRecoveryDataRequest_RESOURCE_TYPE_ATTACHED_DEVICE,
}
err := req.validateDutId()
So(err, ShouldNotBeNil)
})
})
}
func TestValidateUpdateTestDataRequest(t *testing.T) {
Convey("ValidateDutId", t, func() {
Convey("ChromeOS device - successful path", func() {
req := &UpdateTestDataRequest{
DeviceId: "deviceId-1",
Hostname: "hostname_1",
DeviceData: &UpdateTestDataRequest_ChromeosData{
ChromeosData: &UpdateTestDataRequest_ChromeOs{
DutState: &chromeosLab.DutState{
Id: &chromeosLab.ChromeOSDeviceID{
Value: "deviceId-2",
},
},
},
},
}
err := req.Validate()
So(err, ShouldBeNil)
So(req.GetDeviceId(), ShouldEqual, req.GetChromeosData().GetDutState().GetId().GetValue())
So(req.GetHostname(), ShouldEqual, req.GetChromeosData().GetDutState().GetHostname())
})
Convey("ChromeOS device - empty device Id - returns error", func() {
req := &UpdateTestDataRequest{
DeviceId: "",
Hostname: "",
}
err := req.Validate()
So(err, ShouldNotBeNil)
})
Convey("ChromeOS device - empty hostname - returns error", func() {
req := &UpdateTestDataRequest{
DeviceId: "device-1",
Hostname: "",
}
err := req.Validate()
So(err, ShouldNotBeNil)
})
Convey("ChromeOS device - missing dut state - returns error", func() {
req := &UpdateTestDataRequest{
DeviceId: "device-1",
Hostname: "hostname-1",
DeviceData: &UpdateTestDataRequest_ChromeosData{
ChromeosData: &UpdateTestDataRequest_ChromeOs{},
},
}
err := req.Validate()
So(err, ShouldNotBeNil)
})
Convey("Android device - successful path", func() {
req := &UpdateTestDataRequest{
DeviceId: "device-1",
Hostname: "hostname-1",
DeviceData: &UpdateTestDataRequest_AndroidData{
AndroidData: &UpdateTestDataRequest_Android{},
},
}
err := req.Validate()
So(err, ShouldBeNil)
})
})
}
func TestCreateAssetValidate(t *testing.T) {
Convey("CreateAssetRequest Validate", t, func() {
Convey("Valid request - successful path", func() {
req := &CreateAssetRequest{
Asset: &ufspb.Asset{
Name: "assets/asset-1",
Location: &ufspb.Location{
Rack: "rack",
Zone: ufspb.Zone_ZONE_CHROMEOS1,
},
},
}
err := req.Validate()
So(err, ShouldBeNil)
})
Convey("Empty asset - returns error", func() {
req := &CreateAssetRequest{}
err := req.Validate()
So(err, ShouldNotBeNil)
})
Convey("Empty asset name - returns error", func() {
req := &CreateAssetRequest{
Asset: &ufspb.Asset{
Location: &ufspb.Location{
Rack: "rack",
Zone: ufspb.Zone_ZONE_CHROMEOS1,
},
},
}
err := req.Validate()
So(err, ShouldNotBeNil)
})
Convey("Invalid asset name format - returns error", func() {
req := &CreateAssetRequest{
Asset: &ufspb.Asset{
Name: "asset-1",
Location: &ufspb.Location{
Rack: "rack",
Zone: ufspb.Zone_ZONE_CHROMEOS1,
},
},
}
err := req.Validate()
So(err, ShouldNotBeNil)
})
Convey("Invalid asset name characters - returns error", func() {
req := &CreateAssetRequest{
Asset: &ufspb.Asset{
Name: "assets/asset-@#%^&",
Location: &ufspb.Location{
Rack: "rack",
Zone: ufspb.Zone_ZONE_CHROMEOS1,
},
},
}
err := req.Validate()
So(err, ShouldNotBeNil)
})
Convey("Missing location - returns error", func() {
req := &CreateAssetRequest{
Asset: &ufspb.Asset{
Name: "assets/asset-1",
},
}
err := req.Validate()
So(err, ShouldNotBeNil)
})
Convey("Location zone unspecified - returns error", func() {
req := &CreateAssetRequest{
Asset: &ufspb.Asset{
Name: "assets/asset-1",
Location: &ufspb.Location{
Rack: "rack",
Zone: ufspb.Zone_ZONE_UNSPECIFIED,
},
},
}
err := req.Validate()
So(err, ShouldNotBeNil)
})
Convey("Location rack empty - returns error", func() {
req := &CreateAssetRequest{
Asset: &ufspb.Asset{
Name: "assets/asset-1",
Location: &ufspb.Location{
Rack: "",
Zone: ufspb.Zone_ZONE_CHROMEOS1,
},
},
}
err := req.Validate()
So(err, ShouldNotBeNil)
})
})
}