1// Copyright 2013 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#include "ios/public/consumer/base/supports_user_data.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "testing/gmock/include/gmock/gmock.h"
9#include "testing/gtest/include/gtest/gtest.h"
10#include "testing/platform_test.h"
11
12namespace ios {
13
14namespace {
15  const char* kTestData1Key = "test_data1";
16  const char* kTestData2Key = "test_data2";
17}  // namespace
18
19class TestData : public SupportsUserData::Data {
20 public:
21  TestData(bool* was_destroyed)
22      : was_destroyed_(was_destroyed) {
23    *was_destroyed_ = false;
24  }
25  virtual ~TestData() {
26    *was_destroyed_ = true;
27  }
28
29 private:
30  bool* was_destroyed_;
31};
32
33class TestSupportsUserData : public SupportsUserData {
34 public:
35  TestSupportsUserData() {}
36  virtual ~TestSupportsUserData() {}
37};
38
39class SupportsUserDataTest : public PlatformTest {
40 public:
41  virtual void SetUp() OVERRIDE {
42    PlatformTest::SetUp();
43
44    test_data1_was_destroyed_ = false;
45    test_data1_ = new TestData(&test_data1_was_destroyed_);
46    test_data2_was_destroyed_ = false;
47    test_data2_ = new TestData(&test_data2_was_destroyed_);
48    supports_user_data_.reset(new TestSupportsUserData());
49  }
50
51  virtual void TearDown() OVERRIDE {
52    if (!test_data1_was_destroyed_ &&
53        supports_user_data_ &&
54        supports_user_data_->GetUserData(kTestData1Key) != test_data1_)
55      delete test_data1_;
56    if (!test_data2_was_destroyed_ &&
57        supports_user_data_ &&
58        supports_user_data_->GetUserData(kTestData2Key) != test_data2_)
59      delete test_data2_;
60
61    PlatformTest::TearDown();
62  }
63
64 protected:
65  scoped_ptr<TestSupportsUserData> supports_user_data_;
66  bool test_data1_was_destroyed_;
67  TestData* test_data1_;
68  bool test_data2_was_destroyed_;
69  TestData* test_data2_;
70};
71
72TEST_F(SupportsUserDataTest, SetAndGetData) {
73  EXPECT_FALSE(supports_user_data_->GetUserData(kTestData1Key));
74  supports_user_data_->SetUserData(kTestData1Key, test_data1_);
75  EXPECT_EQ(supports_user_data_->GetUserData(kTestData1Key), test_data1_);
76}
77
78TEST_F(SupportsUserDataTest, DataDestroyedOnDestruction) {
79  EXPECT_FALSE(supports_user_data_->GetUserData(kTestData1Key));
80  supports_user_data_->SetUserData(kTestData1Key, test_data1_);
81  EXPECT_FALSE(test_data1_was_destroyed_);
82  supports_user_data_.reset();
83  EXPECT_TRUE(test_data1_was_destroyed_);
84}
85
86TEST_F(SupportsUserDataTest, DataDestroyedOnRemoval) {
87  EXPECT_FALSE(supports_user_data_->GetUserData(kTestData1Key));
88  supports_user_data_->SetUserData(kTestData1Key, test_data1_);
89  EXPECT_FALSE(test_data1_was_destroyed_);
90  supports_user_data_->RemoveUserData(kTestData1Key);
91  EXPECT_TRUE(test_data1_was_destroyed_);
92}
93
94TEST_F(SupportsUserDataTest, DistinctDataStoredSeparately) {
95  EXPECT_FALSE(supports_user_data_->GetUserData(kTestData2Key));
96  supports_user_data_->SetUserData(kTestData1Key, test_data1_);
97  EXPECT_FALSE(supports_user_data_->GetUserData(kTestData2Key));
98  supports_user_data_->SetUserData(kTestData2Key, test_data2_);
99  EXPECT_EQ(supports_user_data_->GetUserData(kTestData2Key), test_data2_);
100}
101
102TEST_F(SupportsUserDataTest, DistinctDataDestroyedSeparately) {
103  supports_user_data_->SetUserData(kTestData1Key, test_data1_);
104  supports_user_data_->SetUserData(kTestData2Key, test_data2_);
105  EXPECT_FALSE(test_data1_was_destroyed_);
106  EXPECT_FALSE(test_data2_was_destroyed_);
107
108  supports_user_data_->RemoveUserData(kTestData2Key);
109  EXPECT_FALSE(test_data1_was_destroyed_);
110  EXPECT_TRUE(test_data2_was_destroyed_);
111
112  supports_user_data_.reset();
113  EXPECT_TRUE(test_data1_was_destroyed_);
114}
115
116}  // namespace ios
117