Skip to content

Commit 252ab6c

Browse files
authored
Firestore TransactionOptions added, to specify maxAttempts (#966)
1 parent c7f5ce8 commit 252ab6c

20 files changed

+759
-8
lines changed

app/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,7 @@ if (IOS)
494494
${FIREBASE_SOURCE_DIR}/firestore/src/include/firebase/firestore/snapshot_metadata.h
495495
${FIREBASE_SOURCE_DIR}/firestore/src/include/firebase/firestore/source.h
496496
${FIREBASE_SOURCE_DIR}/firestore/src/include/firebase/firestore/transaction.h
497+
${FIREBASE_SOURCE_DIR}/firestore/src/include/firebase/firestore/transaction_options.h
497498
${FIREBASE_SOURCE_DIR}/firestore/src/include/firebase/firestore/write_batch.h
498499
${FIREBASE_POD_DIR}/Pods/FirebaseFirestore/Firestore/core/include/firebase/firestore/firestore_errors.h
499500
${FIREBASE_POD_DIR}/Pods/FirebaseFirestore/Firestore/core/include/firebase/firestore/firestore_version.h

firestore/CMakeLists.txt

+5
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ set(common_SRCS
4949
src/common/to_string.h
5050
src/common/type_mapping.h
5151
src/common/transaction.cc
52+
src/common/transaction_options.cc
5253
src/common/util.cc
5354
src/common/util.h
5455
src/common/write_batch.cc
@@ -127,6 +128,10 @@ set(android_SRCS
127128
src/android/timestamp_portable.cc
128129
src/android/transaction_android.cc
129130
src/android/transaction_android.h
131+
src/android/transaction_options_android.cc
132+
src/android/transaction_options_android.h
133+
src/android/transaction_options_builder_android.cc
134+
src/android/transaction_options_builder_android.h
130135
src/android/util_android.cc
131136
src/android/util_android.h
132137
src/android/wrapper.cc

firestore/integration_test_internal/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ set(FIREBASE_INTEGRATION_TEST_PORTABLE_TEST_SRCS
100100
src/smoke_test.cc
101101
src/source_test.cc
102102
src/transaction_test.cc
103+
src/transaction_options_test.cc
103104
src/type_test.cc
104105
src/validation_test.cc
105106
src/write_batch_test.cc
@@ -116,6 +117,7 @@ set(FIREBASE_INTEGRATION_TEST_ANDROID_TEST_SRCS
116117
src/android/settings_android_test.cc
117118
src/android/snapshot_metadata_android_test.cc
118119
src/android/timestamp_android_test.cc
120+
src/android/transaction_options_android_test.cc
119121
src/jni/declaration_test.cc
120122
src/jni/env_test.cc
121123
src/jni/object_test.cc

firestore/integration_test_internal/integration_test.xcodeproj/project.pbxproj

+6
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@
9494
D6ED33BD2606CD890058CBF9 /* future_test_util.cc in Sources */ = {isa = PBXBuildFile; fileRef = D6ED33B92606CD890058CBF9 /* future_test_util.cc */; };
9595
D6ED33BE2606CD890058CBF9 /* integration_test_util.cc in Sources */ = {isa = PBXBuildFile; fileRef = D6ED33BB2606CD890058CBF9 /* integration_test_util.cc */; };
9696
D86FB1D3D4A592C451A29369 /* firebase_firestore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B7F45B5446094E107E88721A /* firebase_firestore.framework */; };
97+
ED39362728657B740050FE2B /* transaction_options_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = ED39362628657B740050FE2B /* transaction_options_test.cc */; };
98+
ED39362828657B740050FE2B /* transaction_options_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = ED39362628657B740050FE2B /* transaction_options_test.cc */; };
9799
EDEEC7632800CD0000EFBAAF /* leveldb_snappy_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = EDEEC7622800CD0000EFBAAF /* leveldb_snappy_test.cc */; };
98100
EDEEC7642800CD0000EFBAAF /* leveldb_snappy_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = EDEEC7622800CD0000EFBAAF /* leveldb_snappy_test.cc */; };
99101
/* End PBXBuildFile section */
@@ -171,6 +173,7 @@
171173
D6ED33BB2606CD890058CBF9 /* integration_test_util.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = integration_test_util.cc; path = src/util/integration_test_util.cc; sourceTree = "<group>"; };
172174
D6ED33BC2606CD890058CBF9 /* future_test_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = future_test_util.h; path = src/util/future_test_util.h; sourceTree = "<group>"; };
173175
EAFAF9474EC412ADCC65F2CC /* firebase_firestore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = firebase_firestore.framework; path = Frameworks/firebase_firestore.framework; sourceTree = "<group>"; };
176+
ED39362628657B740050FE2B /* transaction_options_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = transaction_options_test.cc; path = src/transaction_options_test.cc; sourceTree = "<group>"; };
174177
EDEEC7622800CD0000EFBAAF /* leveldb_snappy_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = leveldb_snappy_test.cc; path = src/leveldb_snappy_test.cc; sourceTree = "<group>"; };
175178
/* End PBXFileReference section */
176179

@@ -262,6 +265,7 @@
262265
5292271D1C85FB5500C89379 /* src */ = {
263266
isa = PBXGroup;
264267
children = (
268+
ED39362628657B740050FE2B /* transaction_options_test.cc */,
265269
D60C58862819C902002E8A04 /* empty.swift */,
266270
EDEEC7622800CD0000EFBAAF /* leveldb_snappy_test.cc */,
267271
12D513182684C8D100A83FAA /* bundle_builder.cc */,
@@ -567,6 +571,7 @@
567571
D6ED33BD2606CD890058CBF9 /* future_test_util.cc in Sources */,
568572
D6AAAD592606C22D0025C53B /* firestore_integration_test.cc in Sources */,
569573
D6C179EE22CB323300C2651A /* firebase_test_framework.cc in Sources */,
574+
ED39362728657B740050FE2B /* transaction_options_test.cc in Sources */,
570575
D6AAAD4B2606C22D0025C53B /* array_transform_test.cc in Sources */,
571576
D6AAAD512606C22D0025C53B /* sanity_test.cc in Sources */,
572577
D6AAAD482606C22D0025C53B /* cursor_test.cc in Sources */,
@@ -590,6 +595,7 @@
590595
BC1D6843267B00EB005DC2DA /* numeric_transforms_test.cc in Sources */,
591596
BC1D6844267B00EB005DC2DA /* array_transform_test.cc in Sources */,
592597
BC1D6854267B00EB005DC2DA /* listener_registration_test.cc in Sources */,
598+
ED39362828657B740050FE2B /* transaction_options_test.cc in Sources */,
593599
BC1D683F267B00EB005DC2DA /* document_snapshot_test.cc in Sources */,
594600
BC1D684E267B00EB005DC2DA /* includes_test.cc in Sources */,
595601
BC1D684C267B00EB005DC2DA /* document_change_test.cc in Sources */,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright 2022 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
#include "firestore/src/android/transaction_options_android.h"
18+
#include "firestore/src/android/transaction_options_builder_android.h"
19+
20+
#include "firestore/src/jni/env.h"
21+
#include "firestore_integration_test.h"
22+
#include "gmock/gmock.h"
23+
#include "gtest/gtest.h"
24+
25+
namespace firebase {
26+
namespace firestore {
27+
namespace {
28+
29+
using jni::Env;
30+
using jni::Local;
31+
32+
using TransactionOptionsTestAndroid = FirestoreIntegrationTest;
33+
34+
TEST_F(TransactionOptionsTestAndroid, DefaultTransactionOptions) {
35+
Env env;
36+
Local<TransactionOptionsBuilderInternal> builder =
37+
TransactionOptionsBuilderInternal::Create(env);
38+
39+
Local<TransactionOptionsInternal> options = builder.Build(env);
40+
41+
EXPECT_EQ(options.GetMaxAttempts(env), 5);
42+
}
43+
44+
TEST_F(TransactionOptionsTestAndroid, SetMaxAttemptsReturnsSameInstance) {
45+
Env env;
46+
Local<TransactionOptionsBuilderInternal> builder =
47+
TransactionOptionsBuilderInternal::Create(env);
48+
49+
Local<TransactionOptionsBuilderInternal> retval =
50+
builder.SetMaxAttempts(env, 42);
51+
52+
EXPECT_TRUE(env.IsSameObject(builder, retval));
53+
}
54+
55+
TEST_F(TransactionOptionsTestAndroid, SetMaxAttempts) {
56+
Env env;
57+
Local<TransactionOptionsBuilderInternal> builder =
58+
TransactionOptionsBuilderInternal::Create(env);
59+
60+
builder.SetMaxAttempts(env, 42);
61+
62+
EXPECT_EQ(builder.Build(env).GetMaxAttempts(env), 42);
63+
}
64+
65+
} // namespace
66+
} // namespace firestore
67+
} // namespace firebase
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
/*
2+
* Copyright 2022 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
#include <sstream>
18+
#include <type_traits>
19+
#include <utility>
20+
21+
#include "firebase/firestore.h"
22+
#include "gtest/gtest.h"
23+
24+
namespace firebase {
25+
namespace firestore {
26+
namespace {
27+
28+
TEST(TransactionOptionsTest, TypeTraits) {
29+
static_assert(std::is_trivially_copyable<TransactionOptions>::value,
30+
"Update the public doxygen comments about TransactionOptions "
31+
"being trivially copyable in the header file if it ever "
32+
"changes to NOT be trivially copyable.");
33+
}
34+
35+
TEST(TransactionOptionsTest, DefaultConstructor) {
36+
TransactionOptions options;
37+
EXPECT_EQ(options.max_attempts(), 5);
38+
}
39+
40+
TEST(TransactionOptionsTest, CopyConstructor) {
41+
TransactionOptions options;
42+
options.set_max_attempts(99);
43+
44+
TransactionOptions copied_options(options);
45+
46+
EXPECT_EQ(options.max_attempts(), 99);
47+
EXPECT_EQ(copied_options.max_attempts(), 99);
48+
}
49+
50+
TEST(TransactionOptionsTest, CopyAssignmentOperator) {
51+
TransactionOptions options;
52+
options.set_max_attempts(99);
53+
TransactionOptions options_copy_dest;
54+
options_copy_dest.set_max_attempts(333);
55+
56+
options_copy_dest = options;
57+
58+
EXPECT_EQ(options.max_attempts(), 99);
59+
EXPECT_EQ(options_copy_dest.max_attempts(), 99);
60+
}
61+
62+
TEST(TransactionOptionsTest, MoveConstructor) {
63+
TransactionOptions options;
64+
options.set_max_attempts(99);
65+
66+
TransactionOptions moved_options(std::move(options));
67+
68+
EXPECT_EQ(moved_options.max_attempts(), 99);
69+
}
70+
71+
TEST(TransactionOptionsTest, MoveAssignmentOperator) {
72+
TransactionOptions options;
73+
options.set_max_attempts(99);
74+
TransactionOptions options_move_dest;
75+
options_move_dest.set_max_attempts(333);
76+
77+
options_move_dest = std::move(options);
78+
79+
EXPECT_EQ(options_move_dest.max_attempts(), 99);
80+
}
81+
82+
TEST(TransactionOptionsTest, SetMaxAttemptsSetsValidValues) {
83+
TransactionOptions options;
84+
options.set_max_attempts(10);
85+
EXPECT_EQ(options.max_attempts(), 10);
86+
options.set_max_attempts(1);
87+
EXPECT_EQ(options.max_attempts(), 1);
88+
options.set_max_attempts(2);
89+
EXPECT_EQ(options.max_attempts(), 2);
90+
options.set_max_attempts(INT32_MAX);
91+
EXPECT_EQ(options.max_attempts(), INT32_MAX);
92+
}
93+
94+
TEST(TransactionOptionsTest, SetMaxAttemptsThrowsOnInvalidValues) {
95+
TransactionOptions options;
96+
EXPECT_ANY_THROW(options.set_max_attempts(0));
97+
EXPECT_ANY_THROW(options.set_max_attempts(-1));
98+
EXPECT_ANY_THROW(options.set_max_attempts(INT32_MIN));
99+
}
100+
101+
TEST(TransactionOptionsTest, ToString) {
102+
TransactionOptions options;
103+
options.set_max_attempts(42);
104+
105+
const std::string to_string_result = options.ToString();
106+
107+
EXPECT_EQ(to_string_result, "TransactionOptions(max_attempts=42)");
108+
}
109+
110+
TEST(TransactionOptionsTest, RightShiftOperatorToOutputStream) {
111+
TransactionOptions options;
112+
options.set_max_attempts(42);
113+
const std::string expected_str = options.ToString();
114+
std::ostringstream ss;
115+
116+
ss << options;
117+
118+
EXPECT_EQ(ss.str(), expected_str);
119+
}
120+
121+
TEST(TransactionOptionsTest, EqualsOperator) {
122+
TransactionOptions default_options1;
123+
TransactionOptions default_options2;
124+
TransactionOptions options1a;
125+
options1a.set_max_attempts(1);
126+
TransactionOptions options1b;
127+
options1b.set_max_attempts(1);
128+
TransactionOptions options2a;
129+
options2a.set_max_attempts(99);
130+
TransactionOptions options2b;
131+
options2b.set_max_attempts(99);
132+
133+
EXPECT_TRUE(default_options1 == default_options1);
134+
EXPECT_TRUE(default_options1 == default_options2);
135+
EXPECT_TRUE(options1a == options1b);
136+
EXPECT_TRUE(options2a == options2b);
137+
138+
EXPECT_FALSE(options1a == options2a);
139+
EXPECT_FALSE(options1a == default_options1);
140+
EXPECT_FALSE(options2a == default_options1);
141+
}
142+
143+
TEST(TransactionOptionsTest, NotEqualsOperator) {
144+
TransactionOptions default_options1;
145+
TransactionOptions default_options2;
146+
TransactionOptions options1a;
147+
options1a.set_max_attempts(1);
148+
TransactionOptions options1b;
149+
options1b.set_max_attempts(1);
150+
TransactionOptions options2a;
151+
options2a.set_max_attempts(99);
152+
TransactionOptions options2b;
153+
options2b.set_max_attempts(99);
154+
155+
EXPECT_FALSE(default_options1 != default_options1);
156+
EXPECT_FALSE(default_options1 != default_options2);
157+
EXPECT_FALSE(options1a != options1b);
158+
EXPECT_FALSE(options2a != options2b);
159+
160+
EXPECT_TRUE(options1a != options2a);
161+
EXPECT_TRUE(options1a != default_options1);
162+
EXPECT_TRUE(options2a != default_options1);
163+
}
164+
165+
} // namespace
166+
} // namespace firestore
167+
} // namespace firebase

0 commit comments

Comments
 (0)