Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[test] consolidate test data into one library #19

Merged
merged 1 commit into from
Sep 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions src/proto/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,24 @@ go_library(
name = "validators",
srcs = ["validators.go"],
importpath = "github.com/lowRISC/opentitan-provisioning/src/proto/validators",
deps = [":device_id_go_pb"],
deps = [
":device_id_go_pb",
],
)

go_library(
name = "device_testdata",
testonly = True,
srcs = ["device_testdata.go"],
importpath = "github.com/lowRISC/opentitan-provisioning/src/proto/device_testdata",
deps = [":device_id_go_pb"],
deps = [
":device_id_go_pb",
],
)

go_test(
name = "validators_test",
srcs = ["validators_test.go"],
embed = [":validators"],
deps = [":device_testdata"],
)
64 changes: 52 additions & 12 deletions src/proto/device_testdata.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,59 +2,99 @@
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

// Package device_data contains device variables.
// Package device_data contains data objects for testing.
package device_testdata

import (
dpb "github.com/lowRISC/opentitan-provisioning/src/proto/device_id_go_pb"
)

const (
DeviceIdSkuSpecificLen = 128
DeviceIdSkuSpecificLenInBytes = 16
MaxDeviceDataPayloadLenInBytes = 8192
)

var (
hwOriginOk = dpb.HardwareOrigin{
// HardwareOrigin objects.
// TODO: add varying device identification numbers to test cases
HwOriginOk = dpb.HardwareOrigin{
SiliconCreatorId: dpb.SiliconCreatorId_SILICON_CREATOR_ID_OPENSOURCE,
ProductId: dpb.ProductId_PRODUCT_ID_EARLGREY_Z1,
DeviceIdentificationNumber: 0,
}
hwOriginBadSiliconCreatorId = dpb.HardwareOrigin{
HwOriginBadSiliconCreatorId = dpb.HardwareOrigin{
SiliconCreatorId: 2,
ProductId: dpb.ProductId_PRODUCT_ID_EARLGREY_A1,
DeviceIdentificationNumber: 0,
}
hwOriginBadProductId = dpb.HardwareOrigin{
HwOriginBadProductId = dpb.HardwareOrigin{
SiliconCreatorId: dpb.SiliconCreatorId_SILICON_CREATOR_ID_NUVOTON,
ProductId: 0x10000,
DeviceIdentificationNumber: 0,
}

// DeviceId objects.
DeviceIdOk = dpb.DeviceId{
HardwareOrigin: &HwOriginOk,
SkuSpecific: make([]byte, DeviceIdSkuSpecificLenInBytes),
}
DeviceIdOkMissingSkuSpecific = dpb.DeviceId{
HardwareOrigin: &HwOriginOk,
SkuSpecific: nil, // Empty SkuSpecific is OK.
}
DeviceIdBadSiliconCreatorId = dpb.DeviceId{
HardwareOrigin: &HwOriginBadSiliconCreatorId,
SkuSpecific: make([]byte, DeviceIdSkuSpecificLenInBytes),
}
DeviceIdBadProductId = dpb.DeviceId{
HardwareOrigin: &HwOriginBadProductId,
SkuSpecific: make([]byte, DeviceIdSkuSpecificLenInBytes),
}
DeviceIdSkuTooLong = dpb.DeviceId{
HardwareOrigin: &HwOriginOk,
SkuSpecific: make([]byte, DeviceIdSkuSpecificLenInBytes+1),
}
// TODO: add deviceIdBadCrc, which would have a bad Crc32 field.

// DeviceData objects.
DeviceDataOk = dpb.DeviceData{
Payload: make([]byte, MaxDeviceDataPayloadLenInBytes),
DeviceLifeCycle: dpb.DeviceLifeCycle_DEVICE_LIFE_CYCLE_PROD,
}
DeviceDataBadPayloadTooLarge = dpb.DeviceData{
Payload: make([]byte, MaxDeviceDataPayloadLenInBytes+1),
DeviceLifeCycle: dpb.DeviceLifeCycle_DEVICE_LIFE_CYCLE_PROD,
}
DeviceDataBadLifeCycle = dpb.DeviceData{
Payload: make([]byte, 0),
DeviceLifeCycle: dpb.DeviceLifeCycle_DEVICE_LIFE_CYCLE_UNSPECIFIED,
}
)

func NewDeviceID() *dpb.DeviceId {
return &dpb.DeviceId{
HardwareOrigin: &hwOriginOk,
SkuSpecific: make([]byte, DeviceIdSkuSpecificLen),
HardwareOrigin: &HwOriginOk,
SkuSpecific: make([]byte, DeviceIdSkuSpecificLenInBytes),
}
}

func NewDeviceIDSkuTooLong() *dpb.DeviceId {
return &dpb.DeviceId{
HardwareOrigin: &hwOriginOk,
SkuSpecific: make([]byte, DeviceIdSkuSpecificLen+1),
HardwareOrigin: &HwOriginOk,
SkuSpecific: make([]byte, DeviceIdSkuSpecificLenInBytes+1),
}
}

func NewDeviceIDMissingSku() *dpb.DeviceId {
return &dpb.DeviceId{
HardwareOrigin: &hwOriginOk,
HardwareOrigin: &HwOriginOk,
SkuSpecific: nil, // Empty SkuSpecific is OK.
}
}

func NewDeviceIdBadOrigin() *dpb.DeviceId {
return &dpb.DeviceId{
HardwareOrigin: &hwOriginBadSiliconCreatorId,
SkuSpecific: make([]byte, DeviceIdSkuSpecificLen),
HardwareOrigin: &HwOriginBadSiliconCreatorId,
SkuSpecific: make([]byte, DeviceIdSkuSpecificLenInBytes),
}
}
8 changes: 4 additions & 4 deletions src/proto/validators.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ import (
)

const (
DeviceIdSkuSpecificLen = 128
MaxDeviceDataPayloadLen = 8192
DeviceIdSkuSpecificLenInBytes = 16
MaxDeviceDataPayloadLenInBytes = 8192
)

// Checks that a uint32 fits into 16 bits.
Expand Down Expand Up @@ -77,7 +77,7 @@ func ValidateDeviceId(di *dpb.DeviceId) error {

// len(di.SkuSpecific) == 0 ==> (optional) field not supplied,
// which is considered valid.
if len(di.SkuSpecific) != 0 && len(di.SkuSpecific) != DeviceIdSkuSpecificLen {
if len(di.SkuSpecific) != 0 && len(di.SkuSpecific) != DeviceIdSkuSpecificLenInBytes {
return fmt.Errorf("Invalid SkuSpecific string length: %v", len(di.SkuSpecific))
}

Expand All @@ -98,7 +98,7 @@ func DeviceIdToString(di *dpb.DeviceId) string {
// 0-length is considered valid.
func validatePayload(payload []byte) error {
l := len(payload)
if l > MaxDeviceDataPayloadLen {
if l > MaxDeviceDataPayloadLenInBytes {
return fmt.Errorf("Invalid Payload length: %v", l)
}

Expand Down
78 changes: 17 additions & 61 deletions src/proto/validators_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"testing"

dpb "github.com/lowRISC/opentitan-provisioning/src/proto/device_id_go_pb"
dtd "github.com/lowRISC/opentitan-provisioning/src/proto/device_testdata"
)

const okCertPEM = `
Expand Down Expand Up @@ -42,50 +43,6 @@ var okCertBytes = func() []byte {
return block.Bytes
}()

var (
// TODO: add varying device identification numbers to test cases
hwOriginOk = dpb.HardwareOrigin{
SiliconCreatorId: dpb.SiliconCreatorId_SILICON_CREATOR_ID_OPENSOURCE,
ProductId: dpb.ProductId_PRODUCT_ID_EARLGREY_Z1,
DeviceIdentificationNumber: 0,
}
hwOriginBadSiliconCreatorId = dpb.HardwareOrigin{
SiliconCreatorId: 2,
ProductId: dpb.ProductId_PRODUCT_ID_EARLGREY_A1,
DeviceIdentificationNumber: 0,
}
hwOriginBadProductId = dpb.HardwareOrigin{
SiliconCreatorId: dpb.SiliconCreatorId_SILICON_CREATOR_ID_NUVOTON,
ProductId: 0x10000,
DeviceIdentificationNumber: 0,
}

// TODO: hwOriginBadDeviceId, which would have an inok DeviceIdentificationNumber field.

deviceIdOk = dpb.DeviceId{
HardwareOrigin: &hwOriginOk,
SkuSpecific: make([]byte, DeviceIdSkuSpecificLen),
}
deviceIdOkMissingSku = dpb.DeviceId{
HardwareOrigin: &hwOriginOk,
SkuSpecific: nil, // Empty SkuSpecific is OK.
}
deviceIdBadOrigin = dpb.DeviceId{
HardwareOrigin: &hwOriginBadSiliconCreatorId,
SkuSpecific: make([]byte, DeviceIdSkuSpecificLen),
}
deviceIdSkuTooLong = dpb.DeviceId{
HardwareOrigin: &hwOriginOk,
SkuSpecific: make([]byte, DeviceIdSkuSpecificLen+1),
}
// TODO: deviceIdBadCrc, which would have an inok Crc32 field.

deviceDataOk = dpb.DeviceData{
DeviceLifeCycle: dpb.DeviceLifeCycle_DEVICE_LIFE_CYCLE_PROD,
Payload: okCertBytes,
}
)

func TestValidateSiliconCreatorId(t *testing.T) {
tests := []struct {
name string
Expand Down Expand Up @@ -168,16 +125,16 @@ func TestValidateHardwareOrigin(t *testing.T) {
}{
{
name: "ok",
ho: &hwOriginOk,
ho: &dtd.HwOriginOk,
ok: true,
},
{
name: "bad silicon creator ID",
ho: &hwOriginBadSiliconCreatorId,
ho: &dtd.HwOriginBadSiliconCreatorId,
},
{
name: "bad product ID",
ho: &hwOriginBadProductId,
ho: &dtd.HwOriginBadProductId,
},
}

Expand All @@ -198,22 +155,27 @@ func TestValidateDeviceId(t *testing.T) {
}{
{
name: "ok",
di: &deviceIdOk,
di: &dtd.DeviceIdOk,
ok: true,
},
{
name: "missing sku",
di: &deviceIdOkMissingSku,
di: &dtd.DeviceIdOkMissingSkuSpecific,
ok: true, // SKU is optional.
},
{
name: "bad origin",
di: &deviceIdBadOrigin,
name: "bad hardware origin - bad silicon creator id",
di: &dtd.DeviceIdBadSiliconCreatorId,
},
{
name: "bad hardware origin - bad product id",
di: &dtd.DeviceIdBadProductId,
},
{
name: "sku too long",
di: &deviceIdSkuTooLong,
di: &dtd.DeviceIdSkuTooLong,
},
// TODO: test a device ID which has a bad DeviceIdentificationNumber field.
}

for _, tt := range tests {
Expand Down Expand Up @@ -280,22 +242,16 @@ func TestValidateDeviceData(t *testing.T) {
},
{
name: "valid payload with one cert",
dd: &deviceDataOk,
dd: &dtd.DeviceDataOk,
ok: true,
},
{
name: "payload too large",
dd: &dpb.DeviceData{
Payload: make([]byte, MaxDeviceDataPayloadLen+1),
DeviceLifeCycle: dpb.DeviceLifeCycle_DEVICE_LIFE_CYCLE_PROD,
},
dd: &dtd.DeviceDataBadPayloadTooLarge,
},
{
name: "bad device life cycle",
dd: &dpb.DeviceData{
Payload: make([]byte, 0),
DeviceLifeCycle: dpb.DeviceLifeCycle_DEVICE_LIFE_CYCLE_UNSPECIFIED,
},
dd: &dtd.DeviceDataBadLifeCycle,
},
}

Expand Down
1 change: 1 addition & 0 deletions src/proxy_buffer/proto/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ go_test(
embed = [":validators"],
deps = [
"//src/proto:device_id_go_pb",
"//src/proto:device_testdata",
"//src/proto:validators",
],
)
Loading
Loading