blob: 64f3714a46fdbb9f8440d978f2c444e1fb22c055 [file] [log] [blame]
// Copyright (c) 2012 The Chromium OS 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 "shill/cellular_capability_cdma.h"
#include <chromeos/dbus/service_constants.h>
#include <gtest/gtest.h>
#include <mm/mm-modem.h>
#include "shill/cellular.h"
#include "shill/cellular_service.h"
#include "shill/error.h"
#include "shill/event_dispatcher.h"
#include "shill/mock_adaptors.h"
#include "shill/mock_glib.h"
#include "shill/mock_manager.h"
#include "shill/mock_metrics.h"
#include "shill/mock_modem_cdma_proxy.h"
#include "shill/nice_mock_control.h"
using testing::_;
using testing::Return;
using testing::SetArgumentPointee;
namespace shill {
class TestAsyncCallHandler : public AsyncCallHandler {
public:
explicit TestAsyncCallHandler(ReturnerInterface *returner)
: AsyncCallHandler(returner) { }
virtual ~TestAsyncCallHandler() { }
bool CompleteOperationWithError(const Error &error) {
error_.Populate(error.type(), error.message());
return AsyncCallHandler::CompleteOperationWithError(error);
}
static const Error &error() { return error_; }
private:
// static because AsyncCallHandlers are deleted before callbacks return
static Error error_;
DISALLOW_COPY_AND_ASSIGN(TestAsyncCallHandler);
};
Error TestAsyncCallHandler::error_;
class CellularCapabilityCDMATest : public testing::Test {
public:
CellularCapabilityCDMATest()
: manager_(&control_, &dispatcher_, &metrics_, &glib_),
cellular_(new Cellular(&control_,
&dispatcher_,
&metrics_,
&manager_,
"",
"",
0,
Cellular::kTypeCDMA,
"",
"",
NULL)),
proxy_(new MockModemCDMAProxy()),
capability_(NULL) {}
virtual ~CellularCapabilityCDMATest() {
cellular_->service_ = NULL;
capability_ = NULL;
}
virtual void SetUp() {
capability_ =
dynamic_cast<CellularCapabilityCDMA *>(cellular_->capability_.get());
}
protected:
static const char kMEID[];
static const char kTestCarrier[];
void SetRegistrationStateEVDO(uint32 state) {
capability_->registration_state_evdo_ = state;
}
void SetRegistrationState1x(uint32 state) {
capability_->registration_state_1x_ = state;
}
void SetProxy() {
capability_->proxy_.reset(proxy_.release());
}
void SetService() {
cellular_->service_ = new CellularService(
&control_, &dispatcher_, &metrics_, &manager_, cellular_);
}
void SetDeviceState(Cellular::State state) {
cellular_->state_ = state;
}
NiceMockControl control_;
EventDispatcher dispatcher_;
MockGLib glib_;
MockManager manager_;
MockMetrics metrics_;
CellularRefPtr cellular_;
scoped_ptr<MockModemCDMAProxy> proxy_;
CellularCapabilityCDMA *capability_; // Owned by |cellular_|.
};
const char CellularCapabilityCDMATest::kMEID[] = "D1234567EF8901";
const char CellularCapabilityCDMATest::kTestCarrier[] = "The Cellular Carrier";
TEST_F(CellularCapabilityCDMATest, PropertyStore) {
EXPECT_TRUE(cellular_->store().Contains(flimflam::kPRLVersionProperty));
}
TEST_F(CellularCapabilityCDMATest, Activate) {
SetDeviceState(Cellular::kStateEnabled);
EXPECT_CALL(*proxy_,
Activate(kTestCarrier, _, CellularCapability::kTimeoutActivate));
MockReturner returner;
scoped_ptr<TestAsyncCallHandler> handler(new TestAsyncCallHandler(&returner));
SetProxy();
capability_->Activate(kTestCarrier, handler.get());
SetService();
capability_->OnActivateCallback(MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR,
Error(), NULL);
EXPECT_TRUE(TestAsyncCallHandler::error().IsSuccess());
EXPECT_EQ(MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING,
capability_->activation_state());
EXPECT_EQ(flimflam::kActivationStateActivating,
cellular_->service()->activation_state());
EXPECT_EQ("", cellular_->service()->error());
}
TEST_F(CellularCapabilityCDMATest, ActivateError) {
MockReturner returner;
TestAsyncCallHandler *handler = new TestAsyncCallHandler(&returner);
capability_->Activate(kTestCarrier, handler);
EXPECT_EQ(Error::kInvalidArguments, TestAsyncCallHandler::error().type());
handler = new TestAsyncCallHandler(&returner);
SetDeviceState(Cellular::kStateRegistered);
EXPECT_CALL(*proxy_, Activate(kTestCarrier, handler,
CellularCapability::kTimeoutActivate));
SetProxy();
SetService();
capability_->Activate(kTestCarrier, handler);
capability_->OnActivateCallback(MM_MODEM_CDMA_ACTIVATION_ERROR_NO_SIGNAL,
Error(), handler);
EXPECT_TRUE(TestAsyncCallHandler::error().IsFailure());
EXPECT_EQ(MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED,
capability_->activation_state());
EXPECT_EQ(flimflam::kActivationStateNotActivated,
cellular_->service()->activation_state());
EXPECT_EQ(flimflam::kErrorActivationFailed,
cellular_->service()->error());
}
TEST_F(CellularCapabilityCDMATest, GetActivationStateString) {
EXPECT_EQ(flimflam::kActivationStateActivated,
CellularCapabilityCDMA::GetActivationStateString(
MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATED));
EXPECT_EQ(flimflam::kActivationStateActivating,
CellularCapabilityCDMA::GetActivationStateString(
MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING));
EXPECT_EQ(flimflam::kActivationStateNotActivated,
CellularCapabilityCDMA::GetActivationStateString(
MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED));
EXPECT_EQ(flimflam::kActivationStatePartiallyActivated,
CellularCapabilityCDMA::GetActivationStateString(
MM_MODEM_CDMA_ACTIVATION_STATE_PARTIALLY_ACTIVATED));
EXPECT_EQ(flimflam::kActivationStateUnknown,
CellularCapabilityCDMA::GetActivationStateString(123));
}
TEST_F(CellularCapabilityCDMATest, GetActivationErrorString) {
EXPECT_EQ(flimflam::kErrorNeedEvdo,
CellularCapabilityCDMA::GetActivationErrorString(
MM_MODEM_CDMA_ACTIVATION_ERROR_WRONG_RADIO_INTERFACE));
EXPECT_EQ(flimflam::kErrorNeedHomeNetwork,
CellularCapabilityCDMA::GetActivationErrorString(
MM_MODEM_CDMA_ACTIVATION_ERROR_ROAMING));
EXPECT_EQ(flimflam::kErrorOtaspFailed,
CellularCapabilityCDMA::GetActivationErrorString(
MM_MODEM_CDMA_ACTIVATION_ERROR_COULD_NOT_CONNECT));
EXPECT_EQ(flimflam::kErrorOtaspFailed,
CellularCapabilityCDMA::GetActivationErrorString(
MM_MODEM_CDMA_ACTIVATION_ERROR_SECURITY_AUTHENTICATION_FAILED));
EXPECT_EQ(flimflam::kErrorOtaspFailed,
CellularCapabilityCDMA::GetActivationErrorString(
MM_MODEM_CDMA_ACTIVATION_ERROR_PROVISIONING_FAILED));
EXPECT_EQ("",
CellularCapabilityCDMA::GetActivationErrorString(
MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR));
EXPECT_EQ(flimflam::kErrorActivationFailed,
CellularCapabilityCDMA::GetActivationErrorString(
MM_MODEM_CDMA_ACTIVATION_ERROR_NO_SIGNAL));
EXPECT_EQ(flimflam::kErrorActivationFailed,
CellularCapabilityCDMA::GetActivationErrorString(1234));
}
TEST_F(CellularCapabilityCDMATest, IsRegisteredEVDO) {
EXPECT_FALSE(capability_->IsRegistered());
SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN);
EXPECT_FALSE(capability_->IsRegistered());
SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED);
EXPECT_TRUE(capability_->IsRegistered());
SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
EXPECT_TRUE(capability_->IsRegistered());
SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING);
EXPECT_TRUE(capability_->IsRegistered());
}
TEST_F(CellularCapabilityCDMATest, IsRegistered1x) {
EXPECT_FALSE(capability_->IsRegistered());
SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN);
EXPECT_FALSE(capability_->IsRegistered());
SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED);
EXPECT_TRUE(capability_->IsRegistered());
SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
EXPECT_TRUE(capability_->IsRegistered());
SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING);
EXPECT_TRUE(capability_->IsRegistered());
}
TEST_F(CellularCapabilityCDMATest, GetNetworkTechnologyString) {
EXPECT_EQ("", capability_->GetNetworkTechnologyString());
SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
EXPECT_EQ(flimflam::kNetworkTechnologyEvdo,
capability_->GetNetworkTechnologyString());
SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN);
SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
EXPECT_EQ(flimflam::kNetworkTechnology1Xrtt,
capability_->GetNetworkTechnologyString());
}
TEST_F(CellularCapabilityCDMATest, GetRoamingStateString) {
EXPECT_EQ(flimflam::kRoamingStateUnknown,
capability_->GetRoamingStateString());
SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED);
EXPECT_EQ(flimflam::kRoamingStateUnknown,
capability_->GetRoamingStateString());
SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
EXPECT_EQ(flimflam::kRoamingStateHome, capability_->GetRoamingStateString());
SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING);
EXPECT_EQ(flimflam::kRoamingStateRoaming,
capability_->GetRoamingStateString());
SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN);
SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED);
EXPECT_EQ(flimflam::kRoamingStateUnknown,
capability_->GetRoamingStateString());
SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
EXPECT_EQ(flimflam::kRoamingStateHome, capability_->GetRoamingStateString());
SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING);
EXPECT_EQ(flimflam::kRoamingStateRoaming,
capability_->GetRoamingStateString());
}
TEST_F(CellularCapabilityCDMATest, GetSignalQuality) {
const int kStrength = 90;
EXPECT_CALL(*proxy_, GetSignalQuality()).WillOnce(Return(kStrength));
SetProxy();
SetService();
EXPECT_EQ(0, cellular_->service()->strength());
capability_->GetSignalQuality();
EXPECT_EQ(kStrength, cellular_->service()->strength());
}
TEST_F(CellularCapabilityCDMATest, GetRegistrationState) {
EXPECT_FALSE(cellular_->service().get());
EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
capability_->registration_state_1x());
EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
capability_->registration_state_evdo());
EXPECT_CALL(*proxy_, GetRegistrationState(_, _))
.WillOnce(DoAll(
SetArgumentPointee<0>(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED),
SetArgumentPointee<1>(MM_MODEM_CDMA_REGISTRATION_STATE_HOME)));
EXPECT_CALL(*proxy_, GetSignalQuality()).WillOnce(Return(90));
SetProxy();
EXPECT_CALL(manager_, RegisterService(_));
capability_->GetRegistrationState(NULL);
dispatcher_.DispatchPendingEvents();
EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED,
capability_->registration_state_1x());
EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
capability_->registration_state_evdo());
EXPECT_TRUE(cellular_->service().get());
}
TEST_F(CellularCapabilityCDMATest, CreateFriendlyServiceName) {
CellularCapabilityCDMA::friendly_service_name_id_ = 0;
EXPECT_EQ("CDMANetwork0", capability_->CreateFriendlyServiceName());
EXPECT_EQ("CDMANetwork1", capability_->CreateFriendlyServiceName());
static const char kTestCarrier[] = "A Carrier";
capability_->carrier_ = kTestCarrier;
EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
}
} // namespace shill