blob: 586471b1566a176ba1b5513954087d484db19a36 [file] [log] [blame]
// Copyright 2021 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 "src/devices/bus/testing/fake-pdev/fake-pdev.h"
#include <zxtest/zxtest.h>
namespace {
TEST(FakePDev, Initializes) { fake_pdev::FakePDev fake; }
TEST(FakePDev, SetMmios) {
fake_pdev::FakePDev fake;
ddk::PDevProtocolClient pdev(fake.proto());
// No mmios to start.
pdev_mmio_t mmio;
for (uint32_t i = 0; i < 10; i++) {
ASSERT_STATUS(pdev.GetMmio(i, &mmio), ZX_ERR_OUT_OF_RANGE);
}
for (uint32_t i = 0; i < 10; i++) {
fake.set_mmio(i, {
.offset = i,
.size = i * 2,
});
}
for (uint32_t i = 0; i < 10; i++) {
ASSERT_OK(pdev.GetMmio(i, &mmio));
ASSERT_EQ(mmio.offset, i);
ASSERT_EQ(mmio.size, i * 2);
}
}
TEST(FakePDev, SetBtis) {
fake_pdev::FakePDev fake;
ddk::PDevProtocolClient pdev(fake.proto());
zx::bti bti;
for (uint32_t i = 0; i < 10; i++) {
ASSERT_STATUS(pdev.GetBti(i, &bti), ZX_ERR_OUT_OF_RANGE);
}
for (uint32_t i = 0; i < 10; i++) {
fake.set_bti(i, zx::bti());
}
for (uint32_t i = 0; i < 10; i++) {
ASSERT_OK(pdev.GetBti(i, &bti));
}
}
TEST(FakePDev, SetInterrupts) {
fake_pdev::FakePDev fake;
ddk::PDevProtocolClient pdev(fake.proto());
zx::interrupt irq;
for (uint32_t i = 0; i < 10; i++) {
ASSERT_STATUS(pdev.GetInterrupt(i, 0, &irq), ZX_ERR_OUT_OF_RANGE);
}
for (uint32_t i = 0; i < 10; i++) {
fake.set_interrupt(i, zx::interrupt());
}
for (uint32_t i = 0; i < 10; i++) {
ASSERT_OK(pdev.GetInterrupt(i, 0, &irq));
}
}
TEST(FakePDev, SetSmc) {
fake_pdev::FakePDev fake;
ddk::PDevProtocolClient pdev(fake.proto());
zx::resource smc;
for (uint32_t i = 0; i < 10; i++) {
ASSERT_STATUS(pdev.GetSmc(i, &smc), ZX_ERR_OUT_OF_RANGE);
}
for (uint32_t i = 0; i < 10; i++) {
fake.set_smc(i, zx::resource());
}
for (uint32_t i = 0; i < 10; i++) {
ASSERT_OK(pdev.GetSmc(i, &smc));
}
}
TEST(FakePDev, UseFakeBti) {
fake_pdev::FakePDev fake;
ddk::PDevProtocolClient pdev(fake.proto());
zx::bti bti;
for (uint32_t i = 0; i < 10; i++) {
ASSERT_STATUS(pdev.GetBti(i, &bti), ZX_ERR_OUT_OF_RANGE);
}
fake.UseFakeBti();
for (uint32_t i = 0; i < 10; i++) {
ASSERT_OK(pdev.GetBti(i, &bti));
ASSERT_TRUE(bti.is_valid());
}
fake.UseFakeBti(false);
for (uint32_t i = 0; i < 10; i++) {
ASSERT_STATUS(pdev.GetBti(i, &bti), ZX_ERR_OUT_OF_RANGE);
}
}
TEST(FakePDev, UseFakeSmc) {
fake_pdev::FakePDev fake;
ddk::PDevProtocolClient pdev(fake.proto());
zx::resource smc;
for (uint32_t i = 0; i < 10; i++) {
ASSERT_STATUS(pdev.GetSmc(i, &smc), ZX_ERR_OUT_OF_RANGE);
}
fake.UseFakeSmc();
for (uint32_t i = 0; i < 10; i++) {
ASSERT_OK(pdev.GetSmc(i, &smc));
ASSERT_TRUE(smc.is_valid());
}
fake.UseFakeSmc(false);
for (uint32_t i = 0; i < 10; i++) {
ASSERT_STATUS(pdev.GetSmc(i, &smc), ZX_ERR_OUT_OF_RANGE);
}
}
TEST(FakePDev, GetBoardInfo) {
fake_pdev::FakePDev fake;
ddk::PDevProtocolClient pdev(fake.proto());
pdev_board_info_t info = {};
ASSERT_NE(pdev.GetBoardInfo(&info), ZX_OK);
fake.set_board_info(info);
ASSERT_OK(pdev.GetBoardInfo(&info));
}
TEST(FakePDev, GetDeviceInfo) {
fake_pdev::FakePDev fake;
ddk::PDevProtocolClient pdev(fake.proto());
pdev_device_info_t info = {};
ASSERT_NE(pdev.GetDeviceInfo(&info), ZX_OK);
fake.set_device_info(info);
ASSERT_OK(pdev.GetDeviceInfo(&info));
}
} // namespace