Home | History | Annotate | Download | only in shill
      1 //
      2 // Copyright (C) 2013 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 #include "shill/pending_activation_store.h"
     18 
     19 #include <base/files/scoped_temp_dir.h>
     20 #include <gmock/gmock.h>
     21 #include <gtest/gtest.h>
     22 
     23 #include "shill/mock_store.h"
     24 #include "shill/store_factory.h"
     25 
     26 using ::testing::_;
     27 using ::testing::DoAll;
     28 using ::testing::Mock;
     29 using ::testing::Return;
     30 using ::testing::SetArgumentPointee;
     31 
     32 namespace shill {
     33 
     34 class PendingActivationStoreTest : public ::testing::Test {
     35  public:
     36   PendingActivationStoreTest() : mock_store_(new MockStore()) {
     37   }
     38 
     39  protected:
     40   void SetMockStore() {
     41     store_.storage_.reset(mock_store_.release());
     42   }
     43 
     44   std::unique_ptr<MockStore> mock_store_;
     45   PendingActivationStore store_;
     46 };
     47 
     48 TEST_F(PendingActivationStoreTest, FileInteractions) {
     49   const char kEntry1[] = "1234";
     50   const char kEntry2[] = "4321";
     51 
     52   base::ScopedTempDir temp_dir;
     53   EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
     54 
     55   EXPECT_TRUE(store_.InitStorage(temp_dir.path()));
     56 
     57   EXPECT_EQ(PendingActivationStore::kStateUnknown,
     58             store_.GetActivationState(
     59                 PendingActivationStore::kIdentifierICCID, kEntry1));
     60   EXPECT_EQ(PendingActivationStore::kStateUnknown,
     61             store_.GetActivationState(
     62                 PendingActivationStore::kIdentifierICCID, kEntry2));
     63   EXPECT_EQ(PendingActivationStore::kStateUnknown,
     64             store_.GetActivationState(
     65                 PendingActivationStore::kIdentifierMEID, kEntry1));
     66   EXPECT_EQ(PendingActivationStore::kStateUnknown,
     67             store_.GetActivationState(
     68                 PendingActivationStore::kIdentifierMEID, kEntry2));
     69 
     70   EXPECT_TRUE(store_.SetActivationState(
     71       PendingActivationStore::kIdentifierICCID,
     72       kEntry1,
     73       PendingActivationStore::kStatePending));
     74   EXPECT_TRUE(store_.SetActivationState(
     75       PendingActivationStore::kIdentifierICCID,
     76       kEntry2,
     77       PendingActivationStore::kStateActivated));
     78 
     79   EXPECT_EQ(PendingActivationStore::kStatePending,
     80             store_.GetActivationState(
     81                 PendingActivationStore::kIdentifierICCID, kEntry1));
     82   EXPECT_EQ(PendingActivationStore::kStateActivated,
     83             store_.GetActivationState(
     84                 PendingActivationStore::kIdentifierICCID, kEntry2));
     85   EXPECT_EQ(PendingActivationStore::kStateUnknown,
     86             store_.GetActivationState(
     87                 PendingActivationStore::kIdentifierMEID, kEntry1));
     88   EXPECT_EQ(PendingActivationStore::kStateUnknown,
     89             store_.GetActivationState(
     90                 PendingActivationStore::kIdentifierMEID, kEntry2));
     91 
     92   EXPECT_TRUE(store_.SetActivationState(
     93       PendingActivationStore::kIdentifierMEID,
     94       kEntry1,
     95       PendingActivationStore::kStateActivated));
     96 
     97   EXPECT_EQ(PendingActivationStore::kStatePending,
     98             store_.GetActivationState(
     99                 PendingActivationStore::kIdentifierICCID, kEntry1));
    100   EXPECT_EQ(PendingActivationStore::kStateActivated,
    101             store_.GetActivationState(
    102                 PendingActivationStore::kIdentifierICCID, kEntry2));
    103   EXPECT_EQ(PendingActivationStore::kStateActivated,
    104             store_.GetActivationState(
    105                 PendingActivationStore::kIdentifierMEID, kEntry1));
    106 
    107   EXPECT_TRUE(store_.SetActivationState(
    108       PendingActivationStore::kIdentifierICCID,
    109       kEntry1,
    110       PendingActivationStore::kStateActivated));
    111   EXPECT_TRUE(store_.SetActivationState(
    112       PendingActivationStore::kIdentifierICCID,
    113       kEntry2,
    114       PendingActivationStore::kStatePending));
    115 
    116   EXPECT_EQ(PendingActivationStore::kStateActivated,
    117             store_.GetActivationState(PendingActivationStore::kIdentifierICCID,
    118                                       kEntry1));
    119   EXPECT_EQ(PendingActivationStore::kStatePending,
    120             store_.GetActivationState(PendingActivationStore::kIdentifierICCID,
    121                                       kEntry2));
    122 
    123   // Close and reopen the file to verify that the entries persisted.
    124   EXPECT_TRUE(store_.InitStorage(temp_dir.path()));
    125 
    126   EXPECT_EQ(PendingActivationStore::kStateActivated,
    127             store_.GetActivationState(PendingActivationStore::kIdentifierICCID,
    128                                       kEntry1));
    129   EXPECT_EQ(PendingActivationStore::kStatePending,
    130             store_.GetActivationState(PendingActivationStore::kIdentifierICCID,
    131                                       kEntry2));
    132   EXPECT_EQ(PendingActivationStore::kStateActivated,
    133             store_.GetActivationState(
    134                 PendingActivationStore::kIdentifierMEID, kEntry1));
    135 
    136   EXPECT_TRUE(store_.RemoveEntry(
    137       PendingActivationStore::kIdentifierMEID, kEntry1));
    138   EXPECT_TRUE(store_.RemoveEntry(
    139       PendingActivationStore::kIdentifierICCID, kEntry2));
    140 
    141   EXPECT_EQ(PendingActivationStore::kStateUnknown,
    142             store_.GetActivationState(
    143                 PendingActivationStore::kIdentifierMEID, kEntry1));
    144   EXPECT_EQ(PendingActivationStore::kStateUnknown,
    145             store_.GetActivationState(
    146                 PendingActivationStore::kIdentifierICCID, kEntry2));
    147   EXPECT_EQ(PendingActivationStore::kStateActivated,
    148             store_.GetActivationState(
    149                 PendingActivationStore::kIdentifierICCID, kEntry1));
    150 
    151   EXPECT_TRUE(store_.RemoveEntry(
    152       PendingActivationStore::kIdentifierICCID, kEntry1));
    153   EXPECT_TRUE(store_.RemoveEntry(
    154       PendingActivationStore::kIdentifierMEID, kEntry2));
    155   EXPECT_EQ(PendingActivationStore::kStateUnknown,
    156             store_.GetActivationState(
    157                 PendingActivationStore::kIdentifierICCID, kEntry1));
    158   EXPECT_EQ(PendingActivationStore::kStateUnknown,
    159             store_.GetActivationState(
    160                 PendingActivationStore::kIdentifierMEID, kEntry2));
    161 
    162   EXPECT_TRUE(store_.InitStorage(temp_dir.path()));
    163 
    164   EXPECT_EQ(PendingActivationStore::kStateUnknown,
    165             store_.GetActivationState(
    166                 PendingActivationStore::kIdentifierMEID, kEntry1));
    167   EXPECT_EQ(PendingActivationStore::kStateUnknown,
    168             store_.GetActivationState(
    169                 PendingActivationStore::kIdentifierICCID, kEntry2));
    170   EXPECT_EQ(PendingActivationStore::kStateUnknown,
    171             store_.GetActivationState(
    172                 PendingActivationStore::kIdentifierICCID, kEntry1));
    173   EXPECT_EQ(PendingActivationStore::kStateUnknown,
    174             store_.GetActivationState(
    175                 PendingActivationStore::kIdentifierMEID, kEntry2));
    176 }
    177 
    178 TEST_F(PendingActivationStoreTest, GetActivationState) {
    179   MockStore* mock_store = mock_store_.get();
    180   SetMockStore();
    181 
    182   const char kEntry[] = "12345689";
    183 
    184   // Value not found
    185   EXPECT_CALL(*mock_store, GetInt(PendingActivationStore::kIccidGroupId,
    186                                   kEntry,
    187                                   _))
    188       .WillOnce(Return(false));
    189   EXPECT_EQ(PendingActivationStore::kStateUnknown,
    190             store_.GetActivationState(PendingActivationStore::kIdentifierICCID,
    191                                       kEntry));
    192 
    193   // File contains invalid entry
    194   EXPECT_CALL(*mock_store,
    195               GetInt(PendingActivationStore::kMeidGroupId, kEntry, _))
    196       .WillOnce(DoAll(
    197           SetArgumentPointee<2>(
    198               static_cast<int>(PendingActivationStore::kStateMax)),
    199           Return(true)));
    200   EXPECT_EQ(PendingActivationStore::kStateUnknown,
    201             store_.GetActivationState(PendingActivationStore::kIdentifierMEID,
    202                                       kEntry));
    203   EXPECT_CALL(*mock_store,
    204               GetInt(PendingActivationStore::kMeidGroupId, kEntry, _))
    205       .WillOnce(DoAll(SetArgumentPointee<2>(0), Return(true)));
    206   EXPECT_EQ(PendingActivationStore::kStateUnknown,
    207             store_.GetActivationState(PendingActivationStore::kIdentifierMEID,
    208                                       kEntry));
    209   Mock::VerifyAndClearExpectations(mock_store);
    210 
    211   // All enum values
    212   EXPECT_CALL(*mock_store,
    213               GetInt(PendingActivationStore::kIccidGroupId, kEntry, _))
    214       .WillOnce(DoAll(SetArgumentPointee<2>(1), Return(true)));
    215   EXPECT_EQ(PendingActivationStore::kStatePending,
    216             store_.GetActivationState(PendingActivationStore::kIdentifierICCID,
    217                                       kEntry));
    218   EXPECT_CALL(*mock_store,
    219               GetInt(PendingActivationStore::kIccidGroupId, kEntry, _))
    220       .WillOnce(DoAll(SetArgumentPointee<2>(2), Return(true)));
    221   EXPECT_EQ(PendingActivationStore::kStateActivated,
    222             store_.GetActivationState(PendingActivationStore::kIdentifierICCID,
    223                                       kEntry));
    224   Mock::VerifyAndClearExpectations(mock_store);
    225 }
    226 
    227 TEST_F(PendingActivationStoreTest, SetActivationState) {
    228   MockStore* mock_store = mock_store_.get();
    229   SetMockStore();
    230 
    231   const char kEntry[] = "12345689";
    232 
    233   EXPECT_CALL(*mock_store, Flush()).WillRepeatedly(Return(true));
    234   EXPECT_CALL(*mock_store,
    235               SetInt(PendingActivationStore::kIccidGroupId, kEntry, _))
    236       .WillOnce(Return(false));
    237   EXPECT_FALSE(store_.SetActivationState(
    238       PendingActivationStore::kIdentifierICCID,
    239       kEntry,
    240       PendingActivationStore::kStateUnknown));
    241   EXPECT_FALSE(store_.SetActivationState(
    242       PendingActivationStore::kIdentifierICCID,
    243       kEntry,
    244       PendingActivationStore::kStateUnknown));
    245   EXPECT_FALSE(store_.SetActivationState(
    246       PendingActivationStore::kIdentifierICCID,
    247       kEntry,
    248       PendingActivationStore::kStatePending));
    249 
    250   EXPECT_CALL(*mock_store,
    251               SetInt(PendingActivationStore::kIccidGroupId, kEntry, _))
    252       .WillRepeatedly(Return(true));
    253   EXPECT_FALSE(store_.SetActivationState(
    254       PendingActivationStore::kIdentifierICCID,
    255       kEntry, static_cast<PendingActivationStore::State>(-1)));
    256   EXPECT_FALSE(store_.SetActivationState(
    257       PendingActivationStore::kIdentifierICCID,
    258       kEntry, PendingActivationStore::kStateMax));
    259   EXPECT_FALSE(store_.SetActivationState(
    260       PendingActivationStore::kIdentifierICCID,
    261       kEntry, PendingActivationStore::kStateUnknown));
    262   EXPECT_TRUE(store_.SetActivationState(
    263       PendingActivationStore::kIdentifierICCID,
    264       kEntry,
    265       PendingActivationStore::kStatePending));
    266   EXPECT_TRUE(store_.SetActivationState(
    267       PendingActivationStore::kIdentifierICCID,
    268       kEntry,
    269       PendingActivationStore::kStateActivated));
    270 }
    271 
    272 TEST_F(PendingActivationStoreTest, RemoveEntry) {
    273   MockStore* mock_store = mock_store_.get();
    274   SetMockStore();
    275 
    276   const char kEntry[] = "12345689";
    277 
    278   EXPECT_CALL(*mock_store, Flush()).WillRepeatedly(Return(true));
    279   EXPECT_CALL(*mock_store, DeleteKey(PendingActivationStore::kIccidGroupId,
    280                                      kEntry))
    281       .WillOnce(Return(false));
    282   EXPECT_FALSE(store_.RemoveEntry(PendingActivationStore::kIdentifierICCID,
    283                                   kEntry));
    284   EXPECT_CALL(*mock_store, DeleteKey(PendingActivationStore::kIccidGroupId,
    285                                      kEntry))
    286       .WillOnce(Return(true));
    287   EXPECT_TRUE(store_.RemoveEntry(PendingActivationStore::kIdentifierICCID,
    288                                  kEntry));
    289 }
    290 
    291 }  // namespace shill
    292