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