blob: 90307c06d5842fd211614db2dfcc61a0f86f6bc4 [file] [log] [blame]
// Copyright 2020 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 <fuchsia/device/firmware/test/llcpp/fidl.h>
#include <lib/ddk/platform-defs.h>
#include <lib/driver-integration-test/fixture.h>
#include <lib/fdio/directory.h>
#include <zircon/syscalls.h>
#include <unordered_set>
#include <zxtest/zxtest.h>
using driver_integration_test::IsolatedDevmgr;
using fuchsia_device_firmware_test::TestDevice;
constexpr const char TEST_FIRMWARE_PATH[] = "test-firmware";
class FirmwareTest : public zxtest::Test {
public:
~FirmwareTest() override = default;
void SetUp() override {
IsolatedDevmgr::Args args;
args.load_drivers.push_back("/boot/driver/ddk-firmware-test.so");
board_test::DeviceEntry dev = {};
dev.vid = PDEV_VID_TEST;
dev.pid = PDEV_PID_FIRMWARE_TEST;
dev.did = 0;
args.device_list.push_back(dev);
zx_status_t status = IsolatedDevmgr::Create(&args, &devmgr_);
ASSERT_OK(status);
fbl::unique_fd fd;
ASSERT_OK(devmgr_integration_test::RecursiveWaitForFile(
devmgr_.devfs_root(), "sys/platform/11:15:0/ddk-firmware-test", &fd));
ASSERT_GT(fd.get(), 0);
ASSERT_OK(fdio_get_service_handle(fd.release(), chan_.reset_and_get_address()));
ASSERT_NE(chan_.get(), ZX_HANDLE_INVALID);
}
protected:
zx::channel chan_;
IsolatedDevmgr devmgr_;
};
TEST_F(FirmwareTest, LoadFirmwareSync) {
auto result = fidl::WireCall<TestDevice>(zx::unowned(chan_))
.LoadFirmware(fidl::StringView(TEST_FIRMWARE_PATH));
ASSERT_OK(result.status());
ASSERT_FALSE(result->result.is_err(), "LoadFirmware failed: %s",
zx_status_get_string(result->result.err()));
}
TEST_F(FirmwareTest, LoadNonexistantFirmwareSyncFails) {
auto result =
fidl::WireCall<TestDevice>(zx::unowned(chan_)).LoadFirmware(fidl::StringView("not_a_file"));
ASSERT_OK(result.status());
ASSERT_TRUE(result->result.is_err(), "LoadFirmware should have failed");
}
TEST_F(FirmwareTest, LoadFirmwareAsync) {
auto result = fidl::WireCall<TestDevice>(zx::unowned(chan_))
.LoadFirmwareAsync(fidl::StringView(TEST_FIRMWARE_PATH));
ASSERT_OK(result.status());
ASSERT_FALSE(result->result.is_err(), "LoadFirmwareAsync failed: %s",
zx_status_get_string(result->result.err()));
}
TEST_F(FirmwareTest, LoadNonexistantFirmwareAsyncFails) {
auto result = fidl::WireCall<TestDevice>(zx::unowned(chan_))
.LoadFirmwareAsync(fidl::StringView("not_a_file"));
ASSERT_OK(result.status());
ASSERT_TRUE(result->result.is_err(), "LoadFirmwareAsync should have failed");
}