blob: 9230f5d2a7c5729956df8b813a0a77caf6bfbb26 [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/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;
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);
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::String path = fbl::StringPrintf("sys/platform/11:16:0/ddk-%s-test",
fallback ? "fallback" : "not-fallback");
zx::result channel =
device_watcher::RecursiveWaitForFile(devmgr_.devfs_root().get(), path.c_str());
ASSERT_OK(channel.status_value());
chan_ = std::move(channel.value());
ASSERT_NE(chan_.get(), ZX_HANDLE_INVALID);
}
protected:
zx::channel chan_;
IsolatedDevmgr devmgr_;
};
TEST_F(FallbackTest, TestNotFallbackTakesPriority) {
IsolatedDevmgr::Args args;
ASSERT_NO_FATAL_FAILURE(LaunchDevmgr(std::move(args)));
ASSERT_NO_FATAL_FAILURE(CheckDriverBound(false));
}
TEST_F(FallbackTest, TestFallbackBoundWhenAlone) {
IsolatedDevmgr::Args args;
args.driver_disable.push_back("fuchsia-boot:///dtr#meta/ddk-not-fallback-test.cm");
ASSERT_NO_FATAL_FAILURE(LaunchDevmgr(std::move(args)));
ASSERT_NO_FATAL_FAILURE(CheckDriverBound(true));
}