#include <fidl/fuchsia.logger/cpp/fidl.h>
#include <cstring>
#include <optional>
#include <string_view>
#include "base/containers/contains.h"
#include "base/fuchsia/test_log_listener_safe.h"
#include "base/strings/stringprintf.h"
#include "fuchsia_web/common/test/frame_test_util.h"
#include "fuchsia_web/webengine/test/context_provider_for_test.h"
#include "fuchsia_web/webengine/test/isolated_archivist.h"
#include "fuchsia_web/webengine/web_engine_integration_test_base.h"
namespace {
constexpr char kLogTestPageFileName[] = "console_logging.html";
constexpr char kLogTestPageDebugMessage[] = "This is a debug() message.";
constexpr char kFrameLogTag[] = "Test🖼🪵";
constexpr char kNormalizedPortNumber[] = "678";
std::string NormalizeConsoleLogMessage(std::string_view original) {
const char kSchemePortColon[] = "http://127.0.0.1:";
size_t port_begin =
original.find(kSchemePortColon) + strlen(kSchemePortColon);
size_t path_begin = original.find("/", port_begin);
return std::string(original).replace(port_begin, path_begin - port_begin,
kNormalizedPortNumber);
}
}
class WebEngineIntegrationLoggingTest : public WebEngineIntegrationTestBase {
protected:
WebEngineIntegrationLoggingTest()
: isolated_archivist_(
*filtered_service_directory().outgoing_directory()) {}
~WebEngineIntegrationLoggingTest() override {
frame_.Unbind();
context_.Unbind();
}
void StartWebEngine(base::CommandLine command_line) override {
context_provider_.emplace(
ContextProviderForTest::Create(std::move(command_line)));
context_provider_->ptr().set_error_handler(
[](zx_status_t status) { FAIL() << zx_status_get_string(status); });
}
fuchsia::web::ContextProvider* GetContextProvider() override {
return context_provider_->get();
}
fidl::Client<fuchsia_logger::Log>& log() { return isolated_archivist_.log(); }
IsolatedArchivist isolated_archivist_;
std::optional<ContextProviderForTest> context_provider_;
};
TEST_F(WebEngineIntegrationLoggingTest, SetJavaScriptLogLevel_DEBUG) {
StartWebEngine(base::CommandLine(base::CommandLine::NO_PROGRAM));
base::SimpleTestLogListener log_listener;
log_listener.ListenToLog(log(), nullptr);
CreateContext(TestContextParams());
fuchsia::web::CreateFrameParams frame_params;
frame_params.set_debug_name(kFrameLogTag);
CreateFrameWithParams(std::move(frame_params));
frame_->SetJavaScriptLogLevel(fuchsia::web::ConsoleLogLevel::DEBUG);
ASSERT_NO_FATAL_FAILURE(LoadUrlAndExpectResponse(
embedded_test_server_.GetURL(std::string("/") + kLogTestPageFileName)
.spec()));
navigation_listener()->RunUntilTitleEquals("ended");
std::optional<fuchsia_logger::LogMessage> logged_message =
log_listener.RunUntilMessageReceived(kLogTestPageDebugMessage);
ASSERT_TRUE(logged_message.has_value());
EXPECT_EQ(logged_message->severity(),
static_cast<int32_t>(fuchsia_logger::LogLevelFilter::kDebug));
EXPECT_FALSE(logged_message->tags().empty());
EXPECT_TRUE(base::Contains(logged_message->tags(), kFrameLogTag));
EXPECT_EQ(NormalizeConsoleLogMessage(logged_message->msg()),
base::StringPrintf("[http://127.0.0.1:%s/console_logging.html(8)] "
"This is a debug() message.",
kNormalizedPortNumber));
}