Movatterモバイル変換


[0]ホーム

URL:


Google Git
Sign in
chromium /chromium /src /refs/heads/main /. /sql /transaction_unittest.cc
blob: 1a8f5e70ac0e7c0daa87133035296be8ed1801a8 [file] [log] [blame]
Avi Drissman69b874f2022-09-15 19:11:14[diff] [blame]1// Copyright 2011 The Chromium Authors
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Scott Graham47ed2c32017-09-15 02:17:07[diff] [blame]5#include"sql/transaction.h"
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]6
Takuto Ikuta2eb61342024-05-10 09:05:35[diff] [blame]7#include<memory>
8
brettw@chromium.orgea1a3f62012-11-16 20:34:23[diff] [blame]9#include"base/files/scoped_temp_dir.h"
Victor Costancfbfa602018-08-01 23:24:46[diff] [blame]10#include"sql/database.h"
tfarina@chromium.orgf0a54b22011-07-19 18:40:21[diff] [blame]11#include"sql/statement.h"
Anthony Vallée-Duboise3c94912024-12-12 16:47:47[diff] [blame]12#include"sql/test/test_helpers.h"
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]13#include"testing/gtest/include/gtest/gtest.h"
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]14
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]15namespace sql{
Victor Costan525b30a2021-05-05 17:54:10[diff] [blame]16
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]17namespace{
18
19classSQLTransactionTest:public testing::Test{
20public:
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]21voidSetUp() override{
22 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
23 ASSERT_TRUE(
24 db_.Open(temp_dir_.GetPath().AppendASCII("transaction_test.sqlite")));
25
26 ASSERT_TRUE(db_.Execute("CREATE TABLE foo (a, b)"));
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]27}
28
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]29// Returns the number of rows in table "foo".
30intCountFoo(){
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]31Statement count(db_.GetUniqueStatement("SELECT count(*) FROM foo"));
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]32 count.Step();
33return count.ColumnInt(0);
34}
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]35
36protected:
37 base::ScopedTempDir temp_dir_;
Anthony Vallée-Duboise3c94912024-12-12 16:47:47[diff] [blame]38Database db_{test::kTestTag};
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]39};
40
41TEST_F(SQLTransactionTest,Commit){
42{
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]43Transaction transaction(&db_);
44 EXPECT_FALSE(db_.HasActiveTransactions());
45 EXPECT_FALSE(transaction.IsActiveForTesting());
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]46
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]47 ASSERT_TRUE(transaction.Begin());
48 EXPECT_TRUE(db_.HasActiveTransactions());
49 EXPECT_TRUE(transaction.IsActiveForTesting());
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]50
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]51 ASSERT_TRUE(db_.Execute("INSERT INTO foo (a, b) VALUES (1, 2)"));
52 ASSERT_EQ(1,CountFoo())<<"INSERT did not work as intended";
53
54 transaction.Commit();
55 EXPECT_FALSE(db_.HasActiveTransactions());
56 EXPECT_FALSE(transaction.IsActiveForTesting());
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]57}
58
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]59 EXPECT_FALSE(db_.HasActiveTransactions());
60 EXPECT_EQ(1,CountFoo())<<"Transaction changes not committed";
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]61}
62
Dan McArdle89348ed2024-02-26 20:50:08[diff] [blame]63// Regression test for <https://crbug.com/326498384>.
64TEST_F(SQLTransactionTest,CloseDatabase){
65 EXPECT_FALSE(db_.HasActiveTransactions());
66
67{
68Transaction transaction(&db_);
69 EXPECT_FALSE(db_.HasActiveTransactions());
70 EXPECT_FALSE(transaction.IsActiveForTesting());
71
72 ASSERT_TRUE(transaction.Begin());
73 EXPECT_TRUE(db_.HasActiveTransactions());
74 EXPECT_TRUE(transaction.IsActiveForTesting());
75
76 db_.Close();
77 EXPECT_FALSE(db_.HasActiveTransactions());
78}
79
80 EXPECT_FALSE(db_.HasActiveTransactions());
81}
82
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]83TEST_F(SQLTransactionTest,RollbackOnDestruction){
84 EXPECT_FALSE(db_.HasActiveTransactions());
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]85
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]86{
87Transaction transaction(&db_);
88 EXPECT_FALSE(db_.HasActiveTransactions());
89 EXPECT_FALSE(transaction.IsActiveForTesting());
90
91 ASSERT_TRUE(transaction.Begin());
92 EXPECT_TRUE(db_.HasActiveTransactions());
93 EXPECT_TRUE(transaction.IsActiveForTesting());
94
95 ASSERT_TRUE(db_.Execute("INSERT INTO foo (a, b) VALUES (1, 2)"));
96 ASSERT_EQ(1,CountFoo())<<"INSERT did not work as intended";
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]97}
98
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]99 EXPECT_FALSE(db_.HasActiveTransactions());
100 EXPECT_EQ(0,CountFoo())<<"Transaction changes not rolled back";
101}
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]102
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]103TEST_F(SQLTransactionTest,ExplicitRollback){
104 EXPECT_FALSE(db_.HasActiveTransactions());
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]105
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]106{
107Transaction transaction(&db_);
108 EXPECT_FALSE(db_.HasActiveTransactions());
109 EXPECT_FALSE(transaction.IsActiveForTesting());
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]110
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]111 ASSERT_TRUE(transaction.Begin());
112 EXPECT_TRUE(db_.HasActiveTransactions());
113 EXPECT_TRUE(transaction.IsActiveForTesting());
114
115 ASSERT_TRUE(db_.Execute("INSERT INTO foo (a, b) VALUES (1, 2)"));
116 ASSERT_EQ(1,CountFoo())<<"INSERT did not work as intended";
117
118 transaction.Rollback();
119 EXPECT_FALSE(db_.HasActiveTransactions());
120 EXPECT_FALSE(transaction.IsActiveForTesting());
121 EXPECT_EQ(0,CountFoo())<<"Transaction changes not rolled back";
122}
123
124 EXPECT_FALSE(db_.HasActiveTransactions());
125 EXPECT_EQ(0,CountFoo())<<"Transaction changes not rolled back";
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]126}
127
128// Rolling back any part of a transaction should roll back all of them.
129TEST_F(SQLTransactionTest,NestedRollback){
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]130 EXPECT_FALSE(db_.HasActiveTransactions());
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]131 EXPECT_EQ(0, db_.transaction_nesting());
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]132
133// Outermost transaction.
134{
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]135Transaction outer_txn(&db_);
136 EXPECT_FALSE(db_.HasActiveTransactions());
137 EXPECT_EQ(0, db_.transaction_nesting());
138
139 ASSERT_TRUE(outer_txn.Begin());
140 EXPECT_TRUE(db_.HasActiveTransactions());
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]141 EXPECT_EQ(1, db_.transaction_nesting());
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]142
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]143// First inner transaction is committed.
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]144{
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]145Transaction committed_inner_txn(&db_);
146 EXPECT_TRUE(db_.HasActiveTransactions());
147 EXPECT_EQ(1, db_.transaction_nesting());
148
149 ASSERT_TRUE(committed_inner_txn.Begin());
150 EXPECT_TRUE(db_.HasActiveTransactions());
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]151 EXPECT_EQ(2, db_.transaction_nesting());
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]152
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]153 ASSERT_TRUE(db_.Execute("INSERT INTO foo (a, b) VALUES (1, 2)"));
154 ASSERT_EQ(1,CountFoo())<<"INSERT did not work as intended";
155
156 committed_inner_txn.Commit();
157 EXPECT_TRUE(db_.HasActiveTransactions());
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]158 EXPECT_EQ(1, db_.transaction_nesting());
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]159}
160
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]161 EXPECT_TRUE(db_.HasActiveTransactions());
162 EXPECT_EQ(1, db_.transaction_nesting());
163 EXPECT_EQ(1,CountFoo())<<"First inner transaction did not commit";
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]164
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]165// Second inner transaction is rolled back.
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]166{
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]167Transaction rolled_back_inner_txn(&db_);
168 EXPECT_TRUE(db_.HasActiveTransactions());
169 EXPECT_EQ(1, db_.transaction_nesting());
170
171 ASSERT_TRUE(rolled_back_inner_txn.Begin());
172 EXPECT_TRUE(db_.HasActiveTransactions());
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]173 EXPECT_EQ(2, db_.transaction_nesting());
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]174
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]175 ASSERT_TRUE(db_.Execute("INSERT INTO foo (a, b) VALUES (2, 3)"));
176 ASSERT_EQ(2,CountFoo())<<"INSERT did not work as intended";
177
178 rolled_back_inner_txn.Rollback();
179 EXPECT_TRUE(db_.HasActiveTransactions());
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]180 EXPECT_EQ(1, db_.transaction_nesting());
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]181 EXPECT_EQ(2,CountFoo())
182<<"Nested transaction rollback deferred to top-level transaction";
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]183}
184
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]185 EXPECT_TRUE(db_.HasActiveTransactions());
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]186 EXPECT_EQ(1, db_.transaction_nesting());
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]187 EXPECT_EQ(2,CountFoo())
188<<"Nested transaction rollback deferred to top-level transaction";
189
190// Third inner transaction fails in Begin(), because a nested transaction
191// has already been rolled back.
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]192{
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]193Transaction failed_inner_txn(&db_);
194 EXPECT_TRUE(db_.HasActiveTransactions());
195 EXPECT_EQ(1, db_.transaction_nesting());
196
197 EXPECT_FALSE(failed_inner_txn.Begin());
198 EXPECT_TRUE(db_.HasActiveTransactions());
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]199 EXPECT_EQ(1, db_.transaction_nesting());
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]200}
201}
Victor Costan628afca2021-09-21 02:36:09[diff] [blame]202
203 EXPECT_FALSE(db_.HasActiveTransactions());
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]204 EXPECT_EQ(0, db_.transaction_nesting());
brettw@chromium.orge5ffd0e42009-09-11 21:30:56[diff] [blame]205 EXPECT_EQ(0,CountFoo());
206}
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]207
Dan McArdle44d62a12024-02-29 17:08:14[diff] [blame]208TEST(SQLTransactionDatabaseDestroyedTest,BeginIsNoOp){
Anthony Vallée-Duboise3c94912024-12-12 16:47:47[diff] [blame]209auto db= std::make_unique<Database>(test::kTestTag);
Dan McArdle44d62a12024-02-29 17:08:14[diff] [blame]210 ASSERT_TRUE(db->OpenInMemory());
211Transaction transaction(db.get());
212 db.reset();
213 ASSERT_FALSE(transaction.Begin());
214}
215
216TEST(SQLTransactionDatabaseDestroyedTest,RollbackIsNoOp){
Anthony Vallée-Duboise3c94912024-12-12 16:47:47[diff] [blame]217auto db= std::make_unique<Database>(test::kTestTag);
Dan McArdle44d62a12024-02-29 17:08:14[diff] [blame]218 ASSERT_TRUE(db->OpenInMemory());
219Transaction transaction(db.get());
220 ASSERT_TRUE(transaction.Begin());
221 EXPECT_TRUE(db->HasActiveTransactions());
222 db.reset();
223// `Transaction::Rollback()` does not return a value, so we cannot verify
224// externally whether it returned early.
225 transaction.Rollback();
226}
227
228TEST(SQLTransactionDatabaseDestroyedTest,CommitIsNoOp){
Anthony Vallée-Duboise3c94912024-12-12 16:47:47[diff] [blame]229auto db= std::make_unique<Database>(test::kTestTag);
Dan McArdle44d62a12024-02-29 17:08:14[diff] [blame]230 ASSERT_TRUE(db->OpenInMemory());
231Transaction transaction(db.get());
232 ASSERT_TRUE(transaction.Begin());
233 EXPECT_TRUE(db->HasActiveTransactions());
234 db.reset();
235 ASSERT_FALSE(transaction.Commit());
236}
237
Victor Costan49a903a2021-05-07 22:21:00[diff] [blame]238}// namespace
239
240}// namespace sql

[8]ページ先頭

©2009-2025 Movatter.jp