blob: ff2ac9de675a0dd9aa1e34b44f25a47bb456c76d [file] [log] [blame]
// Copyright 2020 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 deviceconfig
import (
"bytes"
"fmt"
"io/ioutil"
"testing"
"github.com/golang/protobuf/jsonpb"
. "github.com/smartystreets/goconvey/convey"
"go.chromium.org/chromiumos/config/go/payload"
"go.chromium.org/chromiumos/infra/proto/go/device"
)
func TestParseConfigBundle(t *testing.T) {
Convey("Test config bundle parsing", t, func() {
var payloads payload.ConfigBundleList
unmarshaller := &jsonpb.Unmarshaler{AllowUnknownFields: false}
// Refer to https://chromium.googlesource.com/chromiumos/config/+/refs/heads/master/test/project/fake/fake/config.star for unittest check
b, err := ioutil.ReadFile("test_device_config_v2.jsonproto")
So(err, ShouldBeNil)
buf, err := fixFieldMaskForConfigBundleList([]byte(b))
So(err, ShouldBeNil)
err = unmarshaller.Unmarshal(bytes.NewBuffer(buf), &payloads)
So(err, ShouldBeNil)
Convey("Happy path", func() {
So(payloads.GetValues(), ShouldHaveLength, 1)
dcs := parseConfigBundle(payloads.GetValues()[0])
// 5 sku-less device configs & 6 real device configs
So(dcs, ShouldHaveLength, 11)
for _, dc := range dcs {
So(dc.GetId().GetPlatformId().GetValue(), ShouldEqual, "FAKE_PROGRAM")
modelWithSku := fmt.Sprintf("%s:%s", dc.GetId().GetModelId().GetValue(), dc.GetId().GetVariantId().GetValue())
switch modelWithSku {
case "FAKE-REF-DESIGN:", "PROJECT-A:", "PROJECT-B:", "PROJECT-C:", "PROJECT-WL:":
// These are sku-less device config, every config entry is nil by default
So(dc.GetFormFactor(), ShouldEqual, device.Config_FORM_FACTOR_UNSPECIFIED)
So(dc.GetPower(), ShouldEqual, device.Config_POWER_SUPPLY_UNSPECIFIED)
So(dc.GetHardwareFeatures(), ShouldBeNil)
So(dc.GetStorage(), ShouldEqual, device.Config_STORAGE_UNSPECIFIED)
So(dc.GetCpu(), ShouldEqual, device.Config_ARCHITECTURE_UNDEFINED)
case "FAKE-REF-DESIGN:2147483647":
So(dc.GetFormFactor(), ShouldEqual, device.Config_FORM_FACTOR_CLAMSHELL)
So(dc.GetPower(), ShouldEqual, device.Config_POWER_SUPPLY_BATTERY)
So(dc.GetHardwareFeatures(), ShouldResemble, []device.Config_HardwareFeature{
device.Config_HARDWARE_FEATURE_BLUETOOTH,
device.Config_HARDWARE_FEATURE_INTERNAL_DISPLAY,
device.Config_HARDWARE_FEATURE_STYLUS,
device.Config_HARDWARE_FEATURE_TOUCHPAD,
device.Config_HARDWARE_FEATURE_TOUCHSCREEN,
device.Config_HARDWARE_FEATURE_DETACHABLE_KEYBOARD,
device.Config_HARDWARE_FEATURE_FINGERPRINT,
})
So(dc.GetStorage(), ShouldEqual, device.Config_STORAGE_MMC)
So(dc.GetCpu(), ShouldEqual, device.Config_ARCHITECTURE_UNDEFINED)
case "FAKE-REF-DESIGN:0":
fallthrough
case "FAKE-REF-DESIGN:2":
So(dc.GetFormFactor(), ShouldEqual, device.Config_FORM_FACTOR_CLAMSHELL)
So(dc.GetPower(), ShouldEqual, device.Config_POWER_SUPPLY_BATTERY)
So(dc.GetPower(), ShouldEqual, device.Config_POWER_SUPPLY_BATTERY)
So(dc.GetHardwareFeatures(), ShouldResemble, []device.Config_HardwareFeature{
device.Config_HARDWARE_FEATURE_BLUETOOTH,
device.Config_HARDWARE_FEATURE_INTERNAL_DISPLAY,
device.Config_HARDWARE_FEATURE_STYLUS,
device.Config_HARDWARE_FEATURE_TOUCHPAD,
device.Config_HARDWARE_FEATURE_TOUCHSCREEN,
device.Config_HARDWARE_FEATURE_DETACHABLE_KEYBOARD,
})
So(dc.GetStorage(), ShouldEqual, device.Config_STORAGE_SSD)
So(dc.GetCpu(), ShouldEqual, device.Config_ARCHITECTURE_UNDEFINED)
So(dc.GetEc(), ShouldEqual, device.Config_EC_CHROME)
case "PROJECT-A:32":
So(dc.GetFormFactor(), ShouldEqual, device.Config_FORM_FACTOR_CONVERTIBLE)
So(dc.GetPower(), ShouldEqual, device.Config_POWER_SUPPLY_BATTERY)
So(dc.GetHardwareFeatures(), ShouldResemble, []device.Config_HardwareFeature{
device.Config_HARDWARE_FEATURE_BLUETOOTH,
device.Config_HARDWARE_FEATURE_INTERNAL_DISPLAY,
device.Config_HARDWARE_FEATURE_STYLUS,
device.Config_HARDWARE_FEATURE_TOUCHPAD,
device.Config_HARDWARE_FEATURE_TOUCHSCREEN,
device.Config_HARDWARE_FEATURE_DETACHABLE_KEYBOARD,
device.Config_HARDWARE_FEATURE_FINGERPRINT,
})
So(dc.GetStorage(), ShouldEqual, device.Config_STORAGE_MMC)
So(dc.GetCpu(), ShouldEqual, device.Config_ARCHITECTURE_UNDEFINED)
case "PROJECT-B:33":
So(dc.GetFormFactor(), ShouldEqual, device.Config_FORM_FACTOR_CONVERTIBLE)
So(dc.GetPower(), ShouldEqual, device.Config_POWER_SUPPLY_BATTERY)
So(dc.GetHardwareFeatures(), ShouldResemble, []device.Config_HardwareFeature{
device.Config_HARDWARE_FEATURE_BLUETOOTH,
device.Config_HARDWARE_FEATURE_INTERNAL_DISPLAY,
device.Config_HARDWARE_FEATURE_STYLUS,
device.Config_HARDWARE_FEATURE_TOUCHPAD,
device.Config_HARDWARE_FEATURE_TOUCHSCREEN,
device.Config_HARDWARE_FEATURE_DETACHABLE_KEYBOARD,
})
So(dc.GetStorage(), ShouldEqual, device.Config_STORAGE_MMC)
So(dc.GetCpu(), ShouldEqual, device.Config_ARCHITECTURE_UNDEFINED)
case "PROJECT-C:34":
So(dc.GetFormFactor(), ShouldEqual, device.Config_FORM_FACTOR_CLAMSHELL)
So(dc.GetPower(), ShouldEqual, device.Config_POWER_SUPPLY_BATTERY)
So(dc.GetHardwareFeatures(), ShouldResemble, []device.Config_HardwareFeature{
device.Config_HARDWARE_FEATURE_BLUETOOTH,
device.Config_HARDWARE_FEATURE_INTERNAL_DISPLAY,
device.Config_HARDWARE_FEATURE_STYLUS,
device.Config_HARDWARE_FEATURE_TOUCHPAD,
device.Config_HARDWARE_FEATURE_TOUCHSCREEN,
device.Config_HARDWARE_FEATURE_DETACHABLE_KEYBOARD,
})
So(dc.GetStorage(), ShouldEqual, device.Config_STORAGE_NVME)
So(dc.GetCpu(), ShouldEqual, device.Config_ARCHITECTURE_UNDEFINED)
case "PROJECT-WL:64":
So(dc.GetFormFactor(), ShouldEqual, device.Config_FORM_FACTOR_CHROMEBIT)
So(dc.GetPower(), ShouldEqual, device.Config_POWER_SUPPLY_AC_ONLY)
So(dc.GetHardwareFeatures(), ShouldResemble, []device.Config_HardwareFeature{
device.Config_HARDWARE_FEATURE_BLUETOOTH,
device.Config_HARDWARE_FEATURE_INTERNAL_DISPLAY,
device.Config_HARDWARE_FEATURE_TOUCHPAD,
device.Config_HARDWARE_FEATURE_TOUCHSCREEN,
device.Config_HARDWARE_FEATURE_DETACHABLE_KEYBOARD,
})
So(dc.GetStorage(), ShouldEqual, device.Config_STORAGE_NVME)
So(dc.GetCpu(), ShouldEqual, device.Config_ARCHITECTURE_UNDEFINED)
default:
t.Errorf("Invalid model:sku: %s", modelWithSku)
}
}
})
})
}