blob: 76d7e5eae60182473843091b81820c0c29c8177f [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 <base/json/json_reader.h>
#include <base/memory/scoped_ptr.h>
#include <gtest/gtest.h>
#include "src/data_plan.h"
#include "src/device_mock.h"
#include "src/policy.h"
#include "src/service_manager_mock.h"
#include "src/service_mock.h"
namespace cashew {
// test fixture for DataPlan unit tests
class DataPlanTest: public ::testing::Test {
protected:
DataPlanTest() : policy_(NULL), current_unlimited_plan_(NULL),
current_available_metered_plan_(NULL), plan_one_(NULL), plan_two_(NULL),
plan_three_(NULL) {}
virtual ~DataPlanTest() {
EXPECT_TRUE(policy_ == NULL);
EXPECT_TRUE(current_unlimited_plan_ == NULL);
EXPECT_TRUE(current_available_metered_plan_ == NULL);
EXPECT_TRUE(plan_one_ == NULL);
EXPECT_TRUE(plan_two_ == NULL);
EXPECT_TRUE(plan_three_ == NULL);
}
static const int kBytesPerMegabyte = 1024 * 1024;
virtual void SetUp() {
EXPECT_TRUE(policy_ == NULL);
policy_ = Policy::GetPolicy(kTestCarrierName);
ASSERT_TRUE(policy_ != NULL);
EXPECT_TRUE(current_unlimited_plan_ == NULL);
DataPlan::Type type = DataPlan::kTypeUnlimited;
base::TimeDelta twelve_hours = base::TimeDelta::FromHours(12);
base::Time now = base::Time::Now();
base::Time start_time = now - twelve_hours;
base::Time end_time = now + twelve_hours;
ByteCount max_bytes = 0;
ByteCount used_bytes = 5 * kBytesPerMegabyte;
current_unlimited_plan_ = new(std::nothrow) DataPlan(
"Current Unlimited Plan", type, now, start_time, end_time, max_bytes,
used_bytes);
ASSERT_TRUE(current_unlimited_plan_ != NULL);
EXPECT_TRUE(current_available_metered_plan_ == NULL);
type = DataPlan::kTypeMeteredFree;
max_bytes = 100 * kBytesPerMegabyte;
current_available_metered_plan_ = new(std::nothrow) DataPlan(
"Current Available Metered Plan", type, now, start_time, end_time,
max_bytes, used_bytes);
ASSERT_TRUE(current_available_metered_plan_ != NULL);
EXPECT_TRUE(plan_one_ == NULL);
used_bytes = 0;
plan_one_ = new(std::nothrow) DataPlan("Plan One", type, now, start_time,
end_time, max_bytes, used_bytes);
ASSERT_TRUE(plan_one_ != NULL);
EXPECT_TRUE(plan_two_ == NULL);
plan_two_ = new(std::nothrow) DataPlan("Plan Two", type, now, start_time,
end_time, max_bytes, used_bytes);
ASSERT_TRUE(plan_two_ != NULL);
EXPECT_TRUE(plan_three_ == NULL);
plan_three_ = new(std::nothrow) DataPlan("Plan Three", type, now,
start_time, end_time, max_bytes,
used_bytes);
ASSERT_TRUE(plan_three_ != NULL);
}
virtual void TearDown() {
delete plan_three_;
plan_three_ = NULL;
delete plan_two_;
plan_two_ = NULL;
delete plan_one_;
plan_one_ = NULL;
delete current_available_metered_plan_;
current_available_metered_plan_ = NULL;
delete current_unlimited_plan_;
current_unlimited_plan_ = NULL;
delete policy_;
policy_ = NULL;
}
// hardcoded JSON data plan representations
static const char *kMeteredWithUsedBytesJSON;
static const char *kMeteredWithNoUsedBytesJSON;
static const char *kUnlimitedWithUsedBytesJSON;
static const char *kUnlimitedWithNoUsedBytesJSON;
static const char *k32BitSignedOverflowingMaxBytesJSON;
static const char *k32BitUnsignedOverflowingMaxBytesJSON;
// test carrier for constructing policy
static const char *kTestCarrierName;
// test policy used by FromDictionaryValue tests
Policy *policy_;
// current unlimited plan shared by multiple tests
DataPlan *current_unlimited_plan_;
// current available metered plan shared by multiple tests
DataPlan *current_available_metered_plan_;
// three metered plans shared by multiple tests
DataPlan *plan_one_;
DataPlan *plan_two_;
DataPlan *plan_three_;
// mocks
ServiceMock service_mock_;
ServiceManagerMock service_manager_mock_;
DeviceMock device_mock_;
};
typedef DataPlanTest DataPlanDeathTest;
const char *DataPlanTest::kMeteredWithUsedBytesJSON =
"{\"lastUpdate\" : \"2010-09-20T12:01:00Z\","
"\"planName\" : \"Super-Awesome Chromium OS Plan\","
"\"planType\" : \"METERED_PAID\","
"\"maxBytes\" : 104857600,"
"\"usedBytes\" : 52428800,"
"\"expirationTime\" : \"2010-09-30T23:59:59\","
"\"startTime\" : \"2010-09-01T00:00:00\""
"}";
const char *DataPlanTest::kMeteredWithNoUsedBytesJSON =
"{\"lastUpdate\" : \"2010-09-20T12:01:00Z\","
"\"planName\" : \"Super-Awesome Chromium OS Plan\","
"\"planType\" : \"METERED_PAID\","
"\"maxBytes\" : 104857600,"
"\"expirationTime\" : \"2010-09-30T23:59:59\","
"\"startTime\" : \"2010-09-01T00:00:00\""
"}";
const char *DataPlanTest::kUnlimitedWithUsedBytesJSON =
"{\"lastUpdate\" : \"2010-09-20T12:01:00Z\","
"\"planName\" : \"All-You-Can-Eat Day Pass\","
"\"planType\" : \"UNLIMITED\","
"\"usedBytes\" : 52428800,"
"\"expirationTime\" : \"2010-09-20T23:59:59\","
"\"startTime\" : \"2010-09-20T00:00:00\""
"}";
const char *DataPlanTest::kUnlimitedWithNoUsedBytesJSON =
"{\"lastUpdate\" : \"2010-09-20T12:01:00Z\","
"\"planName\" : \"All-You-Can-Eat Day Pass\","
"\"planType\" : \"UNLIMITED\","
"\"expirationTime\" : \"2010-09-20T23:59:59\","
"\"startTime\" : \"2010-09-20T00:00:00\""
"}";
const char *DataPlanTest::k32BitSignedOverflowingMaxBytesJSON =
"{\"lastUpdate\" : \"2010-09-20T12:01:00Z\","
"\"planName\" : \"Super-Awesome Chromium OS Plan\","
"\"planType\" : \"METERED_PAID\","
"\"maxBytes\" : 2500000000,"
"\"usedBytes\" : 0,"
"\"expirationTime\" : \"2010-09-30T23:59:59\","
"\"startTime\" : \"2010-09-01T00:00:00\""
"}";
const char *DataPlanTest::k32BitUnsignedOverflowingMaxBytesJSON =
"{\"lastUpdate\" : \"2010-09-20T12:01:00Z\","
"\"planName\" : \"Super-Awesome Chromium OS Plan\","
"\"planType\" : \"METERED_PAID\","
"\"maxBytes\" : 5000000000,"
"\"usedBytes\" : 0,"
"\"expirationTime\" : \"2010-09-30T23:59:59\","
"\"startTime\" : \"2010-09-01T00:00:00\""
"}";
const char *DataPlanTest::kTestCarrierName = "Test Carrier";
TEST_F(DataPlanTest, UtcTimeString) {
static const char *kTimeStringToTest = "2010-09-20T23:59:59Z";
base::Time time;
bool result = DataPlan::TimeFromIso8601(kTimeStringToTest, &time, false);
EXPECT_TRUE(result);
struct base::Time::Exploded exploded;
time.UTCExplode(&exploded);
EXPECT_EQ(2010, exploded.year);
EXPECT_EQ(9, exploded.month);
EXPECT_EQ(20, exploded.day_of_month);
EXPECT_EQ(23, exploded.hour);
EXPECT_EQ(59, exploded.minute);
EXPECT_EQ(59, exploded.second);
EXPECT_EQ(0, exploded.millisecond);
}
TEST_F(DataPlanTest, ZonelessTimeStringWithUtcPolicy) {
static const char *kTimeStringToTest = "2010-09-20T23:59:59";
base::Time time;
bool result = DataPlan::TimeFromIso8601(kTimeStringToTest, &time, false);
EXPECT_TRUE(result);
struct base::Time::Exploded exploded;
time.UTCExplode(&exploded);
EXPECT_EQ(2010, exploded.year);
EXPECT_EQ(9, exploded.month);
EXPECT_EQ(20, exploded.day_of_month);
EXPECT_EQ(23, exploded.hour);
EXPECT_EQ(59, exploded.minute);
EXPECT_EQ(59, exploded.second);
EXPECT_EQ(0, exploded.millisecond);
}
TEST_F(DataPlanTest, ZonelessTimeStringWithLocalPolicy) {
static const char *kTimeStringToTest = "2010-09-20T23:59:59";
base::Time time;
bool result = DataPlan::TimeFromIso8601(kTimeStringToTest, &time, true);
EXPECT_TRUE(result);
struct base::Time::Exploded exploded;
time.LocalExplode(&exploded);
EXPECT_EQ(2010, exploded.year);
EXPECT_EQ(9, exploded.month);
EXPECT_EQ(20, exploded.day_of_month);
EXPECT_EQ(23, exploded.hour);
EXPECT_EQ(59, exploded.minute);
EXPECT_EQ(59, exploded.second);
EXPECT_EQ(0, exploded.millisecond);
}
TEST_F(DataPlanTest, EmptyTimeString) {
base::Time time;
static const char *kTimeStringToTest = "";
bool result = DataPlan::TimeFromIso8601(kTimeStringToTest, &time, false);
EXPECT_FALSE(result);
}
TEST_F(DataPlanDeathTest, NullTimeOutPtr) {
static const char *kTimeStringToTest = "2010-09-20T23:59:59Z";
EXPECT_EXIT(DataPlan::TimeFromIso8601(kTimeStringToTest, NULL, false),
testing::KilledBySignal(SIGABRT),
"Check failed: 'time_out' Must be non NULL");
}
TEST_F(DataPlanTest, FromDictionaryValueMeteredWithUsedBytes) {
scoped_ptr<Value> value(base::JSONReader::Read(kMeteredWithUsedBytesJSON,
true));
ASSERT_TRUE(value != NULL);
ASSERT_TRUE(value->IsType(Value::TYPE_DICTIONARY));
const DictionaryValue *dict_value =
static_cast<const DictionaryValue*>(value.get());
DataPlan *plan = DataPlan::FromDictionaryValue(dict_value, policy_);
// we expect the call to have succeeeded, with the new data plan's used bytes
// property set to the value that was present in the JSON representation
ASSERT_TRUE(plan != NULL);
EXPECT_EQ(52428800, plan->GetDataBytesUsed());
}
TEST_F(DataPlanTest, FromDictonaryValueMeteredWithNoUsedBytes) {
scoped_ptr<Value> value(base::JSONReader::Read(kMeteredWithNoUsedBytesJSON,
true));
ASSERT_TRUE(value != NULL);
ASSERT_TRUE(value->IsType(Value::TYPE_DICTIONARY));
const DictionaryValue *dict_value =
static_cast<const DictionaryValue*>(value.get());
DataPlan *plan = DataPlan::FromDictionaryValue(dict_value, policy_);
// the JSON representation for metered plans must include used bytes, so we
// expect the call to have failed
EXPECT_TRUE(plan == NULL);
}
TEST_F(DataPlanTest, FromDictionaryValueUnlimitedWithUsedBytes) {
scoped_ptr<Value> value(base::JSONReader::Read(kUnlimitedWithUsedBytesJSON,
true));
ASSERT_TRUE(value != NULL);
ASSERT_TRUE(value->IsType(Value::TYPE_DICTIONARY));
const DictionaryValue *dict_value =
static_cast<const DictionaryValue*>(value.get());
DataPlan *plan = DataPlan::FromDictionaryValue(dict_value, policy_);
// we expect the call to have succeeeded, with the new data plan's used bytes
// property set to the value that was present in the JSON representation
ASSERT_TRUE(plan != NULL);
EXPECT_EQ(52428800, plan->GetDataBytesUsed());
}
TEST_F(DataPlanTest, FromDictionaryValueUnlimitedWithNoUsedBytes) {
scoped_ptr<Value> value(base::JSONReader::Read(kUnlimitedWithNoUsedBytesJSON,
true));
ASSERT_TRUE(value != NULL);
ASSERT_TRUE(value->IsType(Value::TYPE_DICTIONARY));
const DictionaryValue *dict_value =
static_cast<const DictionaryValue*>(value.get());
DataPlan *plan = DataPlan::FromDictionaryValue(dict_value, policy_);
// it's optional for the JSON representation for unlimited plans to include
// used bytes, so we expect the call to have succeeded. The new data plan's
// used bytes property should have been set to the default of 0.
ASSERT_TRUE(plan != NULL);
EXPECT_EQ(0, plan->GetDataBytesUsed());
}
TEST_F(DataPlanTest, FromDictionaryValue32BitSignedOverflowingMaxBytes) {
scoped_ptr<Value> value(base::JSONReader::Read(
k32BitSignedOverflowingMaxBytesJSON, true));
ASSERT_TRUE(value != NULL);
ASSERT_TRUE(value->IsType(Value::TYPE_DICTIONARY));
const DictionaryValue *dict_value =
static_cast<const DictionaryValue*>(value.get());
DataPlan *plan = DataPlan::FromDictionaryValue(dict_value, policy_);
// we expect the call to have succeeded and max bytes to be set properly
ASSERT_TRUE(plan != NULL);
EXPECT_EQ(2500000000LL, plan->GetDataBytesMax());
}
TEST_F(DataPlanTest, FromDictionaryValue32BitUnsignedOverflowingMaxBytes) {
scoped_ptr<Value> value(base::JSONReader::Read(
k32BitUnsignedOverflowingMaxBytesJSON, true));
ASSERT_TRUE(value != NULL);
ASSERT_TRUE(value->IsType(Value::TYPE_DICTIONARY));
const DictionaryValue *dict_value =
static_cast<const DictionaryValue*>(value.get());
DataPlan *plan = DataPlan::FromDictionaryValue(dict_value, policy_);
// we expect the call to have succeeded and max bytes to be set properly
ASSERT_TRUE(plan != NULL);
EXPECT_EQ(5000000000LL, plan->GetDataBytesMax());
}
TEST_F(DataPlanTest, TotalBytesAfterCtor) {
// this test uses |current_unlimited_plan_| created in fixture SetUp
// we expect plan to be initialized with local bytes == 0 and total bytes ==
// |used_bytes|
EXPECT_EQ(5 * kBytesPerMegabyte, current_unlimited_plan_->GetDataBytesUsed());
EXPECT_EQ(0, current_unlimited_plan_->GetLocalBytesUsed());
EXPECT_EQ(5 * kBytesPerMegabyte,
current_unlimited_plan_->GetTotalBytesUsed());
}
TEST_F(DataPlanTest, TotalBytesAfterSetLocalBytes) {
// this test uses |current_unlimited_plan_| created in fixture SetUp
ByteCount local_bytes = 10 * kBytesPerMegabyte;
current_unlimited_plan_->SetLocalBytesUsed(local_bytes);
// we expect that, after we set local bytes, total bytes == data bytes +
// local bytes
EXPECT_EQ(5 * kBytesPerMegabyte, current_unlimited_plan_->GetDataBytesUsed());
EXPECT_EQ(local_bytes, current_unlimited_plan_->GetLocalBytesUsed());
EXPECT_EQ(15 * kBytesPerMegabyte,
current_unlimited_plan_->GetTotalBytesUsed());
}
TEST_F(DataPlanTest, TotalBytesAfterOverflow) {
// this test uses |current_unlimited_plan_| created in fixture SetUp
ByteCount local_bytes = kint64max;
current_unlimited_plan_->SetLocalBytesUsed(local_bytes);
// we expect that, after we set local bytes to a value that will cause the
// total bytes computation to overflow, the overflow will be detected and
// total bytes will be set to kint64max.
EXPECT_EQ(5 * kBytesPerMegabyte, current_unlimited_plan_->GetDataBytesUsed());
EXPECT_EQ(local_bytes, current_unlimited_plan_->GetLocalBytesUsed());
EXPECT_EQ(kint64max, current_unlimited_plan_->GetTotalBytesUsed());
}
TEST_F(DataPlanTest, IsActiveCurrentPlan) {
std::string name = "Current Plan";
DataPlan::Type type = DataPlan::kTypeMeteredFree;
base::TimeDelta twelve_hours = base::TimeDelta::FromHours(12);
base::Time now = base::Time::Now();
base::Time start_time = now - twelve_hours;
base::Time end_time = now + twelve_hours;
ByteCount max_bytes = 100 * kBytesPerMegabyte;
ByteCount used_bytes = 5 * kBytesPerMegabyte;
DataPlan *plan = new(std::nothrow) DataPlan(name, type, now, start_time,
end_time, max_bytes, used_bytes);
ASSERT_TRUE(plan != NULL);
// we expect that a current plan will be considered active
EXPECT_TRUE(plan->IsActive());
delete plan;
}
TEST_F(DataPlanTest, IsActiveFuturePlan) {
std::string name = "Future Plan";
DataPlan::Type type = DataPlan::kTypeMeteredFree;
base::TimeDelta twelve_hours = base::TimeDelta::FromHours(12);
base::Time now = base::Time::Now();
base::Time start_time = now + twelve_hours;
base::Time end_time = now + twelve_hours + twelve_hours;
ByteCount max_bytes = 100 * kBytesPerMegabyte;
ByteCount used_bytes = 5 * kBytesPerMegabyte;
DataPlan *plan = new(std::nothrow) DataPlan(name, type, now, start_time,
end_time, max_bytes, used_bytes);
ASSERT_TRUE(plan != NULL);
// we expect that a future plan will not be considered active
EXPECT_FALSE(plan->IsActive());
delete plan;
}
TEST_F(DataPlanTest, IsActiveExpiredPlan) {
std::string name = "Expired Plan";
DataPlan::Type type = DataPlan::kTypeMeteredFree;
base::TimeDelta twelve_hours = base::TimeDelta::FromHours(12);
base::Time now = base::Time::Now();
base::Time start_time = now - twelve_hours - twelve_hours;
base::Time end_time = now - twelve_hours;
ByteCount max_bytes = 100 * kBytesPerMegabyte;
ByteCount used_bytes = 5 * kBytesPerMegabyte;
DataPlan *plan = new(std::nothrow) DataPlan(name, type, now, start_time,
end_time, max_bytes, used_bytes);
ASSERT_TRUE(plan != NULL);
// we expect that an expired plan will not be considered active
EXPECT_FALSE(plan->IsActive());
delete plan;
}
TEST_F(DataPlanTest, IsActiveJustStartedPlan) {
std::string name = "Just Started Plan";
DataPlan::Type type = DataPlan::kTypeMeteredFree;
base::TimeDelta twelve_hours = base::TimeDelta::FromHours(12);
base::Time now = base::Time::Now();
base::Time start_time = now;
base::Time end_time = now + twelve_hours;
ByteCount max_bytes = 100 * kBytesPerMegabyte;
ByteCount used_bytes = 5 * kBytesPerMegabyte;
DataPlan *plan = new(std::nothrow) DataPlan(name, type, now, start_time,
end_time, max_bytes, used_bytes);
ASSERT_TRUE(plan != NULL);
// we expect that a plan with start time == now will be considered active
EXPECT_TRUE(plan->IsActive());
delete plan;
}
TEST_F(DataPlanTest, IsActiveJustExpiredPlan) {
std::string name = "Just Expired Plan";
DataPlan::Type type = DataPlan::kTypeMeteredFree;
base::TimeDelta twelve_hours = base::TimeDelta::FromHours(12);
base::Time now = base::Time::Now();
base::Time start_time = now - twelve_hours;
base::Time end_time = now;
ByteCount max_bytes = 100 * kBytesPerMegabyte;
ByteCount used_bytes = 5 * kBytesPerMegabyte;
DataPlan *plan = new(std::nothrow) DataPlan(name, type, now, start_time,
end_time, max_bytes, used_bytes);
ASSERT_TRUE(plan != NULL);
// we expect that a plan with end time == now will not be considered active
EXPECT_FALSE(plan->IsActive());
delete plan;
}
TEST_F(DataPlanTest, IsActiveAvailableMeteredPlan) {
// this test uses |current_available_metered_plan_| created in fixture SetUp
// we expect that a current metered plan that is not yet consumed will be
// considered active
EXPECT_TRUE(current_available_metered_plan_->IsActive());
}
TEST_F(DataPlanTest, IsActiveConsumedMeteredPlan) {
std::string name = "Consumed Metered Plan";
DataPlan::Type type = DataPlan::kTypeMeteredFree;
base::TimeDelta twelve_hours = base::TimeDelta::FromHours(12);
base::Time now = base::Time::Now();
base::Time start_time = now - twelve_hours;
base::Time end_time = now + twelve_hours;
ByteCount max_bytes = 100 * kBytesPerMegabyte;
ByteCount used_bytes = 100 * kBytesPerMegabyte;
DataPlan *plan = new(std::nothrow) DataPlan(name, type, now, start_time,
end_time, max_bytes, used_bytes);
ASSERT_TRUE(plan != NULL);
// we expect that a current metered plan that is consumed will not be
// considered active
EXPECT_FALSE(plan->IsActive());
delete plan;
}
TEST_F(DataPlanTest, IsActiveConsumedLocalMeteredPlan) {
// this test uses |current_available_metered_plan_| created in fixture SetUp
current_available_metered_plan_->SetLocalBytesUsed(95 * kBytesPerMegabyte);
// we expect that a current metered plan that has used bytes < max bytes but
// is consumed by virtue of local bytes + used bytes being >= max bytes will
// not be considered active
EXPECT_FALSE(current_available_metered_plan_->IsActive());
}
TEST_F(DataPlanTest, IsActiveUnlimitedPlan) {
// this test uses |current_unlimited_plan_| created in fixture SetUp
// we expect that a current unlimited plan will be considered active, even if
// its total bytes is greater than its (meaningless) max bytes
EXPECT_TRUE(current_unlimited_plan_->IsActive());
}
// tests for assigning bytes to a data plan
TEST_F(DataPlanTest, AssignBytesToInactiveConsumed) {
// create consumed plan
std::string name = "Consumed Plan";
DataPlan::Type type = DataPlan::kTypeMeteredFree;
base::TimeDelta twelve_hours = base::TimeDelta::FromHours(12);
base::Time now = base::Time::Now();
base::Time start_time = now - twelve_hours;
base::Time end_time = now + twelve_hours;
ByteCount max_bytes = 100 * kBytesPerMegabyte;
ByteCount used_bytes = 100 * kBytesPerMegabyte;
DataPlan *consumed_plan = new(std::nothrow) DataPlan(name, type, now,
start_time, end_time,
max_bytes, used_bytes);
ASSERT_TRUE(consumed_plan != NULL);
EXPECT_FALSE(consumed_plan->IsActive());
ByteCount bytes_to_assign = 1 * kBytesPerMegabyte;
// simulate assigning bytes to the consumed plan
ByteCount bytes_assigned = DataPlan::AssignBytesToPlan(
consumed_plan, bytes_to_assign);
// check if test passed
EXPECT_EQ(0, bytes_assigned);
EXPECT_EQ(consumed_plan->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(consumed_plan->GetDataBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(consumed_plan->GetLocalBytesUsed(), 0);
EXPECT_EQ(consumed_plan->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
// clean up
delete consumed_plan;
}
TEST_F(DataPlanTest, AssignBytesToInactiveExpired) {
// create expired plan
std::string name = "Expired Plan";
DataPlan::Type type = DataPlan::kTypeMeteredFree;
base::TimeDelta twelve_hours = base::TimeDelta::FromHours(12);
base::Time now = base::Time::Now();
base::Time start_time = now - 2 * twelve_hours;
base::Time end_time = now - twelve_hours;
ByteCount max_bytes = 100 * kBytesPerMegabyte;
ByteCount used_bytes = 0;
DataPlan *expired_plan = new(std::nothrow) DataPlan(name, type, now,
start_time, end_time,
max_bytes, used_bytes);
ASSERT_TRUE(expired_plan != NULL);
EXPECT_FALSE(expired_plan->IsActive());
ByteCount bytes_to_assign = 1 * kBytesPerMegabyte;
// simulate assigning bytes to the expired plan
ByteCount bytes_assigned = DataPlan::AssignBytesToPlan(
expired_plan, bytes_to_assign);
// check if test passed
EXPECT_EQ(0, bytes_assigned);
EXPECT_EQ(expired_plan->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(expired_plan->GetDataBytesUsed(), 0);
EXPECT_EQ(expired_plan->GetLocalBytesUsed(), 0);
EXPECT_EQ(expired_plan->GetTotalBytesUsed(), 0);
// clean up
delete expired_plan;
}
TEST_F(DataPlanTest, AssignBytesToUnlimited) {
ByteCount bytes_to_assign = 200 * kBytesPerMegabyte;
// simulate assigning bytes to a plan
ByteCount bytes_assigned = DataPlan::AssignBytesToPlan(
current_unlimited_plan_, bytes_to_assign);
// check if test passed
EXPECT_EQ(bytes_to_assign, bytes_assigned);
EXPECT_EQ(current_unlimited_plan_->GetDataBytesMax(), 0);
EXPECT_EQ(current_unlimited_plan_->GetDataBytesUsed(), 5 * kBytesPerMegabyte);
EXPECT_EQ(current_unlimited_plan_->GetLocalBytesUsed(),
200 * kBytesPerMegabyte);
EXPECT_EQ(current_unlimited_plan_->GetTotalBytesUsed(),
205 * kBytesPerMegabyte);
EXPECT_TRUE(current_unlimited_plan_->IsActive());
}
TEST_F(DataPlanTest, AssignBytesToMeteredNotConsumed) {
ByteCount bytes_to_assign = 45 * kBytesPerMegabyte;
// simulate assigning bytes to a plan
ByteCount bytes_assigned = DataPlan::AssignBytesToPlan(
current_available_metered_plan_, bytes_to_assign);
// check if test passed
EXPECT_EQ(bytes_to_assign, bytes_assigned);
EXPECT_EQ(current_available_metered_plan_->GetDataBytesMax(),
100 * kBytesPerMegabyte);
EXPECT_EQ(current_available_metered_plan_->GetDataBytesUsed(),
5 * kBytesPerMegabyte);
EXPECT_EQ(current_available_metered_plan_->GetLocalBytesUsed(),
45 * kBytesPerMegabyte);
EXPECT_EQ(current_available_metered_plan_->GetTotalBytesUsed(),
50 * kBytesPerMegabyte);
EXPECT_TRUE(current_available_metered_plan_->IsActive());
}
TEST_F(DataPlanTest, AssignBytesToMeteredConsumed) {
ByteCount bytes_to_assign = 95 * kBytesPerMegabyte;
// simulate assigning bytes to a plan
ByteCount bytes_assigned = DataPlan::AssignBytesToPlan(
current_available_metered_plan_, bytes_to_assign);
// check if test passed
EXPECT_EQ(bytes_to_assign, bytes_assigned);
EXPECT_EQ(current_available_metered_plan_->GetDataBytesMax(),
100 * kBytesPerMegabyte);
EXPECT_EQ(current_available_metered_plan_->GetDataBytesUsed(),
5 * kBytesPerMegabyte);
EXPECT_EQ(current_available_metered_plan_->GetLocalBytesUsed(),
95 * kBytesPerMegabyte);
EXPECT_EQ(current_available_metered_plan_->GetTotalBytesUsed(),
100 * kBytesPerMegabyte);
EXPECT_FALSE(current_available_metered_plan_->IsActive());
}
TEST_F(DataPlanTest, AssignBytesToMeteredWithOverage) {
ByteCount bytes_to_assign = 200 * kBytesPerMegabyte;
// simulate assigning bytes to a plan
ByteCount bytes_assigned = DataPlan::AssignBytesToPlan(
current_available_metered_plan_, bytes_to_assign);
// check if test passed
EXPECT_EQ(95 * kBytesPerMegabyte, bytes_assigned);
EXPECT_EQ(current_available_metered_plan_->GetDataBytesMax(),
100 * kBytesPerMegabyte);
EXPECT_EQ(current_available_metered_plan_->GetDataBytesUsed(),
5 * kBytesPerMegabyte);
EXPECT_EQ(current_available_metered_plan_->GetLocalBytesUsed(),
95 * kBytesPerMegabyte);
EXPECT_EQ(current_available_metered_plan_->GetTotalBytesUsed(),
100 * kBytesPerMegabyte);
EXPECT_FALSE(current_available_metered_plan_->IsActive());
}
// tests for local byte counter maintenance across plan transitions
// empty list, call should fail
TEST_F(DataPlanTest, NoActivePlans) {
// create empty list
DataPlanList data_plans;
ASSERT_TRUE(data_plans.empty());
// set up mock expectations and method return values
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
// simulate a byte counter update
uint64 rx_bytes = 25 * kBytesPerMegabyte;
uint64 tx_bytes = 25 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_FALSE(result);
}
// single plan, usage doesn't consume
TEST_F(DataPlanTest, OnePlanNotConsumed) {
DataPlanList data_plans;
data_plans.push_back(plan_one_);
// set up mock expectations and method return values
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
// simulate a byte counter update
uint64 rx_bytes = 25 * kBytesPerMegabyte;
uint64 tx_bytes = 25 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(plan_one_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_one_->GetLocalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetTotalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_TRUE(plan_one_->IsActive());
}
// single plan, usage exactly consumes
TEST_F(DataPlanTest, OnePlanConsumed) {
DataPlanList data_plans;
data_plans.push_back(plan_one_);
// set up mock expectations and method return values
{
testing::InSequence expect_calls_in_order;
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_one_))).Times(1);
EXPECT_CALL(device_mock_, StopByteCounter()).Times(1);
}
// simulate a byte counter update
uint64 rx_bytes = 50 * kBytesPerMegabyte;
uint64 tx_bytes = 50 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(plan_one_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_one_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_one_->IsActive());
}
// single plan, usage consumes and leaves overage but no active plan
TEST_F(DataPlanTest, OnePlanConsumedWithOverage) {
DataPlanList data_plans;
data_plans.push_back(plan_one_);
// set up mock expectations and method return values
{
testing::InSequence expect_calls_in_order;
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_one_))).Times(1);
EXPECT_CALL(device_mock_, StopByteCounter()).Times(1);
}
// simulate a byte counter update
uint64 rx_bytes = 55 * kBytesPerMegabyte;
uint64 tx_bytes = 55 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(plan_one_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_one_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_one_->IsActive());
}
// two plans, first is inactive because quota consumed and second is active
// usage is applied to but does not consume second plan
TEST_F(DataPlanTest, TwoPlansFirstInactiveConsumed) {
// create consumed plan and put it in list
std::string name = "Consumed Plan";
DataPlan::Type type = DataPlan::kTypeMeteredFree;
base::TimeDelta twelve_hours = base::TimeDelta::FromHours(12);
base::Time now = base::Time::Now();
base::Time start_time = now - twelve_hours;
base::Time end_time = now + twelve_hours;
ByteCount max_bytes = 100 * kBytesPerMegabyte;
ByteCount used_bytes = 100 * kBytesPerMegabyte;
DataPlan *consumed_plan = new(std::nothrow) DataPlan(name, type, now,
start_time, end_time,
max_bytes, used_bytes);
ASSERT_TRUE(consumed_plan != NULL);
DataPlanList data_plans;
data_plans.push_back(consumed_plan);
// use active plan from test fixture
data_plans.push_back(plan_two_);
// set up mock expectations and method return values
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
// simulate a byte counter update
uint64 rx_bytes = 25 * kBytesPerMegabyte;
uint64 tx_bytes = 25 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(consumed_plan->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(consumed_plan->GetDataBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(consumed_plan->GetLocalBytesUsed(), 0);
EXPECT_EQ(consumed_plan->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(consumed_plan->IsActive());
EXPECT_EQ(plan_two_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_two_->GetLocalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetTotalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_TRUE(plan_two_->IsActive());
// clean up
delete consumed_plan;
}
// two plans, first is inactive because it has expired and second is active
// usage is applied to but does not consume second plan
TEST_F(DataPlanTest, TwoPlansFirstInactiveExpired) {
// create expired plan and put it in list
std::string name = "Expired Plan";
DataPlan::Type type = DataPlan::kTypeMeteredFree;
base::TimeDelta twelve_hours = base::TimeDelta::FromHours(12);
base::Time now = base::Time::Now();
base::Time start_time = now - 2 * twelve_hours;
base::Time end_time = now - twelve_hours;
ByteCount max_bytes = 100 * kBytesPerMegabyte;
ByteCount used_bytes = 0;
DataPlan *expired_plan = new(std::nothrow) DataPlan(name, type, now,
start_time, end_time,
max_bytes, used_bytes);
ASSERT_TRUE(expired_plan != NULL);
DataPlanList data_plans;
data_plans.push_back(expired_plan);
// use active plan from test fixture
data_plans.push_back(plan_two_);
// set up mock expectations and method return values
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
// simulate a byte counter update
uint64 rx_bytes = 25 * kBytesPerMegabyte;
uint64 tx_bytes = 25 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(expired_plan->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(expired_plan->GetDataBytesUsed(), 0);
EXPECT_EQ(expired_plan->GetLocalBytesUsed(), 0);
EXPECT_EQ(expired_plan->GetTotalBytesUsed(), 0);
EXPECT_FALSE(expired_plan->IsActive());
EXPECT_EQ(plan_two_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_two_->GetLocalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetTotalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_TRUE(plan_two_->IsActive());
// clean up
delete expired_plan;
}
// two plans, first is unlimited and should absorb all usage
// second plan should remain untouched
TEST_F(DataPlanTest, TwoPlansFirstUnlimited) {
// use plans from test fixture
DataPlanList data_plans;
data_plans.push_back(current_unlimited_plan_);
data_plans.push_back(plan_two_);
// set up mock expectations and method return values
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
// simulate a byte counter update
uint64 rx_bytes = 100 * kBytesPerMegabyte;
uint64 tx_bytes = 100 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(current_unlimited_plan_->GetDataBytesMax(), 0);
EXPECT_EQ(current_unlimited_plan_->GetDataBytesUsed(), 5 * kBytesPerMegabyte);
EXPECT_EQ(current_unlimited_plan_->GetLocalBytesUsed(),
200 * kBytesPerMegabyte);
EXPECT_EQ(current_unlimited_plan_->GetTotalBytesUsed(),
205 * kBytesPerMegabyte);
EXPECT_TRUE(current_unlimited_plan_->IsActive());
EXPECT_EQ(plan_two_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_two_->GetLocalBytesUsed(), 0);
EXPECT_EQ(plan_two_->GetTotalBytesUsed(), 0);
EXPECT_TRUE(plan_two_->IsActive());
}
// two plans, the first is metered and the second is unlimited
// usage consumes the first plan, and the overage is absorbed by the second
TEST_F(DataPlanTest, TwoPlansSecondUnlimited) {
// use plans from test fixture
DataPlanList data_plans;
data_plans.push_back(plan_one_);
data_plans.push_back(current_unlimited_plan_);
// set up mock expectations and method return values
{
testing::InSequence expect_calls_in_order;
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_one_))).Times(1);
}
// simulate a byte counter update
uint64 rx_bytes = 75 * kBytesPerMegabyte;
uint64 tx_bytes = 75 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(plan_one_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_one_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_one_->IsActive());
EXPECT_EQ(current_unlimited_plan_->GetDataBytesMax(), 0);
EXPECT_EQ(current_unlimited_plan_->GetDataBytesUsed(), 5 * kBytesPerMegabyte);
EXPECT_EQ(current_unlimited_plan_->GetLocalBytesUsed(),
50 * kBytesPerMegabyte);
EXPECT_EQ(current_unlimited_plan_->GetTotalBytesUsed(),
55 * kBytesPerMegabyte);
EXPECT_TRUE(current_unlimited_plan_->IsActive());
}
// two plans, usage doesn't consume first
TEST_F(DataPlanTest, TwoPlansFirstNotConsumed) {
DataPlanList data_plans;
data_plans.push_back(plan_one_);
data_plans.push_back(plan_two_);
// set up mock expectations and method return values
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
// simulate a byte counter update
uint64 rx_bytes = 25 * kBytesPerMegabyte;
uint64 tx_bytes = 25 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(plan_one_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_one_->GetLocalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetTotalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_TRUE(plan_one_->IsActive());
EXPECT_EQ(plan_two_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_two_->GetLocalBytesUsed(), 0);
EXPECT_EQ(plan_two_->GetTotalBytesUsed(), 0);
EXPECT_TRUE(plan_two_->IsActive());
}
// two plans, usage consumes first, doesn't consume second
TEST_F(DataPlanTest, TwoPlansSecondNotConsumed) {
DataPlanList data_plans;
data_plans.push_back(plan_one_);
data_plans.push_back(plan_two_);
// set up mock expectations and method return values
{
testing::InSequence expect_calls_in_order;
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_one_))).Times(1);
}
// simulate a byte counter update
uint64 rx_bytes = 75 * kBytesPerMegabyte;
uint64 tx_bytes = 75 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(plan_one_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_one_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_one_->IsActive());
EXPECT_EQ(plan_two_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_two_->GetLocalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetTotalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_TRUE(plan_two_->IsActive());
}
// two plans, usage consumes first, consumes second exactly
TEST_F(DataPlanTest, TwoPlansSecondConsumed) {
DataPlanList data_plans;
data_plans.push_back(plan_one_);
data_plans.push_back(plan_two_);
// set up mock expectations and method return values
{
testing::InSequence expect_calls_in_order;
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_one_))).Times(1);
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_two_))).Times(1);
EXPECT_CALL(device_mock_, StopByteCounter()).Times(1);
}
// simulate a byte counter update
uint64 rx_bytes = 100 * kBytesPerMegabyte;
uint64 tx_bytes = 100 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(plan_one_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_one_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_one_->IsActive());
EXPECT_EQ(plan_two_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_two_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_two_->IsActive());
}
// two plans, usage consumes first, consumes second, with overage
TEST_F(DataPlanTest, TwoPlansSecondConsumedWithOverage) {
DataPlanList data_plans;
data_plans.push_back(plan_one_);
data_plans.push_back(plan_two_);
// set up mock expectations and method return values
{
testing::InSequence expect_calls_in_order;
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_one_))).Times(1);
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_two_))).Times(1);
EXPECT_CALL(device_mock_, StopByteCounter()).Times(1);
}
// simulate a byte counter update
uint64 rx_bytes = 105 * kBytesPerMegabyte;
uint64 tx_bytes = 105 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(plan_one_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_one_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_one_->IsActive());
EXPECT_EQ(plan_two_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_two_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_two_->IsActive());
}
// three plans, usage doesn't consume first
TEST_F(DataPlanTest, ThreePlansFirstNotConsumed) {
DataPlanList data_plans;
data_plans.push_back(plan_one_);
data_plans.push_back(plan_two_);
data_plans.push_back(plan_three_);
// set up mock expectations and method return values
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
// simulate a byte counter update
uint64 rx_bytes = 25 * kBytesPerMegabyte;
uint64 tx_bytes = 25 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(plan_one_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_one_->GetLocalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetTotalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_TRUE(plan_one_->IsActive());
EXPECT_EQ(plan_two_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_two_->GetLocalBytesUsed(), 0);
EXPECT_EQ(plan_two_->GetTotalBytesUsed(), 0);
EXPECT_TRUE(plan_two_->IsActive());
EXPECT_EQ(plan_three_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_three_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_three_->GetLocalBytesUsed(), 0);
EXPECT_EQ(plan_three_->GetTotalBytesUsed(), 0);
EXPECT_TRUE(plan_three_->IsActive());
}
// three plans, usage consumes first, doesn't consume second
TEST_F(DataPlanTest, ThreePlansSecondNotConsumed) {
DataPlanList data_plans;
data_plans.push_back(plan_one_);
data_plans.push_back(plan_two_);
data_plans.push_back(plan_three_);
// set up mock expectations and method return values
{
testing::InSequence expect_calls_in_order;
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_one_))).Times(1);
}
// simulate a byte counter update
uint64 rx_bytes = 75 * kBytesPerMegabyte;
uint64 tx_bytes = 75 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(plan_one_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_one_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_one_->IsActive());
EXPECT_EQ(plan_two_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_two_->GetLocalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetTotalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_TRUE(plan_two_->IsActive());
EXPECT_EQ(plan_three_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_three_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_three_->GetLocalBytesUsed(), 0);
EXPECT_EQ(plan_three_->GetTotalBytesUsed(), 0);
EXPECT_TRUE(plan_three_->IsActive());
}
// three plans, usage consumes first, consumes second, doesn't consume third
TEST_F(DataPlanTest, ThreePlansThirdNotConsumed) {
DataPlanList data_plans;
data_plans.push_back(plan_one_);
data_plans.push_back(plan_two_);
data_plans.push_back(plan_three_);
// set up mock expectations and method return values
{
testing::InSequence expect_calls_in_order;
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_one_))).Times(1);
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_two_))).Times(1);
}
// simulate a byte counter update
uint64 rx_bytes = 125 * kBytesPerMegabyte;
uint64 tx_bytes = 125 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(plan_one_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_one_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_one_->IsActive());
EXPECT_EQ(plan_two_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_two_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_two_->IsActive());
EXPECT_EQ(plan_three_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_three_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_three_->GetLocalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_EQ(plan_three_->GetTotalBytesUsed(), 50 * kBytesPerMegabyte);
EXPECT_TRUE(plan_three_->IsActive());
}
// three plans, usage consumes first, consumes second, exactly consumes third
TEST_F(DataPlanTest, ThreePlansThirdConsumed) {
DataPlanList data_plans;
data_plans.push_back(plan_one_);
data_plans.push_back(plan_two_);
data_plans.push_back(plan_three_);
// set up mock expectations and method return values
{
testing::InSequence expect_calls_in_order;
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_one_))).Times(1);
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_two_))).Times(1);
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_three_))).Times(1);
EXPECT_CALL(device_mock_, StopByteCounter()).Times(1);
}
// simulate a byte counter update
uint64 rx_bytes = 150 * kBytesPerMegabyte;
uint64 tx_bytes = 150 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(plan_one_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_one_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_one_->IsActive());
EXPECT_EQ(plan_two_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_two_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_two_->IsActive());
EXPECT_EQ(plan_three_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_three_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_three_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_three_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_three_->IsActive());
}
// three plans, usage consumes first, consumes second, consumes third w/ overage
TEST_F(DataPlanTest, ThreePlansThirdConsumedWithOverage) {
DataPlanList data_plans;
data_plans.push_back(plan_one_);
data_plans.push_back(plan_two_);
data_plans.push_back(plan_three_);
// set up mock expectations and method return values
{
testing::InSequence expect_calls_in_order;
EXPECT_CALL(device_mock_, ByteCounterRunning())
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_one_))).Times(1);
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_two_))).Times(1);
EXPECT_CALL(service_manager_mock_,
OnDataPlanInactive(testing::Ref(service_mock_),
testing::Ref(*plan_three_))).Times(1);
EXPECT_CALL(device_mock_, StopByteCounter()).Times(1);
}
// simulate a byte counter update
uint64 rx_bytes = 155 * kBytesPerMegabyte;
uint64 tx_bytes = 155 * kBytesPerMegabyte;
bool result = DataPlan::OnByteCounterUpdate(&data_plans, &service_mock_,
&service_manager_mock_,
&device_mock_, rx_bytes,
tx_bytes);
// check if test passed
EXPECT_TRUE(result);
EXPECT_EQ(plan_one_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_one_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_one_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_one_->IsActive());
EXPECT_EQ(plan_two_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_two_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_two_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_two_->IsActive());
EXPECT_EQ(plan_three_->GetDataBytesMax(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_three_->GetDataBytesUsed(), 0);
EXPECT_EQ(plan_three_->GetLocalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_EQ(plan_three_->GetTotalBytesUsed(), 100 * kBytesPerMegabyte);
EXPECT_FALSE(plan_three_->IsActive());
}
} // namespace cashew