blob: b94cc1d0c2fad19761ab6514323e9102dc27c874 [file] [log] [blame]
// Copyright 2019 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 "test_suite.h"
#include <fuchsia/test/cpp/fidl.h>
#include <zircon/errors.h>
#include "src/lib/fxl/logging.h"
namespace example {
using fuchsia::test::Case;
using fuchsia::test::Outcome;
TestSuite::TestSuite(async::Loop* loop, std::vector<TestInput> inputs,
Options options)
: binding_(this),
test_inputs_(std::move(inputs)),
options_(options),
loop_(loop) {}
void TestSuite::GetTests(GetTestsCallback callback) {
if (options_.close_channel_get_tests) {
binding_.Close(ZX_ERR_PEER_CLOSED);
return;
}
if (options_.dont_service_get_tests) {
return;
}
std::vector<Case> cases;
for (auto& test_input : test_inputs_) {
Case test_case;
test_case.set_name(test_input.name);
cases.push_back(std::move(test_case));
}
callback(std::move(cases));
}
void TestSuite::Run(
std::vector<fuchsia::test::Invocation> tests,
fuchsia::test::RunOptions /*unused*/,
fidl::InterfaceHandle<fuchsia::test::RunListener> run_listener) {
if (options_.close_channel_run) {
binding_.Close(ZX_ERR_PEER_CLOSED);
return;
}
if (options_.dont_service_run) {
return;
}
fuchsia::test::RunListenerPtr ptr;
ptr.Bind(std::move(run_listener));
for (auto& test_invocation : tests) {
auto& test_case = test_invocation.case_();
zx::socket log_sock;
zx::socket test_case_log;
zx::socket::create(0, &log_sock, &test_case_log);
ptr->OnTestCaseStarted(test_case.name(), std::move(log_sock));
std::string msg1 = "log1 for " + test_case.name();
std::string msg2 = "log2 for " + test_case.name();
std::string msg3 = "log3 for " + test_case.name();
zx_status_t status;
FXL_CHECK(ZX_OK == (status = test_case_log.write(0, msg1.data(),
msg1.length(), nullptr)))
<< status;
FXL_CHECK(ZX_OK == (status = test_case_log.write(0, msg2.data(),
msg2.length(), nullptr)))
<< status;
FXL_CHECK(ZX_OK == (status = test_case_log.write(0, msg3.data(),
msg3.length(), nullptr)))
<< status;
Outcome outcome;
for (auto& test_input : test_inputs_) {
if (test_input.name == test_case.name()) {
outcome.set_status(test_input.status);
break;
}
}
ptr->OnTestCaseFinished(test_case.name(), std::move(outcome));
}
}
fidl::InterfaceRequestHandler<fuchsia::test::Suite> TestSuite::GetHandler() {
auto handler = [this](fidl::InterfaceRequest<fuchsia::test::Suite> request) {
binding_.Bind(std::move(request));
};
binding_.set_error_handler(
[this](zx_status_t /*unused*/) { loop_->Shutdown(); });
return handler;
}
} // namespace example