Upstream version 7.35.144.0
[platform/framework/web/crosswalk.git] / src / webkit / common / database / database_connections_unittest.cc
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
3 // found in the LICENSE file.
4
5 #include "base/bind.h"
6 #include "base/message_loop/message_loop.h"
7 #include "base/strings/utf_string_conversions.h"
8 #include "base/threading/thread.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "webkit/common/database/database_connections.h"
11
12 using base::ASCIIToUTF16;
13
14 namespace webkit_database {
15
16 namespace {
17
18 void RemoveConnectionTask(
19     const std::string& origin_id, const base::string16& database_name,
20     scoped_refptr<DatabaseConnectionsWrapper> obj,
21     bool* did_task_execute) {
22   *did_task_execute = true;
23   obj->RemoveOpenConnection(origin_id, database_name);
24 }
25
26 void ScheduleRemoveConnectionTask(
27     base::Thread* thread,  const std::string& origin_id,
28     const base::string16& database_name,
29     scoped_refptr<DatabaseConnectionsWrapper> obj,
30     bool* did_task_execute) {
31   thread->message_loop()->PostTask(
32       FROM_HERE,
33       base::Bind(&RemoveConnectionTask, origin_id, database_name, obj,
34                  did_task_execute));
35 }
36
37 }  // anonymous namespace
38
39 TEST(DatabaseConnectionsTest, DatabaseConnectionsTest) {
40   const std::string kOriginId("origin_id");
41   const base::string16 kName(ASCIIToUTF16("database_name"));
42   const base::string16 kName2(ASCIIToUTF16("database_name2"));
43   const int64 kSize = 1000;
44
45   DatabaseConnections connections;
46
47   EXPECT_TRUE(connections.IsEmpty());
48   EXPECT_FALSE(connections.IsDatabaseOpened(kOriginId, kName));
49   EXPECT_FALSE(connections.IsOriginUsed(kOriginId));
50
51   connections.AddConnection(kOriginId, kName);
52   EXPECT_FALSE(connections.IsEmpty());
53   EXPECT_TRUE(connections.IsDatabaseOpened(kOriginId, kName));
54   EXPECT_TRUE(connections.IsOriginUsed(kOriginId));
55   EXPECT_EQ(0, connections.GetOpenDatabaseSize(kOriginId, kName));
56   connections.SetOpenDatabaseSize(kOriginId, kName, kSize);
57   EXPECT_EQ(kSize, connections.GetOpenDatabaseSize(kOriginId, kName));
58
59   connections.RemoveConnection(kOriginId, kName);
60   EXPECT_TRUE(connections.IsEmpty());
61   EXPECT_FALSE(connections.IsDatabaseOpened(kOriginId, kName));
62   EXPECT_FALSE(connections.IsOriginUsed(kOriginId));
63
64   connections.AddConnection(kOriginId, kName);
65   connections.SetOpenDatabaseSize(kOriginId, kName, kSize);
66   EXPECT_EQ(kSize, connections.GetOpenDatabaseSize(kOriginId, kName));
67   connections.AddConnection(kOriginId, kName);
68   EXPECT_EQ(kSize, connections.GetOpenDatabaseSize(kOriginId, kName));
69   EXPECT_FALSE(connections.IsEmpty());
70   EXPECT_TRUE(connections.IsDatabaseOpened(kOriginId, kName));
71   EXPECT_TRUE(connections.IsOriginUsed(kOriginId));
72   connections.AddConnection(kOriginId, kName2);
73   EXPECT_TRUE(connections.IsDatabaseOpened(kOriginId, kName2));
74
75   DatabaseConnections another;
76   another.AddConnection(kOriginId, kName);
77   another.AddConnection(kOriginId, kName2);
78
79   std::vector<std::pair<std::string, base::string16> > closed_dbs;
80   connections.RemoveConnections(another, &closed_dbs);
81   EXPECT_EQ(1u, closed_dbs.size());
82   EXPECT_EQ(kOriginId, closed_dbs[0].first);
83   EXPECT_EQ(kName2, closed_dbs[0].second);
84   EXPECT_FALSE(connections.IsDatabaseOpened(kOriginId, kName2));
85   EXPECT_TRUE(connections.IsDatabaseOpened(kOriginId, kName));
86   EXPECT_EQ(kSize, connections.GetOpenDatabaseSize(kOriginId, kName));
87   another.RemoveAllConnections();
88   connections.RemoveAllConnections();
89   EXPECT_TRUE(connections.IsEmpty());
90
91   // Ensure the return value properly indicates the initial
92   // addition and final removal.
93   EXPECT_TRUE(connections.AddConnection(kOriginId, kName));
94   EXPECT_FALSE(connections.AddConnection(kOriginId, kName));
95   EXPECT_FALSE(connections.AddConnection(kOriginId, kName));
96   EXPECT_FALSE(connections.RemoveConnection(kOriginId, kName));
97   EXPECT_FALSE(connections.RemoveConnection(kOriginId, kName));
98   EXPECT_TRUE(connections.RemoveConnection(kOriginId, kName));
99 }
100
101 TEST(DatabaseConnectionsTest, DatabaseConnectionsWrapperTest) {
102   const std::string kOriginId("origin_id");
103   const base::string16 kName(ASCIIToUTF16("database_name"));
104
105   base::MessageLoop message_loop;
106   scoped_refptr<DatabaseConnectionsWrapper> obj(new DatabaseConnectionsWrapper);
107   EXPECT_FALSE(obj->HasOpenConnections());
108   obj->AddOpenConnection(kOriginId, kName);
109   EXPECT_TRUE(obj->HasOpenConnections());
110   obj->AddOpenConnection(kOriginId, kName);
111   EXPECT_TRUE(obj->HasOpenConnections());
112   obj->RemoveOpenConnection(kOriginId, kName);
113   EXPECT_TRUE(obj->HasOpenConnections());
114   obj->RemoveOpenConnection(kOriginId, kName);
115   EXPECT_FALSE(obj->HasOpenConnections());
116   obj->WaitForAllDatabasesToClose();  // should return immediately
117
118   // Test WaitForAllDatabasesToClose with the last connection
119   // being removed on the current thread.
120   obj->AddOpenConnection(kOriginId, kName);
121   bool did_task_execute = false;
122   base::MessageLoop::current()->PostTask(
123       FROM_HERE,
124       base::Bind(&RemoveConnectionTask, kOriginId, kName, obj,
125                  &did_task_execute));
126   obj->WaitForAllDatabasesToClose();  // should return after the task executes
127   EXPECT_TRUE(did_task_execute);
128   EXPECT_FALSE(obj->HasOpenConnections());
129
130   // Test WaitForAllDatabasesToClose with the last connection
131   // being removed on another thread.
132   obj->AddOpenConnection(kOriginId, kName);
133   base::Thread thread("WrapperTestThread");
134   thread.Start();
135   did_task_execute = false;
136   base::MessageLoop::current()->PostTask(
137       FROM_HERE,
138       base::Bind(&ScheduleRemoveConnectionTask, &thread, kOriginId, kName, obj,
139                  &did_task_execute));
140   obj->WaitForAllDatabasesToClose();  // should return after the task executes
141   EXPECT_TRUE(did_task_execute);
142   EXPECT_FALSE(obj->HasOpenConnections());
143 }
144
145 }  // namespace webkit_database