blob: d3c457524cf24939ddbc664d52f0b2e99ee10a66 [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 <lib/driver-integration-test/fixture.h>
#include <lib/fdio/directory.h>
#include <zircon/syscalls.h>
#include <unordered_set>
#include <ddk/platform-defs.h>
#include <zxtest/zxtest.h>
using driver_integration_test::IsolatedDevmgr;
class FallbackTest : public zxtest::Test {
public:
~FallbackTest() override = default;
// Set up and launch the devmgr.
void LaunchDevmgr(IsolatedDevmgr::Args args) {
board_test::DeviceEntry dev = {};
dev.vid = PDEV_VID_TEST;
dev.pid = PDEV_PID_FALLBACK_TEST;
dev.did = 0;
args.device_list.push_back(dev);
// We disable searching for drivers so that "TestFallbackBoundWhenAlone" works as expected.
args.driver_search_paths.push_back("/do-not-search");
// Explicitly whitelist drivers that are necessary for the integration test to come up.
args.load_drivers.push_back("/boot/driver/platform-bus.so");
args.load_drivers.push_back("/boot/driver/platform-bus.proxy.so");
args.load_drivers.push_back("/boot/driver/integration-test.so");
zx_status_t status = IsolatedDevmgr::Create(&args, &devmgr_);
ASSERT_OK(status);
}
// Check that the correct driver was bound. `fallback` indicates if we expect the fallback or
// not-fallback driver to have bound.
void CheckDriverBound(bool fallback) {
fbl::unique_fd fd;
fbl::String path = fbl::StringPrintf("sys/platform/11:16:0/ddk-%s-test",
fallback ? "fallback" : "not-fallback");
ASSERT_OK(
devmgr_integration_test::RecursiveWaitForFile(devmgr_.devfs_root(), path.c_str(), &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(FallbackTest, TestNotFallbackTakesPriority) {
IsolatedDevmgr::Args args;
args.load_drivers.push_back("/boot/driver/ddk-fallback-test.so");
args.load_drivers.push_back("/boot/driver/ddk-not-fallback-test.so");
ASSERT_NO_FATAL_FAILURES(LaunchDevmgr(std::move(args)));
ASSERT_NO_FATAL_FAILURES(CheckDriverBound(false));
}
TEST_F(FallbackTest, TestFallbackBoundWhenAlone) {
IsolatedDevmgr::Args args;
args.load_drivers.push_back("/boot/driver/ddk-fallback-test.so");
ASSERT_NO_FATAL_FAILURES(LaunchDevmgr(std::move(args)));
ASSERT_NO_FATAL_FAILURES(CheckDriverBound(true));
}
TEST_F(FallbackTest, TestFallbackBoundWhenEager) {
IsolatedDevmgr::Args args;
args.boot_args.emplace(std::make_pair("devmgr.bind-eager", "ddk_fallback_test"));
args.load_drivers.push_back("/boot/driver/ddk-fallback-test.so");
args.load_drivers.push_back("/boot/driver/ddk-not-fallback-test.so");
ASSERT_NO_FATAL_FAILURES(LaunchDevmgr(std::move(args)));
ASSERT_NO_FATAL_FAILURES(CheckDriverBound(true));
}