logger_impl_unittest.cc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/media_router/browser/logger_impl.h"
  5. #include "base/i18n/time_formatting.h"
  6. #include "base/json/json_reader.h"
  7. #include "base/strings/utf_string_conversions.h"
  8. #include "base/values.h"
  9. #include "components/media_router/common/mojom/logger.mojom-shared.h"
  10. #include "testing/gmock/include/gmock/gmock.h"
  11. #include "testing/gtest/include/gtest/gtest.h"
  12. namespace media_router {
  13. constexpr char kComponent[] = "MyComponent";
  14. constexpr char kMessage[] = "My message";
  15. constexpr char kSinkId[] = "sink-12345";
  16. constexpr char kMediaSource[] = "cast:ABCDEFGH";
  17. constexpr char kSessionId[] = "session-67890";
  18. class LoggerImplTest : public testing::Test {
  19. protected:
  20. void LogInfoWithSinkId(const std::string& sink_id) {
  21. logger_.LogInfo(mojom::LogCategory::kRoute, kComponent, kMessage, sink_id,
  22. kMediaSource, kSessionId);
  23. }
  24. void LogWarningWithSessionId(const std::string& session_id) {
  25. logger_.LogWarning(mojom::LogCategory::kRoute, kComponent, kMessage,
  26. kSinkId, kMediaSource, session_id);
  27. }
  28. void LogErrorWithSource(const std::string& media_source) {
  29. logger_.LogError(mojom::LogCategory::kRoute, kComponent, kMessage, kSinkId,
  30. media_source, kSessionId);
  31. }
  32. std::string GetSinkId(const std::string& logs_json) {
  33. return GetAttributeOfFirstEntry(logs_json, "sinkId");
  34. }
  35. std::string GetSessionId(const std::string& logs_json) {
  36. return GetAttributeOfFirstEntry(logs_json, "sessionId");
  37. }
  38. std::string GetMediaSource(const std::string& logs_json) {
  39. return GetAttributeOfFirstEntry(logs_json, "mediaSource");
  40. }
  41. LoggerImpl logger_;
  42. private:
  43. std::string GetAttributeOfFirstEntry(const std::string& logs_json,
  44. const std::string& attribute) {
  45. base::Value logs = base::JSONReader::Read(logs_json).value();
  46. return *logs.GetListDeprecated()[0].FindStringKey(attribute);
  47. }
  48. };
  49. TEST_F(LoggerImplTest, RecordAndGetLogs) {
  50. const base::Time time1 = base::Time::Now();
  51. const base::Time time2 = time1 + base::Seconds(20);
  52. const std::string expected_logs =
  53. R"([
  54. {
  55. "severity": "Error",
  56. "category": "Route",
  57. "time": ")" +
  58. base::UTF16ToUTF8(base::TimeFormatTimeOfDayWithMilliseconds(time1)) +
  59. R"(",
  60. "component": "MyComponent",
  61. "message": "My message",
  62. "sinkId": "2345",
  63. "mediaSource": "cast:ABCDEFGH",
  64. "sessionId": "7890"
  65. },
  66. {
  67. "severity": "Info",
  68. "category": "UI",
  69. "time": ")" +
  70. base::UTF16ToUTF8(base::TimeFormatTimeOfDayWithMilliseconds(time2)) +
  71. R"(",
  72. "component": "Component 2",
  73. "message": "Message 2",
  74. "sinkId": "efgh",
  75. "mediaSource": "cast:IJKLMNOP",
  76. "sessionId": "wxyz"
  77. }
  78. ])";
  79. logger_.Log(LoggerImpl::Severity::kError, mojom::LogCategory::kRoute, time1,
  80. kComponent, kMessage, kSinkId, kMediaSource, kSessionId);
  81. logger_.Log(LoggerImpl::Severity::kInfo, mojom::LogCategory::kUi, time2,
  82. "Component 2", "Message 2", "sink-abcdefgh", "cast:IJKLMNOP",
  83. "session-stuvwxyz");
  84. const std::string logs = logger_.GetLogsAsJson();
  85. EXPECT_EQ(base::JSONReader::Read(logs),
  86. base::JSONReader::Read(expected_logs));
  87. }
  88. TEST_F(LoggerImplTest, TruncateSinkId) {
  89. LogInfoWithSinkId(kSinkId);
  90. const std::string logs = logger_.GetLogsAsJson();
  91. EXPECT_EQ(GetSinkId(logs), "2345");
  92. }
  93. TEST_F(LoggerImplTest, TruncateSessionId) {
  94. LogWarningWithSessionId(kSessionId);
  95. const std::string logs = logger_.GetLogsAsJson();
  96. EXPECT_EQ(GetSessionId(logs), "7890");
  97. }
  98. TEST_F(LoggerImplTest, HandleMirroringMediaSource) {
  99. // A mirroring source should get logged as-is.
  100. const std::string source = "urn:x-org.chromium.media:source:tab:*";
  101. LogErrorWithSource(source);
  102. const std::string logs = logger_.GetLogsAsJson();
  103. EXPECT_EQ(GetMediaSource(logs), source);
  104. }
  105. TEST_F(LoggerImplTest, TrimCastMediaSource) {
  106. LogErrorWithSource("cast:ABCDEFGH?a=b&c=d");
  107. const std::string logs = logger_.GetLogsAsJson();
  108. EXPECT_EQ(GetMediaSource(logs), "cast:ABCDEFGH");
  109. }
  110. TEST_F(LoggerImplTest, TrimPresentationMediaSource) {
  111. LogErrorWithSource("https://presentation.example.com/receiver.html?a=b");
  112. const std::string logs = logger_.GetLogsAsJson();
  113. EXPECT_EQ(GetMediaSource(logs), "https://presentation.example.com/");
  114. }
  115. } // namespace media_router