blob: d9ab21d7fef5bc348cdad6d37076059bdda6e091 [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/diagnostics/cpp/fidl.h>
#include <fuchsia/examples/inspect/cpp/fidl.h>
#include <lib/async/cpp/executor.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/sys/cpp/testing/test_with_environment.h>
constexpr char reverser_url[] =
"fuchsia-pkg://fuchsia.com/inspect_cpp_codelab_integration_tests#meta/"
"inspect_cpp_codelab_part_4.cmx";
constexpr char fizzbuzz_url[] =
"fuchsia-pkg://fuchsia.com/inspect_cpp_codelab_integration_tests#meta/"
"inspect_cpp_codelab_fizzbuzz.cmx";
class CodelabTest : public sys::testing::TestWithEnvironment {
protected:
// Options for each test.
struct TestOptions {
// If true, inject a FizzBuzz service implementation.
bool include_fizzbuzz_service;
};
fuchsia::examples::inspect::ReverserPtr StartComponentAndConnect(TestOptions options) {
// Create an environment for the test that simulates the "sys" realm.
// We optionally inject the "FizzBuzz" service if requested.
auto services = CreateServices();
if (options.include_fizzbuzz_service) {
services->AddServiceWithLaunchInfo({.url = fizzbuzz_url},
fuchsia::examples::inspect::FizzBuzz::Name_);
}
environment_ = CreateNewEnclosingEnvironment("sys", std::move(services));
// Start the Reverser component in the nested environment.
fuchsia::io::DirectoryPtr directory_request;
controller_ = environment_->CreateComponent(
{.url = reverser_url, .directory_request = directory_request.NewRequest().TakeChannel()});
// Connect to Reverser hosted by the new component.
fuchsia::examples::inspect::ReverserPtr ret;
sys::ServiceDirectory component_services(directory_request.Unbind());
component_services.Connect(ret.NewRequest());
bool ready = false;
controller_.events().OnDirectoryReady = [&] { ready = true; };
RunLoopUntil([&] { return ready; });
return ret;
}
private:
std::unique_ptr<sys::testing::EnclosingEnvironment> environment_;
fuchsia::sys::ComponentControllerPtr controller_;
};
// [START integration_test]
TEST_F(CodelabTest, StartWithFizzBuzz) {
auto ptr = StartComponentAndConnect({.include_fizzbuzz_service = true});
bool error = false;
ptr.set_error_handler([&](zx_status_t unused) { error = true; });
bool done = false;
std::string result;
ptr->Reverse("hello", [&](std::string value) {
result = std::move(value);
done = true;
});
RunLoopUntil([&] { return done || error; });
ASSERT_FALSE(error);
EXPECT_EQ("olleh", result);
// CODELAB: Check that the component was connected to FizzBuzz.
}
// [END integration_test]
TEST_F(CodelabTest, StartWithoutFizzBuzz) {
auto ptr = StartComponentAndConnect({.include_fizzbuzz_service = false});
bool error = false;
ptr.set_error_handler([&](zx_status_t unused) { error = true; });
bool done = false;
std::string result;
ptr->Reverse("hello", [&](std::string value) {
result = std::move(value);
done = true;
});
RunLoopUntil([&] { return done || error; });
ASSERT_FALSE(error);
EXPECT_EQ("olleh", result);
// CODELAB: Check that the component failed to connect to FizzBuzz.
}