shill: Implement CreateProfile, PushProfile, PopProfile

Collateral fixes: Profiles now create a header at the beginning
of the file, and this feature is plumbed down through key_file_store
and glib.  InitStorage can be configured to fail if the profile
already exists/doesn't yet exist.

BUG=chromium-os:22221
TEST=New unit tests

Change-Id: Ie7c2d0dee97891b7850cec75b74052fce77eee8f
Reviewed-on: https://gerrit.chromium.org/gerrit/10884
Reviewed-by: mukesh agrawal <quiche@chromium.org>
Reviewed-by: Darin Petkov <petkov@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
diff --git a/key_file_store_unittest.cc b/key_file_store_unittest.cc
index c6e014b..4733ba1 100644
--- a/key_file_store_unittest.cc
+++ b/key_file_store_unittest.cc
@@ -64,6 +64,7 @@
 TEST_F(KeyFileStoreTest, OpenClose) {
   EXPECT_FALSE(store_.key_file_);
 
+  EXPECT_FALSE(store_.IsNonEmpty());
   ASSERT_TRUE(store_.Open());
   EXPECT_TRUE(store_.key_file_);
   EXPECT_EQ(1, store_.crypto_.cryptos_.size());
@@ -95,6 +96,7 @@
                                   "[%s]\n"
                                   "[%s]\n",
                                   kGroupA, kGroupB, kGroupC));
+  EXPECT_TRUE(store_.IsNonEmpty());
   ASSERT_TRUE(store_.Open());
   set<string> groups = store_.GetGroups();
   EXPECT_EQ(3, groups.size());
@@ -496,6 +498,20 @@
   ASSERT_FALSE(OpenCheckClose(kGroup, kKey1, kValue1));
 }
 
+TEST_F(KeyFileStoreTest, EmptyFile) {
+  ASSERT_TRUE(store_.Open());
+  ASSERT_TRUE(store_.Close());
+  EXPECT_FALSE(store_.IsNonEmpty());
+}
+
+TEST_F(KeyFileStoreTest, SetHeader) {
+  ASSERT_TRUE(store_.Open());
+  ASSERT_TRUE(store_.SetHeader("this is a test"));
+  ASSERT_TRUE(store_.Close());
+  EXPECT_TRUE(store_.IsNonEmpty());
+  ASSERT_TRUE(store_.Open());
+}
+
 TEST_F(KeyFileStoreTest, Combo) {
   static const char kGroupA[] = "square";
   static const char kGroupB[] = "circle";