blob: 591c8b5429cc14e8cdd52e2ee7678ebb9f8929cf [file] [log] [blame]
[email protected]f4fa3fc2014-04-16 23:16:041// Copyright 2014 The Chromium Authors. All rights reserved.
[email protected]bc5223d2013-08-20 01:42:522// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
maxbogue8ef25082015-11-16 19:09:585#include "components/sync_sessions/tab_node_pool.h"
[email protected]bc5223d2013-08-20 01:42:526
skym9dbfbcf2015-10-09 18:44:337#include <vector>
8
[email protected]bc5223d2013-08-20 01:42:529#include "testing/gtest/include/gtest/gtest.h"
10
maxboguea79d99b72016-09-15 15:59:1611namespace sync_sessions {
[email protected]bc5223d2013-08-20 01:42:5212
[email protected]f4fa3fc2014-04-16 23:16:0413class SyncTabNodePoolTest : public testing::Test {
[email protected]bc5223d2013-08-20 01:42:5214 protected:
zea159246f22016-12-07 00:40:3415 SyncTabNodePoolTest() {}
[email protected]bc5223d2013-08-20 01:42:5216
17 int GetMaxUsedTabNodeId() const { return pool_.max_used_tab_node_id_; }
18
[email protected]f5456872013-09-27 17:56:4219 void AddFreeTabNodes(size_t size, const int node_ids[]);
20
[email protected]f4fa3fc2014-04-16 23:16:0421 TabNodePool pool_;
[email protected]bc5223d2013-08-20 01:42:5222};
23
maxbogue8ef25082015-11-16 19:09:5824void SyncTabNodePoolTest::AddFreeTabNodes(size_t size, const int node_ids[]) {
[email protected]f5456872013-09-27 17:56:4225 for (size_t i = 0; i < size; ++i) {
26 pool_.free_nodes_pool_.insert(node_ids[i]);
27 }
28}
29
[email protected]bc5223d2013-08-20 01:42:5230namespace {
31
zea159246f22016-12-07 00:40:3432const int kTabNodeId1 = 10;
33const int kTabNodeId2 = 5;
34const int kTabNodeId3 = 1000;
35const int kTabId1 = 1;
36const int kTabId2 = 2;
37const int kTabId3 = 3;
38
[email protected]f4fa3fc2014-04-16 23:16:0439TEST_F(SyncTabNodePoolTest, TabNodeIdIncreases) {
zea159246f22016-12-07 00:40:3440 std::set<int> deleted_node_ids;
41
[email protected]bc5223d2013-08-20 01:42:5242 // max_used_tab_node_ always increases.
zea159246f22016-12-07 00:40:3443 pool_.ReassociateTabNode(kTabNodeId1, kTabId1);
44 EXPECT_EQ(kTabNodeId1, GetMaxUsedTabNodeId());
45 pool_.ReassociateTabNode(kTabNodeId2, kTabId2);
46 EXPECT_EQ(kTabNodeId1, GetMaxUsedTabNodeId());
47 pool_.ReassociateTabNode(kTabNodeId3, kTabId3);
48 EXPECT_EQ(kTabNodeId3, GetMaxUsedTabNodeId());
[email protected]bc5223d2013-08-20 01:42:5249 // Freeing a tab node does not change max_used_tab_node_id_.
zea159246f22016-12-07 00:40:3450 pool_.FreeTab(kTabId3);
51 pool_.CleanupTabNodes(&deleted_node_ids);
52 EXPECT_TRUE(deleted_node_ids.empty());
53 pool_.FreeTab(kTabId2);
54 pool_.CleanupTabNodes(&deleted_node_ids);
55 EXPECT_TRUE(deleted_node_ids.empty());
56 pool_.FreeTab(kTabId1);
57 pool_.CleanupTabNodes(&deleted_node_ids);
58 EXPECT_TRUE(deleted_node_ids.empty());
[email protected]bc5223d2013-08-20 01:42:5259 for (int i = 0; i < 3; ++i) {
zea159246f22016-12-07 00:40:3460 int tab_node_id = -1;
61 EXPECT_TRUE(pool_.GetTabNodeForTab(i + 1, &tab_node_id));
62 EXPECT_EQ(kTabNodeId3, GetMaxUsedTabNodeId());
[email protected]bc5223d2013-08-20 01:42:5263 }
zea159246f22016-12-07 00:40:3464 pool_.CleanupTabNodes(&deleted_node_ids);
65 EXPECT_TRUE(deleted_node_ids.empty());
66 EXPECT_EQ(kTabNodeId3, GetMaxUsedTabNodeId());
[email protected]f5456872013-09-27 17:56:4267 EXPECT_TRUE(pool_.Empty());
[email protected]bc5223d2013-08-20 01:42:5268}
69
zea159246f22016-12-07 00:40:3470TEST_F(SyncTabNodePoolTest, Reassociation) {
71 // Reassociate tab node 1 with tab id 1.
72 pool_.ReassociateTabNode(kTabNodeId1, kTabId1);
73 EXPECT_EQ(1U, pool_.Capacity());
[email protected]bc5223d2013-08-20 01:42:5274 EXPECT_TRUE(pool_.Empty());
zea159246f22016-12-07 00:40:3475 EXPECT_FALSE(pool_.Full());
76 EXPECT_EQ(kTabId1, pool_.GetTabIdFromTabNodeId(kTabNodeId1));
77 EXPECT_EQ(TabNodePool::kInvalidTabNodeID,
78 pool_.GetTabIdFromTabNodeId(kTabNodeId2));
79
80 // Introduce a new tab node associated with the same tab. The old tab node
81 // should get added to the free pool
82 pool_.ReassociateTabNode(kTabNodeId2, kTabId1);
83 EXPECT_EQ(2U, pool_.Capacity());
[email protected]bc5223d2013-08-20 01:42:5284 EXPECT_FALSE(pool_.Empty());
zea159246f22016-12-07 00:40:3485 EXPECT_FALSE(pool_.Full());
86 EXPECT_EQ(TabNodePool::kInvalidTabNodeID,
87 pool_.GetTabIdFromTabNodeId(kTabNodeId1));
88 EXPECT_EQ(kTabId1, pool_.GetTabIdFromTabNodeId(kTabNodeId2));
89
90 // Reassociating the same tab node/tab should have no effect.
91 pool_.ReassociateTabNode(kTabNodeId2, kTabId1);
92 EXPECT_EQ(2U, pool_.Capacity());
93 EXPECT_FALSE(pool_.Empty());
94 EXPECT_FALSE(pool_.Full());
95 EXPECT_EQ(TabNodePool::kInvalidTabNodeID,
96 pool_.GetTabIdFromTabNodeId(kTabNodeId1));
97 EXPECT_EQ(kTabId1, pool_.GetTabIdFromTabNodeId(kTabNodeId2));
98
99 // Reassociating the new tab node with a new tab should just update the
100 // association tables.
101 pool_.ReassociateTabNode(kTabNodeId2, kTabId2);
102 EXPECT_EQ(2U, pool_.Capacity());
103 EXPECT_FALSE(pool_.Empty());
104 EXPECT_FALSE(pool_.Full());
105 EXPECT_EQ(TabNodePool::kInvalidTabNodeID,
106 pool_.GetTabIdFromTabNodeId(kTabNodeId1));
107 EXPECT_EQ(kTabId2, pool_.GetTabIdFromTabNodeId(kTabNodeId2));
108
109 // Reassociating the first tab node should make the pool empty.
110 pool_.ReassociateTabNode(kTabNodeId1, kTabId1);
111 EXPECT_EQ(2U, pool_.Capacity());
[email protected]bc5223d2013-08-20 01:42:52112 EXPECT_TRUE(pool_.Empty());
113 EXPECT_FALSE(pool_.Full());
zea159246f22016-12-07 00:40:34114 EXPECT_EQ(kTabId1, pool_.GetTabIdFromTabNodeId(kTabNodeId1));
115 EXPECT_EQ(kTabId2, pool_.GetTabIdFromTabNodeId(kTabNodeId2));
[email protected]bc5223d2013-08-20 01:42:52116}
117
zea159246f22016-12-07 00:40:34118TEST_F(SyncTabNodePoolTest, ReassociateThenFree) {
119 std::set<int> deleted_node_ids;
120
121 // Verify old tab nodes are reassociated correctly.
122 pool_.ReassociateTabNode(kTabNodeId1, kTabId1);
123 pool_.ReassociateTabNode(kTabNodeId2, kTabId2);
124 pool_.ReassociateTabNode(kTabNodeId3, kTabId3);
[email protected]bc5223d2013-08-20 01:42:52125 EXPECT_EQ(3u, pool_.Capacity());
126 EXPECT_TRUE(pool_.Empty());
zea159246f22016-12-07 00:40:34127 // Free tabs 2 and 3.
128 pool_.FreeTab(kTabId2);
129 pool_.FreeTab(kTabId3);
130 pool_.CleanupTabNodes(&deleted_node_ids);
131 EXPECT_TRUE(deleted_node_ids.empty());
132 // Free node pool should have 2 and 3.
[email protected]bc5223d2013-08-20 01:42:52133 EXPECT_FALSE(pool_.Empty());
134 EXPECT_EQ(3u, pool_.Capacity());
135
136 // Free all nodes
zea159246f22016-12-07 00:40:34137 pool_.FreeTab(kTabId1);
138 pool_.CleanupTabNodes(&deleted_node_ids);
139 EXPECT_TRUE(deleted_node_ids.empty());
[email protected]bc5223d2013-08-20 01:42:52140 EXPECT_TRUE(pool_.Full());
141 std::set<int> free_sync_ids;
142 for (int i = 0; i < 3; ++i) {
zea159246f22016-12-07 00:40:34143 int tab_node_id = -1;
144 EXPECT_TRUE(pool_.GetTabNodeForTab(i, &tab_node_id));
145 free_sync_ids.insert(tab_node_id);
[email protected]bc5223d2013-08-20 01:42:52146 }
147
148 EXPECT_TRUE(pool_.Empty());
149 EXPECT_EQ(3u, free_sync_ids.size());
zea159246f22016-12-07 00:40:34150 EXPECT_EQ(1u, free_sync_ids.count(kTabNodeId1));
151 EXPECT_EQ(1u, free_sync_ids.count(kTabNodeId2));
152 EXPECT_EQ(1u, free_sync_ids.count(kTabNodeId3));
[email protected]bc5223d2013-08-20 01:42:52153}
154
[email protected]f4fa3fc2014-04-16 23:16:04155TEST_F(SyncTabNodePoolTest, Init) {
[email protected]bc5223d2013-08-20 01:42:52156 EXPECT_TRUE(pool_.Empty());
157 EXPECT_TRUE(pool_.Full());
158}
159
[email protected]f4fa3fc2014-04-16 23:16:04160TEST_F(SyncTabNodePoolTest, AddGet) {
[email protected]f5456872013-09-27 17:56:42161 int free_nodes[] = {5, 10};
162 AddFreeTabNodes(2, free_nodes);
[email protected]bc5223d2013-08-20 01:42:52163
164 EXPECT_EQ(2U, pool_.Capacity());
zea159246f22016-12-07 00:40:34165 int tab_node_id = -1;
166 EXPECT_TRUE(pool_.GetTabNodeForTab(1, &tab_node_id));
167 EXPECT_EQ(5, tab_node_id);
[email protected]bc5223d2013-08-20 01:42:52168 EXPECT_FALSE(pool_.Empty());
169 EXPECT_FALSE(pool_.Full());
170 EXPECT_EQ(2U, pool_.Capacity());
171 // 5 is now used, should return 10.
zea159246f22016-12-07 00:40:34172 EXPECT_TRUE(pool_.GetTabNodeForTab(2, &tab_node_id));
173 EXPECT_EQ(10, tab_node_id);
[email protected]bc5223d2013-08-20 01:42:52174}
175
zea159246f22016-12-07 00:40:34176TEST_F(SyncTabNodePoolTest, GetTabNodeForTabCreate) {
177 int tab_node_id = -1;
178 EXPECT_FALSE(pool_.GetTabNodeForTab(1, &tab_node_id));
179 EXPECT_EQ(0, tab_node_id);
[email protected]bc5223d2013-08-20 01:42:52180}
181
[email protected]f4fa3fc2014-04-16 23:16:04182TEST_F(SyncTabNodePoolTest, TabPoolFreeNodeLimits) {
zea159246f22016-12-07 00:40:34183 std::set<int> deleted_node_ids;
184
[email protected]f5456872013-09-27 17:56:42185 // Allocate TabNodePool::kFreeNodesHighWatermark + 1 nodes and verify that
186 // freeing the last node reduces the free node pool size to
187 // kFreeNodesLowWatermark.
[email protected]f5456872013-09-27 17:56:42188 SessionID session_id;
189 std::vector<int> used_sync_ids;
[email protected]f4fa3fc2014-04-16 23:16:04190 for (size_t i = 1; i <= TabNodePool::kFreeNodesHighWatermark + 1; ++i) {
[email protected]f5456872013-09-27 17:56:42191 session_id.set_id(i);
zea159246f22016-12-07 00:40:34192 int sync_id = -1;
193 EXPECT_FALSE(pool_.GetTabNodeForTab(i, &sync_id));
[email protected]f5456872013-09-27 17:56:42194 used_sync_ids.push_back(sync_id);
195 }
196
197 // Free all except one node.
[email protected]f5456872013-09-27 17:56:42198 used_sync_ids.pop_back();
199
zea159246f22016-12-07 00:40:34200 for (size_t i = 1; i <= used_sync_ids.size(); ++i) {
201 pool_.FreeTab(i);
202 pool_.CleanupTabNodes(&deleted_node_ids);
203 EXPECT_TRUE(deleted_node_ids.empty());
[email protected]f5456872013-09-27 17:56:42204 }
205
206 // Except one node all nodes should be in FreeNode pool.
207 EXPECT_FALSE(pool_.Full());
208 EXPECT_FALSE(pool_.Empty());
209 // Total capacity = 1 Associated Node + kFreeNodesHighWatermark free node.
[email protected]f4fa3fc2014-04-16 23:16:04210 EXPECT_EQ(TabNodePool::kFreeNodesHighWatermark + 1, pool_.Capacity());
[email protected]f5456872013-09-27 17:56:42211
212 // Freeing the last sync node should drop the free nodes to
213 // kFreeNodesLowWatermark.
zea159246f22016-12-07 00:40:34214 pool_.FreeTab(TabNodePool::kFreeNodesHighWatermark + 1);
215 pool_.CleanupTabNodes(&deleted_node_ids);
216 EXPECT_EQ(TabNodePool::kFreeNodesHighWatermark + 1 -
217 TabNodePool::kFreeNodesLowWatermark,
218 deleted_node_ids.size());
[email protected]f5456872013-09-27 17:56:42219 EXPECT_FALSE(pool_.Empty());
220 EXPECT_TRUE(pool_.Full());
[email protected]f4fa3fc2014-04-16 23:16:04221 EXPECT_EQ(TabNodePool::kFreeNodesLowWatermark, pool_.Capacity());
[email protected]f5456872013-09-27 17:56:42222}
223
[email protected]bc5223d2013-08-20 01:42:52224} // namespace
225
maxboguea79d99b72016-09-15 15:59:16226} // namespace sync_sessions