blob: 51f1eb0e8710b6f491ecf446e2c070f6ac8a048f [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#include "sw/device/silicon_creator/rom_ext/rom_ext_boot_policy.h"
#include "gtest/gtest.h"
#include "sw/device/silicon_creator/lib/mock_manifest.h"
#include "sw/device/silicon_creator/rom_ext/mock_rom_ext_boot_policy_ptrs.h"
#include "sw/device/silicon_creator/testing/rom_test.h"
namespace manifest_unittest {
namespace {
using ::testing::Return;
class RomExtBootPolicyTest : public rom_test::RomTest {
protected:
rom_test::MockRomExtBootPolicyPtrs rom_ext_boot_policy_ptrs_;
rom_test::MockManifest mock_manifest_;
};
TEST_F(RomExtBootPolicyTest, ManifestCheck) {
manifest_t manifest{};
manifest.identifier = CHIP_BL0_IDENTIFIER;
manifest.length = CHIP_BL0_SIZE_MIN;
EXPECT_CALL(mock_manifest_, Check(&manifest)).WillOnce(Return(kErrorOk));
EXPECT_EQ(rom_ext_boot_policy_manifest_check(&manifest), kErrorOk);
manifest.length = CHIP_BL0_SIZE_MAX >> 1;
EXPECT_CALL(mock_manifest_, Check(&manifest)).WillOnce(Return(kErrorOk));
EXPECT_EQ(rom_ext_boot_policy_manifest_check(&manifest), kErrorOk);
manifest.length = CHIP_BL0_SIZE_MAX;
EXPECT_CALL(mock_manifest_, Check(&manifest)).WillOnce(Return(kErrorOk));
EXPECT_EQ(rom_ext_boot_policy_manifest_check(&manifest), kErrorOk);
}
TEST_F(RomExtBootPolicyTest, ManifestCheckBadIdentifier) {
manifest_t manifest{};
EXPECT_EQ(rom_ext_boot_policy_manifest_check(&manifest),
kErrorBootPolicyBadIdentifier);
}
TEST_F(RomExtBootPolicyTest, ManifestCheckBadLength) {
manifest_t manifest{};
manifest.identifier = CHIP_BL0_IDENTIFIER;
manifest.length = CHIP_BL0_SIZE_MIN - 1;
EXPECT_EQ(rom_ext_boot_policy_manifest_check(&manifest),
kErrorBootPolicyBadLength);
manifest.length = CHIP_BL0_SIZE_MAX + 1;
EXPECT_EQ(rom_ext_boot_policy_manifest_check(&manifest),
kErrorBootPolicyBadLength);
}
struct ManifestOrderTestCase {
uint32_t version_a;
uint32_t version_b;
bool is_a_first;
};
class ManifestOrderTest
: public RomExtBootPolicyTest,
public testing::WithParamInterface<ManifestOrderTestCase> {};
TEST_P(ManifestOrderTest, ManifestsGet) {
manifest_t manifest_a{};
manifest_t manifest_b{};
manifest_a.security_version = GetParam().version_a;
manifest_b.security_version = GetParam().version_b;
EXPECT_CALL(rom_ext_boot_policy_ptrs_, ManifestA)
.WillOnce(Return(&manifest_a));
EXPECT_CALL(rom_ext_boot_policy_ptrs_, ManifestB)
.WillOnce(Return(&manifest_b));
rom_ext_boot_policy_manifests_t res = rom_ext_boot_policy_manifests_get();
if (GetParam().is_a_first) {
EXPECT_EQ(res.ordered[0], &manifest_a);
EXPECT_EQ(res.ordered[1], &manifest_b);
} else {
EXPECT_EQ(res.ordered[0], &manifest_b);
EXPECT_EQ(res.ordered[1], &manifest_a);
}
}
INSTANTIATE_TEST_SUITE_P(
SecurityVersionCases, ManifestOrderTest,
testing::Values(
ManifestOrderTestCase{
.version_a = 0,
.version_b = 0,
.is_a_first = true,
},
ManifestOrderTestCase{
.version_a = 1,
.version_b = 0,
.is_a_first = true,
},
ManifestOrderTestCase{
.version_a = 0,
.version_b = 1,
.is_a_first = false,
},
ManifestOrderTestCase{
.version_a = std::numeric_limits<int32_t>::max(),
.version_b =
static_cast<uint32_t>(std::numeric_limits<int32_t>::max()) + 1,
.is_a_first = false,
}));
} // namespace
} // namespace manifest_unittest