Chromium Code Reviews| Index: content/renderer/p2p/filtering_network_manager_unittest.cc |
| diff --git a/content/renderer/p2p/filtering_network_manager_unittest.cc b/content/renderer/p2p/filtering_network_manager_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ed2387a0957e85fff23a0aed89db738f01fc2257 |
| --- /dev/null |
| +++ b/content/renderer/p2p/filtering_network_manager_unittest.cc |
| @@ -0,0 +1,356 @@ |
| +// Copyright 2015 The Chromium 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 "content/renderer/p2p/filtering_network_manager.h" |
| + |
| +#include "base/logging.h" |
| +#include "base/macros.h" |
| +#include "base/memory/ref_counted.h" |
| +#include "base/test/test_simple_task_runner.h" |
| +#include "base/thread_task_runner_handle.h" |
| +#include "content/renderer/p2p/empty_network_manager.h" |
| +#include "media/base/media_permission.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| +#include "third_party/webrtc/base/ipaddress.h" |
| + |
| +using NetworkList = rtc::NetworkManager::NetworkList; |
| + |
| +namespace { |
| + |
| +enum EventType { |
| + MIC_DENIED, // Receive mic permission denied. |
| + MIC_GRANTED, // Receive mic permission granted. |
| + CAMERA_DENIED, // Receive camera permission denied. |
| + CAMERA_GRANTED, // Receive camera permission granted. |
| + START_UPDATING, // Client calls StartUpdating() on FilteringNetworkManager. |
| + STOP_UPDATING, // Client calls StopUpdating() on FilteringNetworkManager. |
| + MOCK_NETWORKS_CHANGED, // MockNetworkManager has signaled networks changed |
| + // event. |
| +}; |
| + |
| +enum ResultType { |
| + NO_SIGNAL, // Do not expect SignalNetworksChanged fired. |
| + SIGNAL_ENUMERATION_BLOCKED, // Expect SignalNetworksChanged and |
| + // ENUMERATION_BLOCKED. |
| + SIGNAL_ENUMERATION_ALLOWED, // Expect SignalNetworksChanged and |
| + // ENUMERATION_ALLOWED. |
| +}; |
| + |
| +struct TestEntry { |
| + EventType event; |
| + ResultType expected_result; |
| +}; |
| + |
| +class MockNetworkManager : public rtc::NetworkManager { |
| + public: |
| + MockNetworkManager() { |
| + network_.reset(new rtc::Network("test_eth0", "Test Network Adapter 1", |
| + rtc::IPAddress(0x12345600U), 24, |
| + rtc::ADAPTER_TYPE_ETHERNET)); |
| + } |
| + // Mimic the current behavior that once the first signal is sent, any future |
| + // StartUpdating() will trigger another one. |
| + void StartUpdating() override { |
| + if (sent_first_update_) |
| + SignalNetworksChanged(); |
| + } |
| + void StopUpdating() override {} |
| + void GetNetworks(NetworkList* networks) const override { |
| + networks->push_back(network_.get()); |
| + } |
| + |
| + void SendNetworksChanged() { |
| + sent_first_update_ = true; |
| + SignalNetworksChanged(); |
| + } |
| + |
| + private: |
| + bool sent_first_update_ = false; |
| + scoped_ptr<rtc::Network> network_; |
| +}; |
| + |
| +class MockMediaPermission : public media::MediaPermission { |
| + public: |
| + MockMediaPermission() {} |
| + ~MockMediaPermission() override {} |
| + |
| + void RequestPermission( |
| + Type type, |
| + const GURL& security_origin, |
| + const PermissionStatusCB& permission_status_cb) override { |
| + NOTIMPLEMENTED(); |
| + } |
| + |
| + void HasPermission(Type type, |
| + const GURL& security_origin, |
| + const PermissionStatusCB& permission_status_cb) override { |
| + if (type == MediaPermission::AUDIO_CAPTURE) { |
| + DCHECK(mic_callback_.is_null()); |
| + mic_callback_ = permission_status_cb; |
| + } else { |
| + DCHECK(type == MediaPermission::VIDEO_CAPTURE); |
| + DCHECK(camera_callback_.is_null()); |
| + camera_callback_ = permission_status_cb; |
| + } |
| + } |
| + |
| + void SetMicPermission(bool granted) { |
| + if (mic_callback_.is_null()) |
| + return; |
| + |
| + mic_callback_.Run(granted); |
| + mic_callback_ = PermissionStatusCB(); |
| + } |
| + |
| + void SetCameraPermission(bool granted) { |
| + if (camera_callback_.is_null()) |
| + return; |
| + |
| + camera_callback_.Run(granted); |
| + camera_callback_ = PermissionStatusCB(); |
| + } |
| + |
| + private: |
| + PermissionStatusCB mic_callback_; |
| + PermissionStatusCB camera_callback_; |
| +}; |
| + |
| +} // namespace |
| + |
| +namespace content { |
| + |
| +class FilteringNetworkManagerTest : public testing::Test, |
| + public sigslot::has_slots<> { |
| + public: |
| + FilteringNetworkManagerTest() |
| + : task_runner_(new base::TestSimpleTaskRunner()) {} |
| + void SetupNetworkManager(bool multiple_routes_requested) { |
| + mock_network_manager_.reset(new MockNetworkManager()); |
| + |
| + scoped_ptr<MockMediaPermission> media_permission(new MockMediaPermission()); |
| + media_permission_ = media_permission.get(); |
| + |
| + if (multiple_routes_requested) { |
| + network_manager_.reset( |
| + new FilteringNetworkManager(mock_network_manager_.get(), task_runner_, |
| + GURL(), media_permission.Pass())); |
| + } else { |
| + network_manager_.reset(new EmptyNetworkManager()); |
|
Sergey Ulanov
2015/09/24 19:37:29
This is a test for FilteringNetworkManager. I don'
guoweis_left_chromium
2015/09/24 23:06:01
I do have a test case which just tests for this. S
|
| + } |
| + network_manager_->SignalNetworksChanged.connect( |
| + this, &FilteringNetworkManagerTest::OnNetworksChanged); |
| + } |
| + |
| + void RunTests(TestEntry* tests, size_t size) { |
| + for (size_t i = 0; i < size; ++i) { |
| + EXPECT_EQ(tests[i].expected_result, ProcessEvent(tests[i].event)) |
| + << " in step: " << i; |
| + } |
| + } |
| + |
| + ResultType ProcessEvent(EventType event) { |
| + clear_callback_called(); |
| + switch (event) { |
| + case MIC_DENIED: |
| + case MIC_GRANTED: |
| + media_permission_->SetMicPermission(event == MIC_GRANTED); |
| + break; |
| + case CAMERA_DENIED: |
| + case CAMERA_GRANTED: |
| + media_permission_->SetCameraPermission(event == CAMERA_GRANTED); |
| + break; |
| + case START_UPDATING: |
| + network_manager_->StartUpdating(); |
| + break; |
| + case STOP_UPDATING: |
| + network_manager_->StopUpdating(); |
| + break; |
| + case MOCK_NETWORKS_CHANGED: |
| + mock_network_manager_->SendNetworksChanged(); |
| + break; |
| + } |
| + |
| + while (task_runner_->HasPendingTask()) |
|
Sergey Ulanov
2015/09/24 19:37:29
task_runner_->RunUntilIdle()
guoweis_left_chromium
2015/09/24 23:06:01
Done.
|
| + task_runner_->RunPendingTasks(); |
| + |
| + if (!callback_called_) |
| + return NO_SIGNAL; |
| + |
| + if (network_manager_->enumeration_permission() == |
| + rtc::NetworkManager::ENUMERATION_BLOCKED) { |
| + EXPECT_EQ(0u, GetP2PNetworkList().size()); |
| + return SIGNAL_ENUMERATION_BLOCKED; |
| + } |
| + EXPECT_EQ(1u, GetP2PNetworkList().size()); |
| + return SIGNAL_ENUMERATION_ALLOWED; |
| + } |
| + |
| + protected: |
| + const NetworkList& GetP2PNetworkList() { |
| + network_list_.clear(); |
| + network_manager_->GetNetworks(&network_list_); |
| + return network_list_; |
| + } |
| + |
| + void OnNetworksChanged() { callback_called_ = true; } |
| + void clear_callback_called() { callback_called_ = false; } |
| + |
| + bool callback_called_ = false; |
| + scoped_ptr<rtc::NetworkManager> network_manager_; |
| + scoped_ptr<MockNetworkManager> mock_network_manager_; |
| + |
| + // Raw pointer to MockMediaPermission. It's owned by FilteringNetworkManager. |
| + MockMediaPermission* media_permission_ = nullptr; |
| + |
| + NetworkList network_list_; |
| + |
| + scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| +}; |
| + |
| +// Test that when multiple routes is not requested, SignalNetworksChanged is |
| +// fired right after the StartUpdating(). |
| +TEST_F(FilteringNetworkManagerTest, MultipleRoutesNotRequested) { |
| + SetupNetworkManager(false); |
| + TestEntry tests[] = { |
| + // Underneath network manager signals, no callback as StartUpdating() is |
| + // not called. |
| + {MOCK_NETWORKS_CHANGED, NO_SIGNAL}, |
| + // StartUpdating() is called, should receive callback as the multiple |
| + // routes is not requested. |
| + {START_UPDATING, SIGNAL_ENUMERATION_BLOCKED}, |
| + // Further network signal shouldn't trigger callback in |
| + // ENUMERATION_BLOCKED mode. |
| + {MOCK_NETWORKS_CHANGED, NO_SIGNAL}, |
| + // New StartUpdating() should trigger callback. |
| + {START_UPDATING, SIGNAL_ENUMERATION_BLOCKED}, |
| + {STOP_UPDATING, NO_SIGNAL}, |
| + {STOP_UPDATING, NO_SIGNAL}, |
| + {MOCK_NETWORKS_CHANGED, NO_SIGNAL}, |
| + }; |
| + |
| + RunTests(tests, arraysize(tests)); |
| +} |
| + |
| +// Test that multiple routes request is blocked and signaled right after |
| +// StartUpdating() since mic/camera permissions are denied. |
| +TEST_F(FilteringNetworkManagerTest, BlockMultipleRoutesByStartUpdating) { |
| + SetupNetworkManager(true); |
| + |
| + TestEntry tests[] = { |
| + {MOCK_NETWORKS_CHANGED, NO_SIGNAL}, |
| + // Both mic and camera are denied. |
| + {MIC_DENIED, NO_SIGNAL}, |
| + {CAMERA_DENIED, NO_SIGNAL}, |
| + // Once StartUpdating() is called, signal network changed event with |
| + // ENUMERATION_BLOCKED. |
| + {START_UPDATING, SIGNAL_ENUMERATION_BLOCKED}, |
| + // Further network signal shouldn't trigger callback. |
| + {MOCK_NETWORKS_CHANGED, NO_SIGNAL}, |
| + // New StartUpdating() should trigger callback. |
| + {START_UPDATING, SIGNAL_ENUMERATION_BLOCKED}, |
| + {STOP_UPDATING, NO_SIGNAL}, |
| + {STOP_UPDATING, NO_SIGNAL}, |
| + {MOCK_NETWORKS_CHANGED, NO_SIGNAL}, |
| + }; |
| + |
| + RunTests(tests, arraysize(tests)); |
| +} |
| + |
| +// Test that multiple routes request is blocked and signaled right after |
| +// last pending permission check is denied since StartUpdating() has been called |
| +// previously. |
| +TEST_F(FilteringNetworkManagerTest, BlockMultipleRoutesByPermissionsDenied) { |
| + SetupNetworkManager(true); |
| + |
| + TestEntry tests[] = { |
| + {START_UPDATING, NO_SIGNAL}, |
| + {MIC_DENIED, NO_SIGNAL}, |
| + // Once camera is denied, no need to wait for networkchanged event from |
| + // network_manager_. |
| + {CAMERA_DENIED, SIGNAL_ENUMERATION_BLOCKED}, |
| + {MOCK_NETWORKS_CHANGED, NO_SIGNAL}, |
| + {START_UPDATING, SIGNAL_ENUMERATION_BLOCKED}, |
| + {STOP_UPDATING, NO_SIGNAL}, |
| + {STOP_UPDATING, NO_SIGNAL}, |
| + {MOCK_NETWORKS_CHANGED, NO_SIGNAL}, |
| + }; |
| + |
| + RunTests(tests, arraysize(tests)); |
| +} |
| + |
| +// Test that multiple routes request is granted and signaled right after |
| +// a pending permission check is granted since StartUpdating() has been called |
| +// previously. |
| +TEST_F(FilteringNetworkManagerTest, AllowMultipleRoutesByPermissionsGranted) { |
| + SetupNetworkManager(true); |
| + |
| + TestEntry tests[] = { |
| + {START_UPDATING, NO_SIGNAL}, |
| + {MIC_DENIED, NO_SIGNAL}, |
| + {MOCK_NETWORKS_CHANGED, NO_SIGNAL}, |
| + // Once one media type is granted, signal networkschanged with |
| + // ENUMERATION_ALLOWED. |
| + {CAMERA_GRANTED, SIGNAL_ENUMERATION_ALLOWED}, |
| + {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_ALLOWED}, |
| + {START_UPDATING, SIGNAL_ENUMERATION_ALLOWED}, |
| + {STOP_UPDATING, NO_SIGNAL}, |
| + // If there is any outstanding StartUpdating(), new event from underneath |
| + // network manger should trigger SignalNetworksChanged. |
| + {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_ALLOWED}, |
| + {STOP_UPDATING, NO_SIGNAL}, |
| + // No outstanding StartUpdating(), no more signal. |
| + {MOCK_NETWORKS_CHANGED, NO_SIGNAL}, |
| + }; |
| + |
| + RunTests(tests, arraysize(tests)); |
| +} |
| + |
| +// Test that multiple routes request is granted and signaled right after |
| +// StartUpdating() since there is at least one media permission granted. |
| +TEST_F(FilteringNetworkManagerTest, AllowMultipleRoutesByStartUpdating) { |
| + SetupNetworkManager(true); |
| + |
| + TestEntry tests[] = { |
| + {MIC_DENIED, NO_SIGNAL}, |
| + {MOCK_NETWORKS_CHANGED, NO_SIGNAL}, |
| + {CAMERA_GRANTED, NO_SIGNAL}, |
| + // StartUpdating() should trigger the event since at least one media is |
| + // granted and network information is populated. |
| + {START_UPDATING, SIGNAL_ENUMERATION_ALLOWED}, |
| + {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_ALLOWED}, |
| + {START_UPDATING, SIGNAL_ENUMERATION_ALLOWED}, |
| + {STOP_UPDATING, NO_SIGNAL}, |
| + {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_ALLOWED}, |
| + {STOP_UPDATING, NO_SIGNAL}, |
| + {MOCK_NETWORKS_CHANGED, NO_SIGNAL}, |
| + }; |
| + |
| + RunTests(tests, arraysize(tests)); |
| +} |
| + |
| +// Test that multiple routes request is granted and signaled right after |
| +// underneath NetworkManager's SignalNetworksChanged() as at least one |
| +// permission is granted and StartUpdating() has been called. |
| +TEST_F(FilteringNetworkManagerTest, AllowMultipleRoutesByNetworksChanged) { |
| + SetupNetworkManager(true); |
| + |
| + TestEntry tests[] = { |
| + {START_UPDATING, NO_SIGNAL}, |
| + {CAMERA_GRANTED, NO_SIGNAL}, |
| + // Underneath network manager's signal networks changed should trigger |
| + // SignalNetworksChanged with ENUMERATION_ALLOWED. |
| + {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_ALLOWED}, |
| + {MIC_DENIED, NO_SIGNAL}, |
| + {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_ALLOWED}, |
| + {START_UPDATING, SIGNAL_ENUMERATION_ALLOWED}, |
| + {STOP_UPDATING, NO_SIGNAL}, |
| + {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_ALLOWED}, |
| + {STOP_UPDATING, NO_SIGNAL}, |
| + {MOCK_NETWORKS_CHANGED, NO_SIGNAL}, |
| + }; |
| + |
| + RunTests(tests, arraysize(tests)); |
| +} |
| + |
| +} // namespace content |