blob: 02d6d1abc93783764fdd3aaecb5aa73ac1396b11 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stddef.h>
#include <map>
#include <memory>
#include <utility>
#include <vector>
#include "base/command_line.h"
#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "build/build_config.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/onc/onc_constants.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/api/networking_private/networking_private_delegate.h"
#include "extensions/browser/api/networking_private/networking_private_delegate_factory.h"
#include "extensions/common/switches.h"
namespace extensions {
// This tests just the interface for the networkingPrivate API, i.e. it ensures
// that the delegate methods are called as expected.
// The implementations (which differ significantly between chromeos and
// windows/mac) are tested independently in
// networking_private_[chromeos|service_client]_apitest.cc.
// See also crbug.com/460119.
namespace {
const char kFailure[] = "Failure";
const char kSuccess[] = "Success";
const char kGuid[] = "SOME_GUID";
class TestDelegate : public NetworkingPrivateDelegate {
public:
explicit TestDelegate(std::unique_ptr<VerifyDelegate> verify_delegate)
: NetworkingPrivateDelegate(std::move(verify_delegate)), fail_(false) {}
~TestDelegate() override {}
// Asynchronous methods
void GetProperties(const std::string& guid,
const DictionaryCallback& success_callback,
const FailureCallback& failure_callback) override {
DictionaryResult(guid, success_callback, failure_callback);
}
void GetManagedProperties(const std::string& guid,
const DictionaryCallback& success_callback,
const FailureCallback& failure_callback) override {
DictionaryResult(guid, success_callback, failure_callback);
}
void GetState(const std::string& guid,
const DictionaryCallback& success_callback,
const FailureCallback& failure_callback) override {
DictionaryResult(guid, success_callback, failure_callback);
}
void SetProperties(const std::string& guid,
std::unique_ptr<base::DictionaryValue> properties,
const VoidCallback& success_callback,
const FailureCallback& failure_callback) override {
VoidResult(success_callback, failure_callback);
}
void CreateNetwork(bool shared,
std::unique_ptr<base::DictionaryValue> properties,
const StringCallback& success_callback,
const FailureCallback& failure_callback) override {
StringResult(success_callback, failure_callback);
}
void ForgetNetwork(const std::string& guid,
const VoidCallback& success_callback,
const FailureCallback& failure_callback) override {
VoidResult(success_callback, failure_callback);
}
void GetNetworks(const std::string& network_type,
bool configured_only,
bool visible_only,
int limit,
const NetworkListCallback& success_callback,
const FailureCallback& failure_callback) override {
if (fail_) {
failure_callback.Run(kFailure);
} else {
std::unique_ptr<base::ListValue> result(new base::ListValue);
std::unique_ptr<base::DictionaryValue> network(new base::DictionaryValue);
network->SetString(::onc::network_config::kType,
::onc::network_config::kEthernet);
network->SetString(::onc::network_config::kGUID, kGuid);
result->Append(std::move(network));
success_callback.Run(std::move(result));
}
}
void StartConnect(const std::string& guid,
const VoidCallback& success_callback,
const FailureCallback& failure_callback) override {
VoidResult(success_callback, failure_callback);
}
void StartDisconnect(const std::string& guid,
const VoidCallback& success_callback,
const FailureCallback& failure_callback) override {
VoidResult(success_callback, failure_callback);
}
void StartActivate(const std::string& guid,
const std::string& carrier,
const VoidCallback& success_callback,
const FailureCallback& failure_callback) override {
VoidResult(success_callback, failure_callback);
}
void SetWifiTDLSEnabledState(
const std::string& ip_or_mac_address,
bool enabled,
const StringCallback& success_callback,
const FailureCallback& failure_callback) override {
StringResult(success_callback, failure_callback);
}
void GetWifiTDLSStatus(const std::string& ip_or_mac_address,
const StringCallback& success_callback,
const FailureCallback& failure_callback) override {
StringResult(success_callback, failure_callback);
}
void GetCaptivePortalStatus(
const std::string& guid,
const StringCallback& success_callback,
const FailureCallback& failure_callback) override {
StringResult(success_callback, failure_callback);
}
void UnlockCellularSim(const std::string& guid,
const std::string& pin,
const std::string& puk,
const VoidCallback& success_callback,
const FailureCallback& failure_callback) override {
VoidResult(success_callback, failure_callback);
}
void SetCellularSimState(const std::string& guid,
bool require_pin,
const std::string& current_pin,
const std::string& new_pin,
const VoidCallback& success_callback,
const FailureCallback& failure_callback) override {
VoidResult(success_callback, failure_callback);
}
// Synchronous methods
std::unique_ptr<base::ListValue> GetEnabledNetworkTypes() override {
std::unique_ptr<base::ListValue> result;
if (!fail_) {
result.reset(new base::ListValue);
result->AppendString(::onc::network_config::kEthernet);
}
return result;
}
std::unique_ptr<DeviceStateList> GetDeviceStateList() override {
std::unique_ptr<DeviceStateList> result;
if (fail_)
return result;
result.reset(new DeviceStateList);
std::unique_ptr<api::networking_private::DeviceStateProperties> properties(
new api::networking_private::DeviceStateProperties);
properties->type = api::networking_private::NETWORK_TYPE_ETHERNET;
properties->state = api::networking_private::DEVICE_STATE_TYPE_ENABLED;
result->push_back(std::move(properties));
return result;
}
bool EnableNetworkType(const std::string& type) override {
enabled_[type] = true;
return !fail_;
}
bool DisableNetworkType(const std::string& type) override {
disabled_[type] = true;
return !fail_;
}
bool RequestScan() override {
scan_requested_.push_back(true);
return !fail_;
}
void set_fail(bool fail) { fail_ = fail; }
bool GetEnabled(const std::string& type) { return enabled_[type]; }
bool GetDisabled(const std::string& type) { return disabled_[type]; }
size_t GetScanRequested() { return scan_requested_.size(); }
void DictionaryResult(const std::string& guid,
const DictionaryCallback& success_callback,
const FailureCallback& failure_callback) {
if (fail_) {
failure_callback.Run(kFailure);
} else {
std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue);
result->SetString(::onc::network_config::kGUID, guid);
result->SetString(::onc::network_config::kType,
::onc::network_config::kWiFi);
success_callback.Run(std::move(result));
}
}
void StringResult(const StringCallback& success_callback,
const FailureCallback& failure_callback) {
if (fail_) {
failure_callback.Run(kFailure);
} else {
success_callback.Run(kSuccess);
}
}
void BoolResult(const BoolCallback& success_callback,
const FailureCallback& failure_callback) {
if (fail_) {
failure_callback.Run(kFailure);
} else {
success_callback.Run(true);
}
}
void VoidResult(const VoidCallback& success_callback,
const FailureCallback& failure_callback) {
if (fail_) {
failure_callback.Run(kFailure);
} else {
success_callback.Run();
}
}
private:
bool fail_;
std::map<std::string, bool> enabled_;
std::map<std::string, bool> disabled_;
std::vector<bool> scan_requested_;
DISALLOW_COPY_AND_ASSIGN(TestDelegate);
};
class TestVerifyDelegate : public NetworkingPrivateDelegate::VerifyDelegate {
public:
TestVerifyDelegate() : owner_(NULL) {}
~TestVerifyDelegate() override {}
void VerifyDestination(
const VerificationProperties& verification_properties,
const BoolCallback& success_callback,
const FailureCallback& failure_callback) override {
owner_->BoolResult(success_callback, failure_callback);
}
void VerifyAndEncryptCredentials(
const std::string& guid,
const VerificationProperties& verification_properties,
const StringCallback& success_callback,
const FailureCallback& failure_callback) override {
owner_->StringResult(success_callback, failure_callback);
}
void VerifyAndEncryptData(
const VerificationProperties& verification_properties,
const std::string& data,
const StringCallback& success_callback,
const FailureCallback& failure_callback) override {
owner_->StringResult(success_callback, failure_callback);
}
void set_owner(TestDelegate* owner) { owner_ = owner; }
private:
TestDelegate* owner_;
DISALLOW_COPY_AND_ASSIGN(TestVerifyDelegate);
};
class NetworkingPrivateApiTest : public ExtensionApiTest {
public:
NetworkingPrivateApiTest() {
if (!s_test_delegate_) {
TestVerifyDelegate* verify_delegate = new TestVerifyDelegate;
std::unique_ptr<NetworkingPrivateDelegate::VerifyDelegate>
verify_delegate_ptr(verify_delegate);
s_test_delegate_ = new TestDelegate(std::move(verify_delegate_ptr));
verify_delegate->set_owner(s_test_delegate_);
}
}
static std::unique_ptr<KeyedService> GetNetworkingPrivateDelegate(
content::BrowserContext* profile) {
CHECK(s_test_delegate_);
return base::WrapUnique(s_test_delegate_);
}
void SetUpCommandLine(base::CommandLine* command_line) override {
ExtensionApiTest::SetUpCommandLine(command_line);
// Whitelist the extension ID of the test extension.
command_line->AppendSwitchASCII(
extensions::switches::kWhitelistedExtensionID,
"epcifkihnkjgphfkloaaleeakhpmgdmn");
}
void SetUpOnMainThread() override {
ExtensionApiTest::SetUpOnMainThread();
NetworkingPrivateDelegateFactory::GetInstance()->SetTestingFactory(
profile(), &NetworkingPrivateApiTest::GetNetworkingPrivateDelegate);
content::RunAllPendingInMessageLoop();
}
bool GetEnabled(const std::string& type) {
return s_test_delegate_->GetEnabled(type);
}
bool GetDisabled(const std::string& type) {
return s_test_delegate_->GetDisabled(type);
}
size_t GetScanRequested() {
return s_test_delegate_->GetScanRequested();
}
protected:
bool RunNetworkingSubtest(const std::string& subtest) {
return RunExtensionSubtest("networking_private",
"main.html?" + subtest,
kFlagEnableFileAccess | kFlagLoadAsComponent);
}
// Static pointer to the TestDelegate so that it can be accessed in
// GetNetworkingPrivateDelegate() passed to SetTestingFactory().
static TestDelegate* s_test_delegate_;
DISALLOW_COPY_AND_ASSIGN(NetworkingPrivateApiTest);
};
// static
TestDelegate* NetworkingPrivateApiTest::s_test_delegate_ = NULL;
} // namespace
// Place each subtest into a separate browser test so that the stub networking
// library state is reset for each subtest run. This way they won't affect each
// other. TODO(stevenjb): Use extensions::ApiUnitTest once moved to
// src/extensions.
// These fail on Windows due to crbug.com/177163. Note: we still have partial
// coverage in NetworkingPrivateServiceClientApiTest. TODO(stevenjb): Enable
// these on Windows once we switch to extensions::ApiUnitTest.
#if !defined(OS_WIN)
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, GetProperties) {
EXPECT_TRUE(RunNetworkingSubtest("getProperties")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, GetManagedProperties) {
EXPECT_TRUE(RunNetworkingSubtest("getManagedProperties")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, GetState) {
EXPECT_TRUE(RunNetworkingSubtest("getState")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, SetProperties) {
EXPECT_TRUE(RunNetworkingSubtest("setProperties")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, CreateNetwork) {
EXPECT_TRUE(RunNetworkingSubtest("createNetwork")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, ForgetNetwork) {
EXPECT_TRUE(RunNetworkingSubtest("forgetNetwork")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, GetNetworks) {
EXPECT_TRUE(RunNetworkingSubtest("getNetworks")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, GetVisibleNetworks) {
EXPECT_TRUE(RunNetworkingSubtest("getVisibleNetworks")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, GetEnabledNetworkTypes) {
EXPECT_TRUE(RunNetworkingSubtest("getEnabledNetworkTypes")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, GetDeviceStates) {
EXPECT_TRUE(RunNetworkingSubtest("getDeviceStates")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, EnableNetworkType) {
EXPECT_TRUE(RunNetworkingSubtest("enableNetworkType")) << message_;
EXPECT_TRUE(GetEnabled(::onc::network_config::kEthernet));
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, DisableNetworkType) {
EXPECT_TRUE(RunNetworkingSubtest("disableNetworkType")) << message_;
EXPECT_TRUE(GetDisabled(::onc::network_config::kEthernet));
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, RequestNetworkScan) {
EXPECT_TRUE(RunNetworkingSubtest("requestNetworkScan")) << message_;
EXPECT_EQ(1u, GetScanRequested());
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, StartConnect) {
EXPECT_TRUE(RunNetworkingSubtest("startConnect")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, StartDisconnect) {
EXPECT_TRUE(RunNetworkingSubtest("startDisconnect")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, StartActivate) {
EXPECT_TRUE(RunNetworkingSubtest("startActivate")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, VerifyDestination) {
EXPECT_TRUE(RunNetworkingSubtest("verifyDestination")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, VerifyAndEncryptCredentials) {
EXPECT_TRUE(RunNetworkingSubtest("verifyAndEncryptCredentials")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, VerifyAndEncryptData) {
EXPECT_TRUE(RunNetworkingSubtest("verifyAndEncryptData")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, SetWifiTDLSEnabledState) {
EXPECT_TRUE(RunNetworkingSubtest("setWifiTDLSEnabledState")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, GetWifiTDLSStatus) {
EXPECT_TRUE(RunNetworkingSubtest("getWifiTDLSStatus")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, GetCaptivePortalStatus) {
EXPECT_TRUE(RunNetworkingSubtest("getCaptivePortalStatus")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, UnlockCellularSim) {
EXPECT_TRUE(RunNetworkingSubtest("unlockCellularSim")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTest, SetCellularSimState) {
EXPECT_TRUE(RunNetworkingSubtest("setCellularSimState")) << message_;
}
// Test failure case
class NetworkingPrivateApiTestFail : public NetworkingPrivateApiTest {
public:
NetworkingPrivateApiTestFail() { s_test_delegate_->set_fail(true); }
protected:
DISALLOW_COPY_AND_ASSIGN(NetworkingPrivateApiTestFail);
};
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, GetProperties) {
EXPECT_FALSE(RunNetworkingSubtest("getProperties")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, GetManagedProperties) {
EXPECT_FALSE(RunNetworkingSubtest("getManagedProperties")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, GetState) {
EXPECT_FALSE(RunNetworkingSubtest("getState")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, SetProperties) {
EXPECT_FALSE(RunNetworkingSubtest("setProperties")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, CreateNetwork) {
EXPECT_FALSE(RunNetworkingSubtest("createNetwork")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, ForgetNetwork) {
EXPECT_FALSE(RunNetworkingSubtest("forgetNetwork")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, GetNetworks) {
EXPECT_FALSE(RunNetworkingSubtest("getNetworks")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, GetVisibleNetworks) {
EXPECT_FALSE(RunNetworkingSubtest("getVisibleNetworks")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, GetEnabledNetworkTypes) {
EXPECT_FALSE(RunNetworkingSubtest("getEnabledNetworkTypes")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, GetDeviceStates) {
EXPECT_FALSE(RunNetworkingSubtest("getDeviceStates")) << message_;
}
// Note: Synchronous methods never fail:
// * disableNetworkType
// * enableNetworkType
// * requestNetworkScan
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, StartConnect) {
EXPECT_FALSE(RunNetworkingSubtest("startConnect")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, StartDisconnect) {
EXPECT_FALSE(RunNetworkingSubtest("startDisconnect")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, StartActivate) {
EXPECT_FALSE(RunNetworkingSubtest("startActivate")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, VerifyDestination) {
EXPECT_FALSE(RunNetworkingSubtest("verifyDestination")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail,
VerifyAndEncryptCredentials) {
EXPECT_FALSE(RunNetworkingSubtest("verifyAndEncryptCredentials")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, VerifyAndEncryptData) {
EXPECT_FALSE(RunNetworkingSubtest("verifyAndEncryptData")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, SetWifiTDLSEnabledState) {
EXPECT_FALSE(RunNetworkingSubtest("setWifiTDLSEnabledState")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, GetWifiTDLSStatus) {
EXPECT_FALSE(RunNetworkingSubtest("getWifiTDLSStatus")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, GetCaptivePortalStatus) {
EXPECT_FALSE(RunNetworkingSubtest("getCaptivePortalStatus")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, UnlockCellularSim) {
EXPECT_FALSE(RunNetworkingSubtest("unlockCellularSim")) << message_;
}
IN_PROC_BROWSER_TEST_F(NetworkingPrivateApiTestFail, SetCellularSimState) {
EXPECT_FALSE(RunNetworkingSubtest("setCellularSimState")) << message_;
}
#endif // defined(OS_WIN)
} // namespace extensions