blob: 2aed2c5aebe5da48121aabdd7365417ad3e4750f [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "abr.h"
#include <endian.h>
#include <lib/cksum.h>
#include <zxtest/zxtest.h>
namespace {
constexpr abr::Data kAbrData = {
.magic = {'\0', 'A', 'B', '0'},
.version_major = abr::kMajorVersion,
.version_minor = abr::kMinorVersion,
.reserved1 = {},
.slots =
{
{
.priority = 0,
.tries_remaining = 0,
.successful_boot = 0,
.reserved = {},
},
{
.priority = 1,
.tries_remaining = 0,
.successful_boot = 1,
.reserved = {},
},
},
.oneshot_recovery_boot = 0,
.reserved2 = {},
.crc32 = {},
};
class TestClient : public abr::Client {
public:
const abr::Data& Data() const override { return data_; }
zx_status_t Persist(abr::Data data) override { return ZX_OK; }
void UpdateCrc() {
data_.crc32 =
htobe32(crc32(0, reinterpret_cast<const uint8_t*>(&data_), offsetof(abr::Data, crc32)));
}
abr::Data data_ = kAbrData;
};
TEST(AbrTest, InvalidCrc) {
TestClient client;
ASSERT_FALSE(client.IsValid());
}
TEST(AbrTest, InvalidMajorVersion) {
TestClient client;
client.data_.version_major = static_cast<uint8_t>(abr::kMajorVersion + 1);
client.UpdateCrc();
ASSERT_FALSE(client.IsValid());
}
TEST(AbrTest, InvalidAbrMinorVersion) {
TestClient client;
client.data_.version_minor = static_cast<uint8_t>(abr::kMinorVersion + 1);
client.UpdateCrc();
ASSERT_FALSE(client.IsValid());
}
TEST(AbrTest, InvalidPrioritySlot0) {
TestClient client;
client.data_.slots[0].priority = abr::kMaxPriority + 1;
client.UpdateCrc();
ASSERT_FALSE(client.IsValid());
}
TEST(AbrTest, InvalidPrioritySlot1) {
TestClient client;
client.data_.slots[1].priority = abr::kMaxPriority + 1;
client.UpdateCrc();
ASSERT_FALSE(client.IsValid());
}
TEST(AbrTest, InvalidTriesRemainingSlot0) {
TestClient client;
client.data_.slots[0].tries_remaining = abr::kMaxTriesRemaining + 1;
client.UpdateCrc();
ASSERT_FALSE(client.IsValid());
}
TEST(AbrTest, InvalidTriesRemainingSlot1) {
TestClient client;
client.data_.slots[1].tries_remaining = abr::kMaxTriesRemaining + 1;
client.UpdateCrc();
ASSERT_FALSE(client.IsValid());
}
TEST(AbrTest, IsValid) {
TestClient client;
client.UpdateCrc();
ASSERT_TRUE(client.IsValid());
}
} // namespace