blob: fa86ebd18c3ad0f9bedd4b2d6197dbc3163bac16 [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 <fidl/fuchsia.driver.test.logger/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/driver-unit-test/logger.h>
#include <lib/fidl/coding.h>
#include <lib/zx/channel.h>
#include <zircon/syscalls.h>
#include <memory>
#include <zxtest/zxtest.h>
namespace {
constexpr char kLogMessage[] = "test log message";
const char* kFakeTestCaseName = "test_case";
const zxtest::TestCase kFakeTestCase = zxtest::TestCase{
kFakeTestCaseName, zxtest::Test::SetUpTestSuite, zxtest::Test::TearDownTestSuite};
const zxtest::TestInfo kFakeTestInfo = zxtest::TestInfo("test", zxtest::SourceLocation{}, nullptr);
class LoggerTest : public zxtest::Test {
protected:
void SetUp() override {
zx::channel remote;
ASSERT_OK(zx::channel::create(0, &local_, &remote));
ASSERT_EQ(ZX_OK, driver_unit_test::Logger::CreateInstance(std::move(remote)));
logger_ = driver_unit_test::Logger::GetInstance();
ASSERT_NOT_NULL(logger_);
}
void TearDown() override {
driver_unit_test::Logger::DeleteInstance();
ASSERT_NULL(driver_unit_test::Logger::GetInstance());
}
zx::channel local_;
driver_unit_test::Logger* logger_;
};
TEST_F(LoggerTest, CreateWithInvalidChannel) {
driver_unit_test::Logger::DeleteInstance();
ASSERT_NULL(driver_unit_test::Logger::GetInstance());
zx::channel invalid;
ASSERT_NE(ZX_OK, driver_unit_test::Logger::CreateInstance(std::move(invalid)));
ASSERT_NULL(driver_unit_test::Logger::GetInstance());
ASSERT_NE(ZX_OK, driver_unit_test::Logger::SendLogMessage(kLogMessage));
}
struct LoggerTestServer : public fidl::Server<fuchsia_driver_test_logger::Logger> {
void LogMessage(LogMessageRequest& request, LogMessageCompleter::Sync& completer) override {
logged_message_ = request.msg();
}
void LogTestCase(LogTestCaseRequest& request, LogTestCaseCompleter::Sync& completer) override {
logged_test_case_name_ = request.name();
logged_test_case_result_ = request.result();
}
std::string logged_message_;
std::string logged_test_case_name_;
fuchsia_driver_test_logger::TestCaseResult logged_test_case_result_;
};
TEST_F(LoggerTest, LogMessage) {
ASSERT_OK(driver_unit_test::Logger::SendLogMessage(kLogMessage));
async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
LoggerTestServer server;
fidl::ServerEnd<fuchsia_driver_test_logger::Logger> server_end(std::move(local_));
fidl::BindServer(loop.dispatcher(), std::move(server_end), &server);
loop.RunUntilIdle();
ASSERT_EQ(strlen(kLogMessage), server.logged_message_.size());
ASSERT_EQ(0, strncmp(kLogMessage, server.logged_message_.data(), server.logged_message_.size()));
}
// Read and decode the FIDL message from the channel and check that it equals the wanted result.
void ValidateReceivedTestCase(zx::channel log_ch,
const fuchsia_driver_test_logger::TestCaseResult& want) {
async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
LoggerTestServer server;
fidl::ServerEnd<fuchsia_driver_test_logger::Logger> server_end(std::move(log_ch));
fidl::BindServer(loop.dispatcher(), std::move(server_end), &server);
loop.RunUntilIdle();
ASSERT_EQ(strlen(kFakeTestCaseName), server.logged_test_case_name_.size());
ASSERT_EQ(0, strncmp(kFakeTestCaseName, server.logged_test_case_name_.data(),
server.logged_test_case_name_.size()));
ASSERT_EQ(want.passed(), server.logged_test_case_result_.passed());
ASSERT_EQ(want.failed(), server.logged_test_case_result_.failed());
ASSERT_EQ(want.skipped(), server.logged_test_case_result_.skipped());
}
TEST_F(LoggerTest, LogEmptyTestCase) {
logger_->OnTestCaseStart(kFakeTestCase);
logger_->OnTestCaseEnd(kFakeTestCase);
auto want_result = fuchsia_driver_test_logger::TestCaseResult{};
ASSERT_NO_FATAL_FAILURE(ValidateReceivedTestCase(std::move(local_), want_result));
}
TEST_F(LoggerTest, LogSingleTest) {
logger_->OnTestCaseStart(kFakeTestCase);
logger_->OnTestSuccess(kFakeTestCase, kFakeTestInfo);
logger_->OnTestCaseEnd(kFakeTestCase);
auto want_result = fuchsia_driver_test_logger::TestCaseResult{};
want_result.passed() = 1;
ASSERT_NO_FATAL_FAILURE(ValidateReceivedTestCase(std::move(local_), want_result));
}
TEST_F(LoggerTest, LogMultipleTest) {
logger_->OnTestCaseStart(kFakeTestCase);
logger_->OnTestFailure(kFakeTestCase, kFakeTestInfo);
logger_->OnTestFailure(kFakeTestCase, kFakeTestInfo);
logger_->OnTestSuccess(kFakeTestCase, kFakeTestInfo);
logger_->OnTestSkip(kFakeTestCase, kFakeTestInfo);
logger_->OnTestSuccess(kFakeTestCase, kFakeTestInfo);
logger_->OnTestSuccess(kFakeTestCase, kFakeTestInfo);
logger_->OnTestCaseEnd(kFakeTestCase);
auto want_result = fuchsia_driver_test_logger::TestCaseResult{};
want_result.passed() = 3;
want_result.failed() = 2;
want_result.skipped() = 1;
ASSERT_NO_FATAL_FAILURE(ValidateReceivedTestCase(std::move(local_), want_result));
}
} // anonymous namespace