OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/sync/glue/tab_node_pool.h" | 5 #include "chrome/browser/sync/glue/tab_node_pool.h" |
6 | 6 |
7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
8 | 8 |
9 namespace browser_sync { | 9 namespace browser_sync { |
10 | 10 |
| 11 class SyncTabNodePoolTest : public testing::Test { |
| 12 protected: |
| 13 SyncTabNodePoolTest() : pool_(NULL) { pool_.SetMachineTag("tag"); } |
| 14 |
| 15 size_t GetMaxUsedTabNodeId() const { return pool_.max_used_tab_node_id_; } |
| 16 |
| 17 TabNodePool pool_; |
| 18 }; |
| 19 |
11 namespace { | 20 namespace { |
12 | 21 |
13 typedef testing::Test SyncTabNodePoolTest; | 22 TEST_F(SyncTabNodePoolTest, TabNodeIdIncreases) { |
| 23 // max_used_tab_node_ always increases. |
| 24 SessionID session_id; |
| 25 session_id.set_id(1); |
| 26 pool_.AddTabNode(4, session_id, 10); |
| 27 EXPECT_EQ(10u, GetMaxUsedTabNodeId()); |
| 28 session_id.set_id(2); |
| 29 pool_.AddTabNode(5, session_id, 1); |
| 30 EXPECT_EQ(10u, GetMaxUsedTabNodeId()); |
| 31 session_id.set_id(3); |
| 32 pool_.AddTabNode(6, session_id, 1000); |
| 33 EXPECT_EQ(1000u, GetMaxUsedTabNodeId()); |
| 34 pool_.ReassociateTabNode(6, 500); |
| 35 // Freeing a tab node does not change max_used_tab_node_id_. |
| 36 pool_.FreeTabNode(4); |
| 37 pool_.FreeUnusedTabNodes(std::set<int64>()); |
| 38 EXPECT_EQ(1000u, GetMaxUsedTabNodeId()); |
| 39 for (int i = 0; i < 3; ++i) { |
| 40 pool_.AssociateTabNode(pool_.GetFreeTabNode(), i + 1); |
| 41 EXPECT_EQ(1000u, GetMaxUsedTabNodeId()); |
| 42 } |
| 43 |
| 44 EXPECT_EQ(1000u, GetMaxUsedTabNodeId()); |
| 45 } |
| 46 |
| 47 TEST_F(SyncTabNodePoolTest, OldTabNodesAddAndRemove) { |
| 48 // VerifyOldTabNodes are added. |
| 49 // sync_id =4, tab_node_id = 1, tab_id = 1 |
| 50 SessionID session_id; |
| 51 session_id.set_id(1); |
| 52 pool_.AddTabNode(4, session_id, 1); |
| 53 // sync_id = 5, tab_node_id = 5, tab_id = 2 |
| 54 session_id.set_id(2); |
| 55 pool_.AddTabNode(5, session_id, 2); |
| 56 EXPECT_EQ(2u, pool_.Capacity()); |
| 57 EXPECT_TRUE(pool_.Empty()); |
| 58 EXPECT_TRUE(pool_.ReassociateTabNode(4, 2)); |
| 59 EXPECT_TRUE(pool_.ReassociateTabNode(5, 1)); |
| 60 EXPECT_TRUE(pool_.Empty()); |
| 61 // Check free unused tab nodes returns the node to free node pool_. |
| 62 std::set<int64> used_sync_ids; |
| 63 used_sync_ids.insert(5); |
| 64 pool_.FreeUnusedTabNodes(used_sync_ids); |
| 65 // 4 should be returned to free node pool_. |
| 66 EXPECT_EQ(2u, pool_.Capacity()); |
| 67 EXPECT_FALSE(pool_.Empty()); |
| 68 // 5 should still be in the associated nodes. |
| 69 EXPECT_FALSE(pool_.Full()); |
| 70 pool_.FreeTabNode(5); |
| 71 // 5 should be returned to free nodes pool and pool should be full. |
| 72 EXPECT_TRUE(pool_.Full()); |
| 73 EXPECT_EQ(4, pool_.GetFreeTabNode()); |
| 74 pool_.AssociateTabNode(4, 1); |
| 75 EXPECT_EQ(5, pool_.GetFreeTabNode()); |
| 76 pool_.AssociateTabNode(5, 1); |
| 77 EXPECT_TRUE(pool_.Empty()); |
| 78 EXPECT_FALSE(pool_.Full()); |
| 79 } |
| 80 |
| 81 TEST_F(SyncTabNodePoolTest, OldTabNodesReassociation) { |
| 82 // VerifyOldTabNodes are reassociated correctly. |
| 83 // sync_id =4, tab_node_id = 1, tab_id = 1 |
| 84 SessionID session_id; |
| 85 session_id.set_id(1); |
| 86 pool_.AddTabNode(4, session_id, 1); |
| 87 // sync_id = 5, tab_node_id = 2, tab_id = 2 |
| 88 session_id.set_id(2); |
| 89 pool_.AddTabNode(5, session_id, 2); |
| 90 // sync_id = 5, tab_node_id = 3, tab_id =3 |
| 91 session_id.set_id(3); |
| 92 pool_.AddTabNode(6, session_id, 3); |
| 93 EXPECT_EQ(3u, pool_.Capacity()); |
| 94 EXPECT_TRUE(pool_.Empty()); |
| 95 // Free 5 and 6. |
| 96 pool_.FreeTabNode(5); |
| 97 pool_.FreeTabNode(6); |
| 98 // 5 and 6 nodes should not get reassociated. |
| 99 EXPECT_TRUE(pool_.ReassociateTabNode(4, 5)); |
| 100 EXPECT_FALSE(pool_.ReassociateTabNode(5, 6)); |
| 101 EXPECT_FALSE(pool_.ReassociateTabNode(6, 7)); |
| 102 // Free node pool should have 5 and 6. |
| 103 EXPECT_FALSE(pool_.Empty()); |
| 104 EXPECT_EQ(3u, pool_.Capacity()); |
| 105 |
| 106 // Free all nodes |
| 107 pool_.FreeUnusedTabNodes(std::set<int64>()); |
| 108 EXPECT_TRUE(pool_.Full()); |
| 109 std::set<int64> free_sync_ids; |
| 110 for (int i = 0; i < 3; ++i) { |
| 111 free_sync_ids.insert(pool_.GetFreeTabNode()); |
| 112 // GetFreeTabNode will return the same value till the node is |
| 113 // reassociated. |
| 114 pool_.AssociateTabNode(pool_.GetFreeTabNode(), i + 1); |
| 115 } |
| 116 |
| 117 EXPECT_TRUE(pool_.Empty()); |
| 118 EXPECT_EQ(3u, free_sync_ids.size()); |
| 119 EXPECT_EQ(1u, free_sync_ids.count(4)); |
| 120 EXPECT_EQ(1u, free_sync_ids.count(5)); |
| 121 EXPECT_EQ(1u, free_sync_ids.count(6)); |
| 122 } |
14 | 123 |
15 TEST_F(SyncTabNodePoolTest, Init) { | 124 TEST_F(SyncTabNodePoolTest, Init) { |
16 TabNodePool pool(NULL); | 125 EXPECT_TRUE(pool_.Empty()); |
17 pool.set_machine_tag("tag"); | 126 EXPECT_TRUE(pool_.Full()); |
18 ASSERT_TRUE(pool.empty()); | |
19 ASSERT_TRUE(pool.full()); | |
20 } | 127 } |
21 | 128 |
22 TEST_F(SyncTabNodePoolTest, AddGet) { | 129 TEST_F(SyncTabNodePoolTest, AddGet) { |
23 TabNodePool pool(NULL); | 130 SessionID session_id; |
24 pool.set_machine_tag("tag"); | 131 session_id.set_id(1); |
| 132 pool_.AddTabNode(5, session_id, 1); |
| 133 session_id.set_id(2); |
| 134 pool_.AddTabNode(10, session_id, 2); |
| 135 pool_.FreeUnusedTabNodes(std::set<int64>()); |
| 136 EXPECT_FALSE(pool_.Empty()); |
| 137 EXPECT_TRUE(pool_.Full()); |
25 | 138 |
26 pool.AddTabNode(5); | 139 EXPECT_EQ(2U, pool_.Capacity()); |
27 pool.AddTabNode(10); | 140 EXPECT_EQ(5, pool_.GetFreeTabNode()); |
28 ASSERT_FALSE(pool.empty()); | 141 pool_.AssociateTabNode(5, 1); |
29 ASSERT_TRUE(pool.full()); | 142 EXPECT_FALSE(pool_.Empty()); |
30 | 143 EXPECT_FALSE(pool_.Full()); |
31 ASSERT_EQ(2U, pool.capacity()); | 144 EXPECT_EQ(2U, pool_.Capacity()); |
32 ASSERT_EQ(10, pool.GetFreeTabNode()); // Returns last free tab. | 145 // 5 is now used, should return 10. |
33 ASSERT_FALSE(pool.empty()); | 146 EXPECT_EQ(10, pool_.GetFreeTabNode()); |
34 ASSERT_FALSE(pool.full()); | |
35 ASSERT_EQ(2U, pool.capacity()); | |
36 ASSERT_EQ(5, pool.GetFreeTabNode()); // Returns last free tab. | |
37 } | 147 } |
38 | 148 |
39 TEST_F(SyncTabNodePoolTest, All) { | 149 TEST_F(SyncTabNodePoolTest, All) { |
40 TabNodePool pool(NULL); | 150 EXPECT_TRUE(pool_.Empty()); |
41 pool.set_machine_tag("tag"); | 151 EXPECT_TRUE(pool_.Full()); |
42 ASSERT_TRUE(pool.empty()); | 152 EXPECT_EQ(0U, pool_.Capacity()); |
43 ASSERT_TRUE(pool.full()); | 153 SessionID session_id; |
44 ASSERT_EQ(0U, pool.capacity()); | 154 session_id.set_id(1); |
45 pool.AddTabNode(5); | 155 pool_.AddTabNode(5, session_id, 1); |
46 pool.AddTabNode(10); | 156 session_id.set_id(2); |
47 ASSERT_FALSE(pool.empty()); | 157 pool_.AddTabNode(10, session_id, 2); |
48 ASSERT_TRUE(pool.full()); | 158 // Free added nodes. |
49 ASSERT_EQ(2U, pool.capacity()); | 159 pool_.FreeUnusedTabNodes(std::set<int64>()); |
50 ASSERT_EQ(10, pool.GetFreeTabNode()); // Returns last free tab. | 160 EXPECT_FALSE(pool_.Empty()); |
51 ASSERT_FALSE(pool.empty()); | 161 EXPECT_TRUE(pool_.Full()); |
52 ASSERT_FALSE(pool.full()); | 162 EXPECT_EQ(2U, pool_.Capacity()); |
53 ASSERT_EQ(2U, pool.capacity()); | 163 // GetFreeTabNode returns the lowest numbered free node. |
54 ASSERT_EQ(5, pool.GetFreeTabNode()); // Returns last free tab. | 164 EXPECT_EQ(5, pool_.GetFreeTabNode()); |
55 ASSERT_TRUE(pool.empty()); | 165 EXPECT_FALSE(pool_.Empty()); |
56 ASSERT_FALSE(pool.full()); | 166 EXPECT_TRUE(pool_.Full()); |
57 ASSERT_EQ(2U, pool.capacity()); | 167 EXPECT_EQ(2U, pool_.Capacity()); |
| 168 // Associate 5, next free node should be 10. |
| 169 pool_.AssociateTabNode(5, 1); |
| 170 EXPECT_EQ(10, pool_.GetFreeTabNode()); |
| 171 pool_.AssociateTabNode(10, 2); |
| 172 EXPECT_TRUE(pool_.Empty()); |
| 173 EXPECT_FALSE(pool_.Full()); |
| 174 EXPECT_EQ(2U, pool_.Capacity()); |
58 // Release them in reverse order. | 175 // Release them in reverse order. |
59 pool.FreeTabNode(10); | 176 pool_.FreeTabNode(10); |
60 pool.FreeTabNode(5); | 177 pool_.FreeTabNode(5); |
61 ASSERT_EQ(2U, pool.capacity()); | 178 EXPECT_EQ(2U, pool_.Capacity()); |
62 ASSERT_FALSE(pool.empty()); | 179 EXPECT_FALSE(pool_.Empty()); |
63 ASSERT_TRUE(pool.full()); | 180 EXPECT_TRUE(pool_.Full()); |
64 ASSERT_EQ(5, pool.GetFreeTabNode()); // Returns last free tab. | 181 EXPECT_EQ(5, pool_.GetFreeTabNode()); |
65 ASSERT_FALSE(pool.empty()); | 182 EXPECT_FALSE(pool_.Empty()); |
66 ASSERT_FALSE(pool.full()); | 183 EXPECT_TRUE(pool_.Full()); |
67 ASSERT_EQ(2U, pool.capacity()); | 184 EXPECT_EQ(2U, pool_.Capacity()); |
68 ASSERT_FALSE(pool.empty()); | 185 EXPECT_FALSE(pool_.Empty()); |
69 ASSERT_FALSE(pool.full()); | 186 EXPECT_TRUE(pool_.Full()); |
70 ASSERT_EQ(2U, pool.capacity()); | 187 pool_.AssociateTabNode(5, 1); |
71 ASSERT_EQ(10, pool.GetFreeTabNode()); // Returns last free tab. | 188 EXPECT_EQ(2U, pool_.Capacity()); |
72 ASSERT_TRUE(pool.empty()); | 189 EXPECT_EQ(10, pool_.GetFreeTabNode()); |
73 ASSERT_FALSE(pool.full()); | 190 pool_.AssociateTabNode(10, 2); |
74 ASSERT_EQ(2U, pool.capacity()); | 191 EXPECT_TRUE(pool_.Empty()); |
| 192 EXPECT_FALSE(pool_.Full()); |
| 193 EXPECT_EQ(2U, pool_.Capacity()); |
75 // Release them again. | 194 // Release them again. |
76 pool.FreeTabNode(10); | 195 pool_.FreeTabNode(10); |
77 pool.FreeTabNode(5); | 196 pool_.FreeTabNode(5); |
78 ASSERT_FALSE(pool.empty()); | 197 EXPECT_FALSE(pool_.Empty()); |
79 ASSERT_TRUE(pool.full()); | 198 EXPECT_TRUE(pool_.Full()); |
80 ASSERT_EQ(2U, pool.capacity()); | 199 EXPECT_EQ(2U, pool_.Capacity()); |
81 pool.clear(); | 200 pool_.Clear(); |
82 ASSERT_TRUE(pool.empty()); | 201 EXPECT_TRUE(pool_.Empty()); |
83 ASSERT_TRUE(pool.full()); | 202 EXPECT_TRUE(pool_.Full()); |
84 ASSERT_EQ(0U, pool.capacity()); | 203 EXPECT_EQ(0U, pool_.Capacity()); |
85 } | 204 } |
86 | 205 |
87 } // namespace | 206 } // namespace |
88 | 207 |
89 } // namespace browser_sync | 208 } // namespace browser_sync |
OLD | NEW |