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