wifi_test.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <stdio.h> 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <string> 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/at_exit.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/bind.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/cancelable_callback.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/command_line.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/file_util.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/logging.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/message_loop/message_loop.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/string_split.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/string_util.h" 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/stringprintf.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/time/time.h" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/wifi/wifi_service.h" 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_MACOSX) 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/mac/scoped_nsautorelease_pool.h" 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace wifi { 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class WiFiTest { 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WiFiTest() {} 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ~WiFiTest() {} 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) enum Result { 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RESULT_ERROR = -2, 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RESULT_WRONG_USAGE = -1, 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RESULT_OK = 0, 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RESULT_PENDING = 1, 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Result Main(int argc, const char* argv[]); 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool ParseCommandLine(int argc, const char* argv[]); 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Start() {} 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Finish(Result result) { 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK_NE(RESULT_PENDING, result); 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result_ = result; 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (base::MessageLoop::current()) 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::MessageLoop::current()->Quit(); 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_MACOSX) 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Without this there will be a mem leak on osx. 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::mac::ScopedNSAutoreleasePool scoped_pool_; 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Need AtExitManager to support AsWeakPtr (in NetLog). 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::AtExitManager exit_manager_; 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Result result_; 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)WiFiTest::Result WiFiTest::Main(int argc, const char* argv[]) { 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!ParseCommandLine(argc, argv)) { 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "Usage: " << argv[0] << 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " [--list]" 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " [--get_properties]" 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " [--connect]" 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " [--disconnect]" 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " [--network_guid=<network_guid>]" 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " [--frequency=0|2400|5000]" 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " [<network_guid>]\n"; 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return RESULT_WRONG_USAGE; 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::MessageLoopForIO loop; 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result_ = RESULT_PENDING; 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return result_; 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool WiFiTest::ParseCommandLine(int argc, const char* argv[]) { 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CommandLine::Init(argc, argv); 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string network_guid = 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) parsed_command_line.GetSwitchValueASCII("network_guid"); 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string frequency = 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) parsed_command_line.GetSwitchValueASCII("frequency"); 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parsed_command_line.GetArgs().size() == 1) { 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) network_guid = WideToASCII(parsed_command_line.GetArgs()[0]); 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) network_guid = parsed_command_line.GetArgs()[0]; 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parsed_command_line.HasSwitch("debug")) 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MessageBoxA(NULL, __FUNCTION__, "Debug Me!", MB_OK); 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WiFiService> wifi_service(WiFiService::Create()); 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WiFiService> wifi_service(WiFiService::CreateForTest()); 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) wifi_service->Initialize(NULL); 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parsed_command_line.HasSwitch("list")) { 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ListValue network_list; 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) wifi_service->GetVisibleNetworks(std::string(), &network_list); 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << network_list; 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parsed_command_line.HasSwitch("get_properties")) { 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (network_guid.length() > 0) { 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DictionaryValue properties; 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string error; 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) wifi_service->GetProperties(network_guid, &properties, &error); 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << error << ":\n" << properties; 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Optional properties (frequency, password) to use for connect. 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<DictionaryValue> connect_properties(new DictionaryValue()); 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (parsed_command_line.HasSwitch("frequency")) { 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int value = 0; 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!network_guid.empty() && 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !frequency.empty() && 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::StringToInt(frequency, &value)) { 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) connect_properties->SetInteger("WiFi.Frequency", value); 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // fall through to connect. 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parsed_command_line.HasSwitch("connect")) { 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (network_guid.length() > 0) { 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string error; 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!connect_properties->empty()) { 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << "Using connect properties: " << *connect_properties; 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) wifi_service->SetProperties(network_guid, 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) connect_properties.Pass(), 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &error); 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) wifi_service->StartConnect(network_guid, &error); 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << error; 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parsed_command_line.HasSwitch("disconnect")) { 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (network_guid.length() > 0) { 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string error; 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) wifi_service->StartDisconnect(network_guid, &error); 162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) VLOG(0) << error; 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace wifi 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int main(int argc, const char* argv[]) { 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CommandLine::Init(argc, argv); 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) logging::LoggingSettings settings; 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) logging::InitLogging(settings); 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) wifi::WiFiTest wifi_test; 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return wifi_test.Main(argc, argv); 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 181