Home | History | Annotate | Download | only in ios
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #if !defined(__has_feature) || !__has_feature(objc_arc)
      6 #error "This file requires ARC support."
      7 #endif
      8 
      9 #import "remoting/ios/data_store.h"
     10 
     11 #import "base/compiler_specific.h"
     12 #import "testing/gtest_mac.h"
     13 
     14 namespace remoting {
     15 
     16 namespace {
     17 
     18 NSString* kHostId = @"testHost";
     19 NSString* kHostPin = @"testHostPin";
     20 NSString* kPairId = @"testPairId";
     21 NSString* kPairSecret = @"testPairSecret";
     22 
     23 }  // namespace
     24 
     25 class DataStoreTest : public ::testing::Test {
     26  protected:
     27   virtual void SetUp() OVERRIDE {
     28     store_ = [[DataStore allocWithZone:nil] init];
     29     RemoveAllHosts();
     30     EXPECT_EQ(0, HostCount());
     31   }
     32   virtual void TearDown() OVERRIDE { RemoveAllHosts(); }
     33 
     34   int HostCount() { return [[store_ allHosts] count]; }
     35 
     36   void RemoveAllHosts() {
     37     while (HostCount() > 0) {
     38       [store_ removeHost:[store_ allHosts].firstObject];
     39     }
     40     [store_ saveChanges];
     41   }
     42 
     43   DataStore* store_;
     44 };
     45 
     46 TEST(DataStoreTest_Static, IsSingleInstance) {
     47   DataStore* firstStore = [DataStore sharedStore];
     48 
     49   ASSERT_NSEQ(firstStore, [DataStore sharedStore]);
     50 }
     51 
     52 TEST(DataStoreTest_Static, RemoveAllHost) {
     53   // Test this functionality independently before expecting the fixture to do
     54   // this correctly during cleanup
     55   DataStore* store = [DataStore sharedStore];
     56 
     57   while ([[store allHosts] count]) {
     58     [store removeHost:[store allHosts].firstObject];
     59   }
     60 
     61   ASSERT_EQ(0, [[store allHosts] count]);
     62   store = nil;
     63 }
     64 
     65 TEST_F(DataStoreTest, CreateHost) {
     66 
     67   const HostPreferences* host = [store_ createHost:kHostId];
     68   ASSERT_STREQ([kHostId UTF8String], [host.hostId UTF8String]);
     69   ASSERT_EQ(1, HostCount());
     70 }
     71 
     72 TEST_F(DataStoreTest, GetHostForId) {
     73   const HostPreferences* host = [store_ getHostForId:kHostId];
     74   ASSERT_TRUE(host == nil);
     75 
     76   [store_ createHost:kHostId];
     77 
     78   host = [store_ getHostForId:kHostId];
     79 
     80   ASSERT_TRUE(host != nil);
     81   ASSERT_STREQ([kHostId UTF8String], [host.hostId UTF8String]);
     82 }
     83 
     84 TEST_F(DataStoreTest, SaveChanges) {
     85 
     86   const HostPreferences* newHost = [store_ createHost:kHostId];
     87 
     88   ASSERT_EQ(1, HostCount());
     89 
     90   // Default values for a new host
     91   ASSERT_TRUE([newHost.askForPin boolValue] == NO);
     92   ASSERT_TRUE(newHost.hostPin == nil);
     93   ASSERT_TRUE(newHost.pairId == nil);
     94   ASSERT_TRUE(newHost.pairSecret == nil);
     95 
     96   // Set new values and save
     97   newHost.askForPin = [NSNumber numberWithBool:YES];
     98   newHost.hostPin = kHostPin;
     99   newHost.pairId = kPairId;
    100   newHost.pairSecret = kPairSecret;
    101 
    102   [store_ saveChanges];
    103 
    104   // The next time the store is loaded the host will still be present, even
    105   // though we are about to release and reinit a new object
    106   store_ = nil;
    107   store_ = [[DataStore allocWithZone:nil] init];
    108   ASSERT_EQ(1, HostCount());
    109 
    110   const HostPreferences* host = [store_ getHostForId:kHostId];
    111   ASSERT_TRUE(host != nil);
    112   ASSERT_STREQ([kHostId UTF8String], [host.hostId UTF8String]);
    113   ASSERT_TRUE([host.askForPin boolValue] == YES);
    114   ASSERT_STREQ([kHostPin UTF8String], [host.hostPin UTF8String]);
    115   ASSERT_STREQ([kPairId UTF8String], [host.pairId UTF8String]);
    116   ASSERT_STREQ([kPairSecret UTF8String], [host.pairSecret UTF8String]);
    117 }
    118 
    119 }  // namespace remoting
    120