12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_state_notifier.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/root_window_controller.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/shell.h"
10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/system/chromeos/network/network_connect.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/status_area_widget.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/test/ash_test_base.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/shill_device_client.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/shill_service_client.h"
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/login/login_state.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chromeos/network/network_handler.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/message_center/message_center.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ash::SystemTray* GetSystemTray() {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ash::Shell::GetPrimaryRootWindowController()->shelf()->
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      status_area_widget()->system_tray();
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::DBusThreadManager;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::ShillDeviceClient;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::ShillServiceClient;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ash {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetworkStateNotifierTest : public AshTestBase {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkStateNotifierTest() {}
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~NetworkStateNotifierTest() {}
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DBusThreadManager::InitializeWithStub();
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    chromeos::LoginState::Initialize();
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetupDefaultShillState();
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    chromeos::NetworkHandler::Initialize();
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RunAllPendingInMessageLoop();
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AshTestBase::SetUp();
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AshTestBase::TearDown();
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    chromeos::LoginState::Shutdown();
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    chromeos::NetworkHandler::Shutdown();
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DBusThreadManager::Shutdown();
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetupDefaultShillState() {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RunAllPendingInMessageLoop();
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShillDeviceClient::TestInterface* device_test =
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DBusThreadManager::Get()->GetShillDeviceClient()->GetTestInterface();
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    device_test->ClearDevices();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    device_test->AddDevice("/device/stub_wifi_device1",
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                           shill::kTypeWifi, "stub_wifi_device1");
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    device_test->AddDevice("/device/stub_cellular_device1",
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                           shill::kTypeCellular, "stub_cellular_device1");
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShillServiceClient::TestInterface* service_test =
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface();
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    service_test->ClearServices();
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const bool add_to_watchlist = true;
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const bool add_to_visible = true;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Create wifi and cellular networks and set to online.
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    service_test->AddService("wifi1", "wifi1",
7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             shill::kTypeWifi, shill::kStateIdle,
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                             add_to_visible, add_to_watchlist);
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    service_test->SetServiceProperty("wifi1",
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                     shill::kSecurityProperty,
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                     base::StringValue(shill::kSecurityWep));
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    service_test->SetServiceProperty("wifi1",
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                     shill::kConnectableProperty,
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                     base::FundamentalValue(true));
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    service_test->SetServiceProperty("wifi1",
8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                     shill::kPassphraseProperty,
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                     base::StringValue("failure"));
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RunAllPendingInMessageLoop();
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NetworkStateNotifierTest);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(NetworkStateNotifierTest, ConnectionFailure) {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(GetSystemTray()->HasNotificationBubble());
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ash::network_connect::ConnectToNetwork("wifi1", NULL /* owning_window */);
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RunAllPendingInMessageLoop();
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Failure should spawn a notification.
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  message_center::MessageCenter* message_center =
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      message_center::MessageCenter::Get();
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(message_center->HasNotification(
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      network_connect::kNetworkConnectNotificationId));
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace test
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ash
108