blob: 4672e3e2d9728dfa7af7c6a48efc3bf85a0c9a6a [file] [log] [blame]
// Copyright 2018 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/fidl/txn_header.h>
#include <utility>
#include <fbl/string.h>
#include <fbl/vector.h>
#include <runtests-utils/log-exporter.h>
#include <zxtest/zxtest.h>
namespace runtests {
namespace {
fuchsia_logger::wire::LogMessage CreateLogMessage(fuchsia_logger::wire::LogMessage lm) {
if (lm.pid == 0) {
lm.pid = 1024;
}
lm.tid = 1034;
lm.time = 93892493921;
lm.severity = static_cast<int32_t>(fuchsia_logger::wire::LogLevelFilter::kInfo);
return lm;
}
TEST(LogListenerTests, TestLog) {
auto [listener, listener_request] = fidl::Endpoints<fuchsia_logger::LogListenerSafe>::Create();
// We expect the log file to be much smaller than this.
char buf[1024];
memset(buf, 0, sizeof(buf));
FILE* buf_file = fmemopen(buf, sizeof(buf), "w");
// start listener
async::Loop loop(&kAsyncLoopConfigNeverAttachToThread);
LogExporter log_exporter(
buf_file, loop.dispatcher(), std::move(listener_request),
[](zx_status_t status) { EXPECT_STATUS(ZX_ERR_CANCELED, status); }, nullptr);
fidl::WireClient client{std::move(listener), loop.dispatcher()};
client
->Log(CreateLogMessage({
.msg = "my message",
}))
.ThenExactlyOnce([](fidl::WireUnownedResult<fuchsia_logger::LogListenerSafe::Log>& result) {
ASSERT_OK(result);
});
ASSERT_OK(loop.RunUntilIdle());
{
fidl::StringView tags[] = {"tag123"};
client
->Log(CreateLogMessage({
.tags = fidl::VectorView<fidl::StringView>::FromExternal(tags),
.msg = "my message",
}))
.ThenExactlyOnce([](fidl::WireUnownedResult<fuchsia_logger::LogListenerSafe::Log>& result) {
ASSERT_OK(result);
});
}
ASSERT_OK(loop.RunUntilIdle());
fflush(buf_file);
ASSERT_STREQ(R"([00093.892493][1024][1034][] INFO: my message
[00093.892493][1024][1034][tag123] INFO: my message
)",
buf);
{
fidl::StringView tags[] = {"tag123", "tag2"};
client
->Log(CreateLogMessage({
.tags = fidl::VectorView<fidl::StringView>::FromExternal(tags),
.msg = "my message",
}))
.ThenExactlyOnce([](fidl::WireUnownedResult<fuchsia_logger::LogListenerSafe::Log>& result) {
ASSERT_OK(result);
});
}
ASSERT_OK(loop.RunUntilIdle());
fflush(buf_file);
ASSERT_STREQ(R"([00093.892493][1024][1034][] INFO: my message
[00093.892493][1024][1034][tag123] INFO: my message
[00093.892493][1024][1034][tag123, tag2] INFO: my message
)",
buf);
}
TEST(LogListenerTests, TestLogMany) {
auto [listener, listener_request] = fidl::Endpoints<fuchsia_logger::LogListenerSafe>::Create();
// We expect the log file to be much smaller than this.
char buf[1024];
memset(buf, 0, sizeof(buf));
FILE* buf_file = fmemopen(buf, sizeof(buf), "w");
// start listener
async::Loop loop(&kAsyncLoopConfigNeverAttachToThread);
LogExporter log_exporter(
buf_file, loop.dispatcher(), std::move(listener_request),
[](zx_status_t status) { EXPECT_STATUS(ZX_ERR_CANCELED, status); }, nullptr);
fidl::WireClient client{std::move(listener), loop.dispatcher()};
{
fidl::StringView tags[] = {"tag1", "tag2"};
fuchsia_logger::wire::LogMessage msgs[] = {
CreateLogMessage({
.msg = "my message",
}),
CreateLogMessage({
.tags = fidl::VectorView<fidl::StringView>::FromExternal(tags),
.msg = "my message2",
}),
};
client->LogMany(fidl::VectorView<fuchsia_logger::wire::LogMessage>::FromExternal(msgs))
.ThenExactlyOnce(
[](fidl::WireUnownedResult<fuchsia_logger::LogListenerSafe::LogMany>& result) {
ASSERT_OK(result);
});
}
ASSERT_OK(loop.RunUntilIdle());
fflush(buf_file);
ASSERT_STREQ(R"([00093.892493][1024][1034][] INFO: my message
[00093.892493][1024][1034][tag1, tag2] INFO: my message2
)",
buf);
{
fidl::StringView tags[] = {"tag1"};
fuchsia_logger::wire::LogMessage msgs[] = {
CreateLogMessage({
.tags = fidl::VectorView<fidl::StringView>::FromExternal(tags),
.msg = "my message",
}),
};
client->LogMany(fidl::VectorView<fuchsia_logger::wire::LogMessage>::FromExternal(msgs))
.ThenExactlyOnce(
[](fidl::WireUnownedResult<fuchsia_logger::LogListenerSafe::LogMany>& result) {
ASSERT_OK(result);
});
}
ASSERT_OK(loop.RunUntilIdle());
fflush(buf_file);
ASSERT_STREQ(R"([00093.892493][1024][1034][] INFO: my message
[00093.892493][1024][1034][tag1, tag2] INFO: my message2
[00093.892493][1024][1034][tag1] INFO: my message
)",
buf);
}
TEST(LogListenerTests, TestDroppedLogs) {
auto [listener, listener_request] = fidl::Endpoints<fuchsia_logger::LogListenerSafe>::Create();
// We expect the log file to be much smaller than this.
char buf[1024];
memset(buf, 0, sizeof(buf));
FILE* buf_file = fmemopen(buf, sizeof(buf), "w");
// start listener
async::Loop loop(&kAsyncLoopConfigNeverAttachToThread);
LogExporter log_exporter(
buf_file, loop.dispatcher(), std::move(listener_request),
[](zx_status_t status) { EXPECT_STATUS(ZX_ERR_CANCELED, status); }, nullptr);
fidl::WireClient client{std::move(listener), loop.dispatcher()};
client
->Log(CreateLogMessage({
.dropped_logs = 1,
.msg = "my message1",
}))
.ThenExactlyOnce([](fidl::WireUnownedResult<fuchsia_logger::LogListenerSafe::Log>& result) {
ASSERT_OK(result);
});
ASSERT_OK(loop.RunUntilIdle());
client
->Log(CreateLogMessage({
.dropped_logs = 1,
.msg = "my message2",
}))
.ThenExactlyOnce([](fidl::WireUnownedResult<fuchsia_logger::LogListenerSafe::Log>& result) {
ASSERT_OK(result);
});
ASSERT_OK(loop.RunUntilIdle());
client
->Log(CreateLogMessage({
.pid = 1011,
.dropped_logs = 1,
.msg = "my message3",
}))
.ThenExactlyOnce([](fidl::WireUnownedResult<fuchsia_logger::LogListenerSafe::Log>& result) {
ASSERT_OK(result);
});
ASSERT_OK(loop.RunUntilIdle());
client
->Log(CreateLogMessage({
.pid = 1011,
.dropped_logs = 1,
.msg = "my message4",
}))
.ThenExactlyOnce([](fidl::WireUnownedResult<fuchsia_logger::LogListenerSafe::Log>& result) {
ASSERT_OK(result);
});
ASSERT_OK(loop.RunUntilIdle());
client
->Log(CreateLogMessage({
.pid = 1011,
.dropped_logs = 2,
.msg = "my message5",
}))
.ThenExactlyOnce([](fidl::WireUnownedResult<fuchsia_logger::LogListenerSafe::Log>& result) {
ASSERT_OK(result);
});
ASSERT_OK(loop.RunUntilIdle());
client
->Log(CreateLogMessage({
.dropped_logs = 2,
.msg = "my message6",
}))
.ThenExactlyOnce([](fidl::WireUnownedResult<fuchsia_logger::LogListenerSafe::Log>& result) {
ASSERT_OK(result);
});
ASSERT_OK(loop.RunUntilIdle());
fflush(buf_file);
ASSERT_STREQ(R"([00093.892493][1024][1034][] INFO: my message1
[00093.892493][1024][1034][] WARNING: Dropped logs count:1
[00093.892493][1024][1034][] INFO: my message2
[00093.892493][1011][1034][] INFO: my message3
[00093.892493][1011][1034][] WARNING: Dropped logs count:1
[00093.892493][1011][1034][] INFO: my message4
[00093.892493][1011][1034][] INFO: my message5
[00093.892493][1011][1034][] WARNING: Dropped logs count:2
[00093.892493][1024][1034][] INFO: my message6
[00093.892493][1024][1034][] WARNING: Dropped logs count:2
)",
buf);
}
TEST(LogListenerTests, TestBadOutputFile) {
auto [listener, listener_request] = fidl::Endpoints<fuchsia_logger::LogListenerSafe>::Create();
char buf[1024];
memset(buf, 0, sizeof(buf));
FILE* buf_file = fmemopen(buf, sizeof(buf), "r");
// start listener
async::Loop loop(&kAsyncLoopConfigNeverAttachToThread);
LogExporter log_exporter(
buf_file, loop.dispatcher(), std::move(listener_request),
[](zx_status_t status) { EXPECT_STATUS(ZX_ERR_ACCESS_DENIED, status); }, nullptr);
fidl::WireClient client{std::move(listener), loop.dispatcher()};
client
->Log(CreateLogMessage({
.msg = "my message",
}))
.ThenExactlyOnce([](fidl::WireUnownedResult<fuchsia_logger::LogListenerSafe::Log>& result) {
ASSERT_OK(result);
});
ASSERT_OK(loop.RunUntilIdle());
ASSERT_STREQ("", buf);
}
} // namespace
} // namespace runtests