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