shill: cellular: Modify ActivatingIccidStore to keep track of MEIDs separately.

Renamed ActivatingIccidStore to PendingActivationStore. Modified the
public interface to interact with MEIDs separately from ICCIDs.

BUG=chromium:225135
TEST=1. Build and run unittests.
     2. On link, verify that LTE activation still works. Make sure that
     the ICCID gets written to a file called
     "activating_iccid_store.profile" in /var/cache/shill.

Change-Id: I383bd80d222f43d354cc72b437e6b037fc40492f
Reviewed-on: https://gerrit.chromium.org/gerrit/46954
Reviewed-by: Thieu Le <thieule@chromium.org>
Reviewed-by: Ben Chan <benchan@chromium.org>
Commit-Queue: Arman Uguray <armansito@chromium.org>
Tested-by: Arman Uguray <armansito@chromium.org>
diff --git a/pending_activation_store_unittest.cc b/pending_activation_store_unittest.cc
new file mode 100644
index 0000000..380724a
--- /dev/null
+++ b/pending_activation_store_unittest.cc
@@ -0,0 +1,291 @@
+// Copyright (c) 2013 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/pending_activation_store.h"
+
+#include <base/files/scoped_temp_dir.h>
+#include <base/memory/scoped_ptr.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include "shill/glib.h"
+#include "shill/mock_store.h"
+
+using base::FilePath;
+using ::testing::_;
+using ::testing::DoAll;
+using ::testing::Mock;
+using ::testing::Return;
+using ::testing::SetArgumentPointee;
+
+namespace shill {
+
+class PendingActivationStoreTest : public ::testing::Test {
+ public:
+  PendingActivationStoreTest() : mock_store_(new MockStore()) {}
+
+ protected:
+  void SetMockStore() {
+    store_.storage_.reset(mock_store_.release());
+  }
+
+  GLib glib_;
+  scoped_ptr<MockStore> mock_store_;
+  PendingActivationStore store_;
+};
+
+TEST_F(PendingActivationStoreTest, FileInteractions) {
+  const char kEntry1[] = "1234";
+  const char kEntry2[] = "4321";
+
+  base::ScopedTempDir temp_dir;
+  EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
+
+  EXPECT_TRUE(store_.InitStorage(&glib_, temp_dir.path()));
+
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierICCID, kEntry1));
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierICCID, kEntry2));
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierMEID, kEntry1));
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierMEID, kEntry2));
+
+  EXPECT_TRUE(store_.SetActivationState(
+      PendingActivationStore::kIdentifierICCID,
+      kEntry1,
+      PendingActivationStore::kStatePending));
+  EXPECT_TRUE(store_.SetActivationState(
+      PendingActivationStore::kIdentifierICCID,
+      kEntry2,
+      PendingActivationStore::kStateActivated));
+
+  EXPECT_EQ(PendingActivationStore::kStatePending,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierICCID, kEntry1));
+  EXPECT_EQ(PendingActivationStore::kStateActivated,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierICCID, kEntry2));
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierMEID, kEntry1));
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierMEID, kEntry2));
+
+  EXPECT_TRUE(store_.SetActivationState(
+      PendingActivationStore::kIdentifierMEID,
+      kEntry1,
+      PendingActivationStore::kStateActivated));
+  EXPECT_TRUE(store_.SetActivationState(
+      PendingActivationStore::kIdentifierMEID,
+      kEntry2,
+      PendingActivationStore::kStatePendingTimeout));
+
+  EXPECT_EQ(PendingActivationStore::kStatePending,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierICCID, kEntry1));
+  EXPECT_EQ(PendingActivationStore::kStateActivated,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierICCID, kEntry2));
+  EXPECT_EQ(PendingActivationStore::kStateActivated,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierMEID, kEntry1));
+  EXPECT_EQ(PendingActivationStore::kStatePendingTimeout,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierMEID, kEntry2));
+
+  EXPECT_TRUE(store_.SetActivationState(
+      PendingActivationStore::kIdentifierICCID,
+      kEntry1,
+      PendingActivationStore::kStateActivated));
+  EXPECT_TRUE(store_.SetActivationState(
+      PendingActivationStore::kIdentifierICCID,
+      kEntry2,
+      PendingActivationStore::kStatePending));
+
+  EXPECT_EQ(PendingActivationStore::kStateActivated,
+            store_.GetActivationState(PendingActivationStore::kIdentifierICCID,
+                                      kEntry1));
+  EXPECT_EQ(PendingActivationStore::kStatePending,
+            store_.GetActivationState(PendingActivationStore::kIdentifierICCID,
+                                      kEntry2));
+
+  // Close and reopen the file to verify that the entries persisted.
+  EXPECT_TRUE(store_.InitStorage(&glib_, temp_dir.path()));
+
+  EXPECT_EQ(PendingActivationStore::kStateActivated,
+            store_.GetActivationState(PendingActivationStore::kIdentifierICCID,
+                                      kEntry1));
+  EXPECT_EQ(PendingActivationStore::kStatePending,
+            store_.GetActivationState(PendingActivationStore::kIdentifierICCID,
+                                      kEntry2));
+  EXPECT_EQ(PendingActivationStore::kStateActivated,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierMEID, kEntry1));
+  EXPECT_EQ(PendingActivationStore::kStatePendingTimeout,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierMEID, kEntry2));
+
+  EXPECT_TRUE(store_.RemoveEntry(
+      PendingActivationStore::kIdentifierMEID, kEntry1));
+  EXPECT_TRUE(store_.RemoveEntry(
+      PendingActivationStore::kIdentifierICCID, kEntry2));
+
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierMEID, kEntry1));
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierICCID, kEntry2));
+  EXPECT_EQ(PendingActivationStore::kStateActivated,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierICCID, kEntry1));
+  EXPECT_EQ(PendingActivationStore::kStatePendingTimeout,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierMEID, kEntry2));
+
+  EXPECT_TRUE(store_.RemoveEntry(
+      PendingActivationStore::kIdentifierICCID, kEntry1));
+  EXPECT_TRUE(store_.RemoveEntry(
+      PendingActivationStore::kIdentifierMEID, kEntry2));
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierICCID, kEntry1));
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierMEID, kEntry2));
+
+  EXPECT_TRUE(store_.InitStorage(&glib_, temp_dir.path()));
+
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierMEID, kEntry1));
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierICCID, kEntry2));
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierICCID, kEntry1));
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(
+                PendingActivationStore::kIdentifierMEID, kEntry2));
+}
+
+TEST_F(PendingActivationStoreTest, GetActivationState) {
+  MockStore *mock_store = mock_store_.get();
+  SetMockStore();
+
+  const char kEntry[] = "12345689";
+
+  // Value not found
+  EXPECT_CALL(*mock_store, GetInt(PendingActivationStore::kIccidGroupId,
+                                  kEntry,
+                                  _))
+      .WillOnce(Return(false));
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(PendingActivationStore::kIdentifierICCID,
+                                      kEntry));
+
+  // File contains invalid entry
+  EXPECT_CALL(*mock_store,
+              GetInt(PendingActivationStore::kMeidGroupId, kEntry, _))
+      .WillOnce(DoAll(SetArgumentPointee<2>(4), Return(true)));
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(PendingActivationStore::kIdentifierMEID,
+                                      kEntry));
+  EXPECT_CALL(*mock_store,
+              GetInt(PendingActivationStore::kMeidGroupId, kEntry, _))
+      .WillOnce(DoAll(SetArgumentPointee<2>(0), Return(true)));
+  EXPECT_EQ(PendingActivationStore::kStateUnknown,
+            store_.GetActivationState(PendingActivationStore::kIdentifierMEID,
+                                      kEntry));
+  Mock::VerifyAndClearExpectations(mock_store);
+
+  // All enum values
+  EXPECT_CALL(*mock_store,
+              GetInt(PendingActivationStore::kIccidGroupId, kEntry, _))
+      .WillOnce(DoAll(SetArgumentPointee<2>(1), Return(true)));
+  EXPECT_EQ(PendingActivationStore::kStatePending,
+            store_.GetActivationState(PendingActivationStore::kIdentifierICCID,
+                                      kEntry));
+  EXPECT_CALL(*mock_store,
+              GetInt(PendingActivationStore::kIccidGroupId, kEntry, _))
+      .WillOnce(DoAll(SetArgumentPointee<2>(2), Return(true)));
+  EXPECT_EQ(PendingActivationStore::kStateActivated,
+            store_.GetActivationState(PendingActivationStore::kIdentifierICCID,
+                                      kEntry));
+  Mock::VerifyAndClearExpectations(mock_store);
+}
+
+TEST_F(PendingActivationStoreTest, SetActivationState) {
+  MockStore *mock_store = mock_store_.get();
+  SetMockStore();
+
+  const char kEntry[] = "12345689";
+
+  EXPECT_CALL(*mock_store, Flush()).WillRepeatedly(Return(true));
+  EXPECT_CALL(*mock_store,
+              SetInt(PendingActivationStore::kIccidGroupId, kEntry, _))
+      .WillOnce(Return(false));
+  EXPECT_FALSE(store_.SetActivationState(
+      PendingActivationStore::kIdentifierICCID,
+      kEntry,
+      PendingActivationStore::kStateUnknown));
+  EXPECT_FALSE(store_.SetActivationState(
+      PendingActivationStore::kIdentifierICCID,
+      kEntry,
+      PendingActivationStore::kStateUnknown));
+  EXPECT_FALSE(store_.SetActivationState(
+      PendingActivationStore::kIdentifierICCID,
+      kEntry,
+      PendingActivationStore::kStatePending));
+
+  EXPECT_CALL(*mock_store,
+              SetInt(PendingActivationStore::kIccidGroupId, kEntry, _))
+      .WillRepeatedly(Return(true));
+  EXPECT_FALSE(store_.SetActivationState(
+      PendingActivationStore::kIdentifierICCID,
+      kEntry, static_cast<PendingActivationStore::State>(-1)));
+  EXPECT_FALSE(store_.SetActivationState(
+      PendingActivationStore::kIdentifierICCID,
+      kEntry, static_cast<PendingActivationStore::State>(4)));
+  EXPECT_FALSE(store_.SetActivationState(
+      PendingActivationStore::kIdentifierICCID,
+      kEntry, PendingActivationStore::kStateUnknown));
+  EXPECT_TRUE(store_.SetActivationState(
+      PendingActivationStore::kIdentifierICCID,
+      kEntry,
+      PendingActivationStore::kStatePending));
+  EXPECT_TRUE(store_.SetActivationState(
+      PendingActivationStore::kIdentifierICCID,
+      kEntry,
+      PendingActivationStore::kStateActivated));
+}
+
+TEST_F(PendingActivationStoreTest, RemoveEntry) {
+  MockStore *mock_store = mock_store_.get();
+  SetMockStore();
+
+  const char kEntry[] = "12345689";
+
+  EXPECT_CALL(*mock_store, Flush()).WillRepeatedly(Return(true));
+  EXPECT_CALL(*mock_store, DeleteKey(PendingActivationStore::kIccidGroupId,
+                                     kEntry))
+      .WillOnce(Return(false));
+  EXPECT_FALSE(store_.RemoveEntry(PendingActivationStore::kIdentifierICCID,
+                                  kEntry));
+  EXPECT_CALL(*mock_store, DeleteKey(PendingActivationStore::kIccidGroupId,
+                                     kEntry))
+      .WillOnce(Return(true));
+  EXPECT_TRUE(store_.RemoveEntry(PendingActivationStore::kIdentifierICCID,
+                                 kEntry));
+}
+
+}  // namespace shill