net_log_proxy_sink_unittest.cc 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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 "services/network/net_log_proxy_sink.h"
  5. #include "base/run_loop.h"
  6. #include "base/task/thread_pool.h"
  7. #include "base/test/task_environment.h"
  8. #include "net/log/test_net_log.h"
  9. #include "testing/gtest/include/gtest/gtest.h"
  10. namespace {
  11. class FakeNetLogProxySource : public network::mojom::NetLogProxySource {
  12. public:
  13. explicit FakeNetLogProxySource(
  14. mojo::PendingReceiver<network::mojom::NetLogProxySource>
  15. proxy_source_receiver)
  16. : proxy_source_receiver_(this, std::move(proxy_source_receiver)),
  17. run_loop_(std::make_unique<base::RunLoop>()) {}
  18. FakeNetLogProxySource(const FakeNetLogProxySource&) = delete;
  19. FakeNetLogProxySource& operator=(const FakeNetLogProxySource&) = delete;
  20. // mojom::NetLogProxySource:
  21. void UpdateCaptureModes(net::NetLogCaptureModeSet modes) override {
  22. EXPECT_FALSE(already_stored_last_modes_);
  23. already_stored_last_modes_ = true;
  24. last_modes_ = modes;
  25. run_loop_->Quit();
  26. }
  27. net::NetLogCaptureModeSet WaitForUpdateCaptureModes() {
  28. run_loop_->Run();
  29. EXPECT_TRUE(already_stored_last_modes_);
  30. already_stored_last_modes_ = false;
  31. net::NetLogCaptureModeSet last_modes = last_modes_;
  32. last_modes_ = 0;
  33. run_loop_ = std::make_unique<base::RunLoop>();
  34. return last_modes;
  35. }
  36. private:
  37. mojo::Receiver<network::mojom::NetLogProxySource> proxy_source_receiver_;
  38. bool already_stored_last_modes_ = false;
  39. std::unique_ptr<base::RunLoop> run_loop_;
  40. net::NetLogCaptureModeSet last_modes_;
  41. };
  42. void CreateObserver(std::unique_ptr<net::RecordingNetLogObserver>* out_observer,
  43. net::NetLogCaptureMode capture_mode) {
  44. *out_observer = std::make_unique<net::RecordingNetLogObserver>(capture_mode);
  45. }
  46. void DestroyObserver(
  47. std::unique_ptr<net::RecordingNetLogObserver>* out_observer) {
  48. out_observer->reset();
  49. }
  50. } // namespace
  51. TEST(NetLogProxySink, TestMultipleObservers) {
  52. base::test::TaskEnvironment scoped_task_environment;
  53. network::NetLogProxySink net_log_sink;
  54. mojo::PendingRemote<network::mojom::NetLogProxySource> proxy_source_remote;
  55. mojo::PendingReceiver<network::mojom::NetLogProxySource>
  56. proxy_source_receiver =
  57. proxy_source_remote.InitWithNewPipeAndPassReceiver();
  58. mojo::Remote<network::mojom::NetLogProxySink> proxy_sink_remote;
  59. FakeNetLogProxySource net_log_proxy_source(std::move(proxy_source_receiver));
  60. net_log_sink.AttachSource(std::move(proxy_source_remote),
  61. proxy_sink_remote.BindNewPipeAndPassReceiver());
  62. // Attaching should notify with the current capture modeset.
  63. EXPECT_EQ(0U, net_log_proxy_source.WaitForUpdateCaptureModes());
  64. std::unique_ptr<net::RecordingNetLogObserver> net_log_observer1 =
  65. std::make_unique<net::RecordingNetLogObserver>(
  66. net::NetLogCaptureMode::kIncludeSensitive);
  67. EXPECT_EQ(
  68. net::NetLogCaptureModeToBit(net::NetLogCaptureMode::kIncludeSensitive),
  69. net_log_proxy_source.WaitForUpdateCaptureModes());
  70. std::unique_ptr<net::RecordingNetLogObserver> net_log_observer2;
  71. {
  72. // Create observer2 on a different thread.
  73. base::RunLoop run_loop;
  74. base::ThreadPool::PostTaskAndReply(
  75. FROM_HERE,
  76. base::BindOnce(&CreateObserver, &net_log_observer2,
  77. net::NetLogCaptureMode::kDefault),
  78. run_loop.QuitClosure());
  79. run_loop.Run();
  80. }
  81. EXPECT_EQ(
  82. net::NetLogCaptureModeToBit(net::NetLogCaptureMode::kIncludeSensitive) |
  83. net::NetLogCaptureModeToBit(net::NetLogCaptureMode::kDefault),
  84. net_log_proxy_source.WaitForUpdateCaptureModes());
  85. base::RunLoop add_entry_runloop;
  86. net_log_observer1->SetThreadsafeAddEntryCallback(
  87. add_entry_runloop.QuitClosure());
  88. base::TimeTicks source1_start_time =
  89. base::TimeTicks() + base::Milliseconds(10);
  90. base::TimeTicks source1_event0_time =
  91. source1_start_time + base::Milliseconds(1);
  92. base::Value source1_event0_params(base::Value::Type::DICTIONARY);
  93. source1_event0_params.SetStringKey("hello", "world");
  94. proxy_sink_remote->AddEntry(
  95. static_cast<uint32_t>(net::NetLogEventType::REQUEST_ALIVE),
  96. static_cast<uint32_t>(net::NetLogSourceType::URL_REQUEST), 1U,
  97. source1_start_time, net::NetLogEventPhase::BEGIN, source1_event0_time,
  98. source1_event0_params.Clone());
  99. add_entry_runloop.Run();
  100. auto entries = net_log_observer1->GetEntries();
  101. ASSERT_EQ(1U, entries.size());
  102. EXPECT_EQ(net::NetLogEventType::REQUEST_ALIVE, entries[0].type);
  103. EXPECT_EQ(net::NetLogSourceType::URL_REQUEST, entries[0].source.type);
  104. EXPECT_EQ(1U, entries[0].source.id);
  105. EXPECT_EQ(source1_start_time, entries[0].source.start_time);
  106. EXPECT_EQ(net::NetLogEventPhase::BEGIN, entries[0].phase);
  107. EXPECT_EQ(source1_event0_time, entries[0].time);
  108. EXPECT_TRUE(entries[0].HasParams());
  109. EXPECT_EQ(source1_event0_params, entries[0].params);
  110. auto entries2 = net_log_observer2->GetEntries();
  111. ASSERT_EQ(1U, entries2.size());
  112. EXPECT_EQ(entries[0].type, entries2[0].type);
  113. EXPECT_EQ(entries[0].source.type, entries2[0].source.type);
  114. EXPECT_EQ(entries[0].source.id, entries2[0].source.id);
  115. EXPECT_EQ(entries[0].source.start_time, entries2[0].source.start_time);
  116. EXPECT_EQ(entries[0].phase, entries2[0].phase);
  117. EXPECT_EQ(entries[0].time, entries2[0].time);
  118. EXPECT_EQ(entries[0].params, entries2[0].params);
  119. net_log_observer1.reset();
  120. EXPECT_EQ(net::NetLogCaptureModeToBit(net::NetLogCaptureMode::kDefault),
  121. net_log_proxy_source.WaitForUpdateCaptureModes());
  122. // Destroy observer2 on a different thread.
  123. base::ThreadPool::PostTask(
  124. FROM_HERE, base::BindOnce(DestroyObserver, &net_log_observer2));
  125. EXPECT_EQ(0U, net_log_proxy_source.WaitForUpdateCaptureModes());
  126. }
  127. TEST(NetLogProxySink, TestAttachAfterObserverAdded) {
  128. base::test::TaskEnvironment scoped_task_environment;
  129. // Start observing before creating/attaching the net log proxy.
  130. std::unique_ptr<net::RecordingNetLogObserver> net_log_observer1 =
  131. std::make_unique<net::RecordingNetLogObserver>(
  132. net::NetLogCaptureMode::kIncludeSensitive);
  133. network::NetLogProxySink net_log_sink;
  134. mojo::PendingRemote<network::mojom::NetLogProxySource> proxy_source_remote;
  135. mojo::PendingReceiver<network::mojom::NetLogProxySource>
  136. proxy_source_receiver =
  137. proxy_source_remote.InitWithNewPipeAndPassReceiver();
  138. mojo::Remote<network::mojom::NetLogProxySink> proxy_sink_remote;
  139. FakeNetLogProxySource net_log_proxy_source(std::move(proxy_source_receiver));
  140. net_log_sink.AttachSource(std::move(proxy_source_remote),
  141. proxy_sink_remote.BindNewPipeAndPassReceiver());
  142. // Attaching should notify with the current capture modeset.
  143. EXPECT_EQ(
  144. net::NetLogCaptureModeToBit(net::NetLogCaptureMode::kIncludeSensitive),
  145. net_log_proxy_source.WaitForUpdateCaptureModes());
  146. net_log_observer1.reset();
  147. EXPECT_EQ(0U, net_log_proxy_source.WaitForUpdateCaptureModes());
  148. }