15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/tests/test_network_monitor.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ppapi/cpp/completion_callback.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/instance_handle.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module.h" 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ppapi/cpp/net_address.h" 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/cpp/network_list.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/cpp/network_monitor.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_utils.h" 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/tests/testing_instance.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)REGISTER_TEST_CASE(NetworkMonitor); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class MonitorDeletionCallbackDelegate 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : public TestCompletionCallback::Delegate { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) explicit MonitorDeletionCallbackDelegate(pp::NetworkMonitor* monitor) 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : monitor_(monitor) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TestCompletionCallback::Delegate interface. 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnCallback(void* user_data, int32_t result) { 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) delete monitor_; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) pp::NetworkMonitor* monitor_; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TestNetworkMonitor::TestNetworkMonitor(TestingInstance* instance) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : TestCase(instance) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool TestNetworkMonitor::Init() { 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!pp::NetworkMonitor::IsAvailable()) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CheckTestingInterface(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void TestNetworkMonitor::RunTests(const std::string& filter) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST_FORCEASYNC_AND_NOT(Basic, filter); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST_FORCEASYNC_AND_NOT(2Monitors, filter); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST_FORCEASYNC_AND_NOT(DeleteInCallback, filter); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)std::string TestNetworkMonitor::VerifyNetworkList( 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const pp::NetworkList& network_list) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that there is at least one network interface. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t count = network_list.GetCount(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(count >= 1U); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterate over all interfaces and verify their properties. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t iface = 0; iface < count; ++iface) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the first interface has at least one address. 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::vector<pp::NetAddress> addresses; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_list.GetIpAddresses(iface, &addresses); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(addresses.size() >= 1U); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the addresses are valid. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < addresses.size(); ++i) { 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PP_NetAddress_Family family = addresses[i].GetFamily(); 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (family) { 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case PP_NETADDRESS_FAMILY_IPV4: { 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PP_NetAddress_IPv4 ipv4; 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(addresses[i].DescribeAsIPv4Address(&ipv4)); 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the address is not zero. 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool all_zeros = true; 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t j = 0; j < sizeof(ipv4.addr); ++j) { 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (ipv4.addr[j] != 0) { 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) all_zeros = false; 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(!all_zeros); 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that port is set to 0. 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(ipv4.port == 0); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case PP_NETADDRESS_FAMILY_IPV6: { 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PP_NetAddress_IPv6 ipv6; 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(addresses[i].DescribeAsIPv6Address(&ipv6)); 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the address is not zero. 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool all_zeros = true; 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t j = 0; j < sizeof(ipv6.addr); ++j) { 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (ipv6.addr[j] != 0) { 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) all_zeros = false; 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(!all_zeros); 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that port is set to 0. 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(ipv6.port == 0); 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) default: 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(false); 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that each interface has a unique name and a display name. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(network_list.GetName(iface).empty()); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(network_list.GetDisplayName(iface).empty()); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PP_NetworkList_Type type = network_list.GetType(iface); 12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(type >= PP_NETWORKLIST_TYPE_UNKNOWN); 12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(type <= PP_NETWORKLIST_TYPE_CELLULAR); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PP_NetworkList_State state = network_list.GetState(iface); 12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(state >= PP_NETWORKLIST_STATE_DOWN); 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(state <= PP_NETWORKLIST_STATE_UP); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)std::string TestNetworkMonitor::TestBasic() { 13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) TestCompletionCallbackWithOutput<pp::NetworkList> test_callback( 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) instance_->pp_instance()); 13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) pp::NetworkMonitor network_monitor(instance_); 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) test_callback.WaitForResult( 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) network_monitor.UpdateNetworkList(test_callback.GetCallback())); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(PP_OK, test_callback.result()); 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_SUBTEST_SUCCESS(VerifyNetworkList(test_callback.output())); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)std::string TestNetworkMonitor::Test2Monitors() { 14768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) TestCompletionCallbackWithOutput<pp::NetworkList> test_callback( 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) instance_->pp_instance()); 14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) pp::NetworkMonitor network_monitor(instance_); 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) test_callback.WaitForResult( 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) network_monitor.UpdateNetworkList(test_callback.GetCallback())); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(PP_OK, test_callback.result()); 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_SUBTEST_SUCCESS(VerifyNetworkList(test_callback.output())); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) TestCompletionCallbackWithOutput<pp::NetworkList> test_callback_2( 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) instance_->pp_instance()); 15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) pp::NetworkMonitor network_monitor_2(instance_); 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) test_callback_2.WaitForResult( 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) network_monitor_2.UpdateNetworkList(test_callback_2.GetCallback())); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(PP_OK, test_callback_2.result()); 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_SUBTEST_SUCCESS(VerifyNetworkList(test_callback_2.output())); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)std::string TestNetworkMonitor::TestDeleteInCallback() { 16968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) pp::NetworkMonitor* network_monitor = 17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new pp::NetworkMonitor(instance_); 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MonitorDeletionCallbackDelegate deletion_delegate(network_monitor); 17268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) TestCompletionCallbackWithOutput<pp::NetworkList> test_callback( 17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) instance_->pp_instance()); 17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) test_callback.SetDelegate(&deletion_delegate); 17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) test_callback.WaitForResult( 17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) network_monitor->UpdateNetworkList(test_callback.GetCallback())); 17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(PP_OK, test_callback.result()); 17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_SUBTEST_SUCCESS(VerifyNetworkList(test_callback.output())); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 183