16
16
17
17
#include " firestore/src/jni/arena_ref.h"
18
18
#include " firestore/src/android/firestore_android.h"
19
+ #include " firestore/src/common/make_unique.h"
20
+ #include " firestore/src/jni/loader.h"
19
21
#include " firestore/src/jni/long.h"
20
22
21
23
#include " firestore_integration_test.h"
@@ -27,114 +29,247 @@ namespace firestore {
27
29
namespace jni {
28
30
namespace {
29
31
30
- using ArenaRefTestAndroid = FirestoreIntegrationTest;
31
-
32
- TEST_F (ArenaRefTestAndroid, DefaultConstructorCreatesReferenceToNull) {
33
- Env env;
32
+ constexpr char kException [] = " java/lang/Exception" ;
33
+ Method<String> kConstructor (" <init>" , " (Ljava/lang/String;)V" );
34
+
35
+ class ArenaRefTestAndroid : public FirestoreIntegrationTest {
36
+ public:
37
+ ArenaRefTestAndroid () : loader_(app()), env_(make_unique<Env>(GetEnv())) {
38
+ loader_.LoadClass (kException );
39
+ loader_.Load (kConstructor );
40
+ }
41
+
42
+ ~ArenaRefTestAndroid () override {
43
+ // Ensure that after the test is done that any pending exception is cleared
44
+ // to prevent spurious errors in the teardown of FirestoreIntegrationTest.
45
+ env_->ExceptionClear ();
46
+ }
47
+
48
+ Env& env () const { return *env_; }
49
+
50
+ void throwException () {
51
+ Local<Class> clazz = env ().FindClass (kException );
52
+ jmethodID ctor =
53
+ env ().GetMethodId (clazz, " <init>" , " (Ljava/lang/String;)V" );
54
+
55
+ Local<String> message = env ().NewStringUtf (" Testing throw" );
56
+ Local<Throwable> exception = env ().New <Throwable>(clazz, ctor, message);
57
+ // After throwing, use EXPECT rather than ASSERT to ensure that the
58
+ // exception is cleared.
59
+ env ().Throw (exception);
60
+ EXPECT_FALSE (env ().ok ());
61
+ }
62
+
63
+ void clearExceptionOccurred () {
64
+ Local<Throwable> thrown = env ().ClearExceptionOccurred ();
65
+ EXPECT_EQ (thrown.GetMessage (env ()), " Testing throw" );
66
+ }
67
+
68
+ private:
69
+ // Env is declared as having a `noexcept(false)` destructor, which causes the
70
+ // compiler to propagate this into `EnvTest`'s destructor, but this conflicts
71
+ // with the declaration of the parent class. Holding `Env` with a unique
72
+ // pointer sidesteps this restriction.
73
+ std::unique_ptr<Env> env_;
74
+ Loader loader_;
75
+ };
76
+
77
+ TEST_F (ArenaRefTestAndroid, DefaultConstructor) {
34
78
ArenaRef arena_ref;
35
- EXPECT_EQ (arena_ref.get (env).get (), nullptr );
79
+ EXPECT_EQ (arena_ref.get (env () ).get (), nullptr );
36
80
}
37
81
38
- TEST_F (ArenaRefTestAndroid, ConstructFromEnvAndObject) {
39
- Env env;
40
- Local<String> string = env.NewStringUtf (" hello world" );
41
-
42
- ArenaRef arena_ref (env, string);
43
- EXPECT_TRUE (arena_ref.get (env).Equals (env, string));
82
+ TEST_F (ArenaRefTestAndroid, ConstructsFromNull) {
83
+ Local<String> string;
84
+ ArenaRef arena_ref (env (), string);
85
+ EXPECT_EQ (arena_ref.get (env ()).get (), nullptr );
44
86
}
45
87
46
- TEST_F (ArenaRefTestAndroid, CopysReferenceToNull) {
47
- Env env;
88
+ TEST_F (ArenaRefTestAndroid, ConstructsFromValid) {
89
+ Local<String> string = env ().NewStringUtf (" hello world" );
90
+ ArenaRef arena_ref (env (), string);
91
+ EXPECT_TRUE (env ().IsSameObject (arena_ref.get (env ()), string));
92
+ }
48
93
94
+ TEST_F (ArenaRefTestAndroid, CopyConstructsFromNull) {
49
95
ArenaRef arena_ref1;
50
96
ArenaRef arena_ref2 (arena_ref1);
51
- EXPECT_EQ (arena_ref2.get (env).get (), nullptr );
97
+ EXPECT_EQ (arena_ref2.get (env () ).get (), nullptr );
52
98
}
53
99
54
- TEST_F (ArenaRefTestAndroid, CopysReferenceToValidObject ) {
55
- Env env;
100
+ TEST_F (ArenaRefTestAndroid, CopyConstructsFromValid ) {
101
+ Local<String> string = env (). NewStringUtf ( " hello world " ) ;
56
102
57
- Local<String> string = env.NewStringUtf (" hello world" );
58
-
59
- ArenaRef arena_ref1 (env, string);
103
+ ArenaRef arena_ref1 (env (), string);
60
104
ArenaRef arena_ref2 (arena_ref1);
61
-
62
- EXPECT_TRUE (arena_ref1.get (env).Equals (env, string));
63
- EXPECT_TRUE (arena_ref2.get (env).Equals (env, string));
105
+ EXPECT_TRUE (env ().IsSameObject (arena_ref1.get (env ()), string));
106
+ EXPECT_TRUE (env ().IsSameObject (arena_ref2.get (env ()), string));
64
107
}
65
108
66
- TEST_F (ArenaRefTestAndroid, CopyAssignsReferenceToNull) {
67
- Env env;
68
-
109
+ TEST_F (ArenaRefTestAndroid, CopyAssignsFromNullToNull) {
69
110
ArenaRef arena_ref1, arena_ref2;
70
111
arena_ref2 = arena_ref1;
71
- EXPECT_EQ (arena_ref1.get (env).get (), nullptr );
72
- EXPECT_EQ (arena_ref2.get (env).get (), nullptr );
112
+ EXPECT_EQ (arena_ref1.get (env () ).get (), nullptr );
113
+ EXPECT_EQ (arena_ref2.get (env () ).get (), nullptr );
73
114
}
74
115
75
- TEST_F (ArenaRefTestAndroid, CopyAssignsReferenceToValidObject ) {
76
- Env env;
116
+ TEST_F (ArenaRefTestAndroid, CopyAssignsFromNullToValid ) {
117
+ Local<String> string = env (). NewStringUtf ( " hello world " ) ;
77
118
78
- Local<String> string1 = env.NewStringUtf (" hello world" );
79
- Local<String> string2 = env.NewStringUtf (" hello earth" );
119
+ ArenaRef arena_ref1;
120
+ ArenaRef arena_ref2 (env (), string);
121
+ arena_ref2 = arena_ref1;
122
+ EXPECT_EQ (arena_ref1.get (env ()).get (), nullptr );
123
+ EXPECT_EQ (arena_ref2.get (env ()).get (), nullptr );
124
+ }
125
+
126
+ TEST_F (ArenaRefTestAndroid, CopyAssignsFromValidToNull) {
127
+ Local<String> string = env ().NewStringUtf (" hello world" );
80
128
81
129
ArenaRef arena_ref1;
82
- ArenaRef arena_ref2 (env, string1);
83
- ArenaRef arena_ref3 (env, string2);
84
- arena_ref3 = arena_ref2;
85
- arena_ref2 = arena_ref2;
130
+ ArenaRef arena_ref2 (env (), string);
131
+ arena_ref1 = arena_ref2;
132
+ EXPECT_TRUE (env ().IsSameObject (arena_ref1.get (env ()), string));
133
+ EXPECT_TRUE (env ().IsSameObject (arena_ref2.get (env ()), string));
134
+ }
86
135
87
- EXPECT_TRUE (arena_ref3.get (env).Equals (env, string1));
88
- EXPECT_TRUE (arena_ref2.get (env).Equals (env, string1));
136
+ TEST_F (ArenaRefTestAndroid, CopyAssignsFromValidToValid) {
137
+ Local<String> string1 = env ().NewStringUtf (" hello world" );
138
+ Local<String> string2 = env ().NewStringUtf (" hello earth" );
89
139
90
- arena_ref2 = arena_ref1;
91
- EXPECT_EQ (arena_ref2.get (env).get (), nullptr );
92
- EXPECT_TRUE (arena_ref3.get (env).Equals (env, string1));
140
+ ArenaRef arena_ref1 (env (), string1);
141
+ ArenaRef arena_ref2 (env (), string2);
142
+ arena_ref1 = arena_ref2;
143
+
144
+ EXPECT_TRUE (env ().IsSameObject (arena_ref1.get (env ()), string2));
145
+ EXPECT_TRUE (env ().IsSameObject (arena_ref2.get (env ()), string2));
146
+ }
147
+
148
+ TEST_F (ArenaRefTestAndroid, CopyAssignsFromNullObjectItself) {
149
+ ArenaRef arena_ref1;
150
+ arena_ref1 = arena_ref1;
151
+ EXPECT_EQ (arena_ref1.get (env ()).get (), nullptr );
93
152
}
94
153
95
- TEST_F (ArenaRefTestAndroid, MovesReferenceToNull) {
96
- Env env;
154
+ TEST_F (ArenaRefTestAndroid, CopyAssignsFromValidObjectItself) {
155
+ Local<String> string1 = env ().NewStringUtf (" hello world" );
156
+
157
+ ArenaRef arena_ref1 (env (), string1);
158
+ arena_ref1 = arena_ref1;
159
+ EXPECT_TRUE (env ().IsSameObject (arena_ref1.get (env ()), string1));
160
+ }
97
161
162
+ TEST_F (ArenaRefTestAndroid, MoveConstructsFromNull) {
98
163
ArenaRef arena_ref1;
99
164
ArenaRef arena_ref2 (std::move (arena_ref1));
100
- EXPECT_EQ (arena_ref2.get (env).get (), nullptr );
165
+ EXPECT_EQ (arena_ref2.get (env () ).get (), nullptr );
101
166
}
102
167
103
- TEST_F (ArenaRefTestAndroid, MovesReferenceToValidObject ) {
104
- Env env;
168
+ TEST_F (ArenaRefTestAndroid, MoveConstructsFromValid ) {
169
+ Local<String> string = env (). NewStringUtf ( " hello world " ) ;
105
170
106
- Local<String> string = env.NewStringUtf (" hello world" );
107
-
108
- ArenaRef arena_ref2 (env, string);
171
+ ArenaRef arena_ref2 (env (), string);
109
172
ArenaRef arena_ref3 (std::move (arena_ref2));
110
- EXPECT_TRUE (arena_ref3.get (env). Equals (env , string));
173
+ EXPECT_TRUE (env (). IsSameObject ( arena_ref3.get (env ()) , string));
111
174
}
112
175
113
- TEST_F (ArenaRefTestAndroid, MoveAssignsReferenceToNull) {
114
- Env env;
115
-
176
+ TEST_F (ArenaRefTestAndroid, MoveAssignsFromNullToNull) {
116
177
ArenaRef arena_ref1, arena_ref2;
117
178
arena_ref2 = std::move (arena_ref1);
118
- EXPECT_EQ (arena_ref2.get (env).get (), nullptr );
179
+ EXPECT_EQ (arena_ref2.get (env () ).get (), nullptr );
119
180
}
120
181
121
- TEST_F (ArenaRefTestAndroid, MoveAssignsReferenceToValidObject ) {
122
- Env env;
182
+ TEST_F (ArenaRefTestAndroid, MoveAssignsFromNullToValid ) {
183
+ Local<String> string = env (). NewStringUtf ( " hello world " ) ;
123
184
124
- Local<String> string1 = env.NewStringUtf (" hello world" );
125
- Local<String> string2 = env.NewStringUtf (" hello earth" );
185
+ ArenaRef arena_ref1;
186
+ ArenaRef arena_ref2 (env (), string);
187
+ arena_ref2 = std::move (arena_ref1);
188
+ EXPECT_EQ (arena_ref2.get (env ()).get (), nullptr );
189
+ }
190
+
191
+ TEST_F (ArenaRefTestAndroid, MoveAssignsFromValidToNull) {
192
+ Local<String> string = env ().NewStringUtf (" hello world" );
126
193
127
194
ArenaRef arena_ref1;
128
- ArenaRef arena_ref2 (env, string1);
129
- arena_ref2 = std::move (arena_ref2);
130
- EXPECT_TRUE (arena_ref2.get (env).Equals (env, string1));
195
+ ArenaRef arena_ref2 (env (), string);
196
+ arena_ref1 = std::move (arena_ref2);
197
+ EXPECT_TRUE (env ().IsSameObject (arena_ref1.get (env ()), string));
198
+ }
199
+
200
+ TEST_F (ArenaRefTestAndroid, MoveAssignsFromValidToValid) {
201
+ Local<String> string1 = env ().NewStringUtf (" hello world" );
202
+ Local<String> string2 = env ().NewStringUtf (" hello earth" );
203
+
204
+ ArenaRef arena_ref1 (env (), string1);
205
+ ArenaRef arena_ref2 (env (), string2);
206
+ arena_ref1 = std::move (arena_ref2);
207
+ EXPECT_TRUE (env ().IsSameObject (arena_ref1.get (env ()), string2));
208
+ }
209
+
210
+ TEST_F (ArenaRefTestAndroid, MoveAssignsFromNullObjectItself) {
211
+ ArenaRef arena_ref1;
212
+ arena_ref1 = std::move (arena_ref1);
213
+ EXPECT_EQ (arena_ref1.get (env ()).get (), nullptr );
214
+ }
215
+
216
+ TEST_F (ArenaRefTestAndroid, MoveAssignsFromValidObjectItself) {
217
+ Local<String> string1 = env ().NewStringUtf (" hello world" );
218
+
219
+ ArenaRef arena_ref1 (env (), string1);
220
+ arena_ref1 = std::move (arena_ref1);
221
+ EXPECT_TRUE (env ().IsSameObject (arena_ref1.get (env ()), string1));
222
+ }
131
223
132
- ArenaRef arena_ref3 (env, string2);
133
- arena_ref3 = std::move (arena_ref2);
134
- EXPECT_TRUE (arena_ref3.get (env).Equals (env, string1));
224
+ TEST_F (ArenaRefTestAndroid, ThrowBeforeConstruct) {
225
+ Local<String> string = env ().NewStringUtf (" hello world" );
226
+ EXPECT_EQ (string.ToString (env ()).size (), 11U );
227
+ throwException ();
228
+ ArenaRef arena_ref (env (), string);
229
+ clearExceptionOccurred ();
230
+ EXPECT_EQ (arena_ref.get (env ()).get (), nullptr );
231
+ }
232
+
233
+ TEST_F (ArenaRefTestAndroid, ThrowBeforeCopyConstruct) {
234
+ Local<String> string = env ().NewStringUtf (" hello world" );
235
+ ArenaRef arena_ref1 (env (), string);
236
+ EXPECT_EQ (arena_ref1.get (env ()).ToString (env ()).size (), 11U );
237
+ throwException ();
238
+ ArenaRef arena_ref2 (arena_ref1);
239
+ clearExceptionOccurred ();
240
+ EXPECT_EQ (arena_ref2.get (env ()).get (), nullptr );
241
+ }
135
242
136
- arena_ref3 = std::move (arena_ref1);
137
- EXPECT_EQ (arena_ref3.get (env).get (), nullptr );
243
+ TEST_F (ArenaRefTestAndroid, ThrowBeforeCopyAssignment) {
244
+ Local<String> string = env ().NewStringUtf (" hello world" );
245
+ ArenaRef arena_ref1 (env (), string);
246
+ ArenaRef arena_ref2;
247
+ EXPECT_EQ (arena_ref1.get (env ()).ToString (env ()).size (), 11U );
248
+ throwException ();
249
+ arena_ref2 = arena_ref1;
250
+ clearExceptionOccurred ();
251
+ EXPECT_EQ (arena_ref2.get (env ()).get (), nullptr );
252
+ }
253
+
254
+ TEST_F (ArenaRefTestAndroid, ThrowBeforeMoveConstruct) {
255
+ Local<String> string = env ().NewStringUtf (" hello world" );
256
+ ArenaRef arena_ref1 (env (), string);
257
+ EXPECT_EQ (arena_ref1.get (env ()).ToString (env ()).size (), 11U );
258
+ throwException ();
259
+ ArenaRef arena_ref2 (std::move (arena_ref1));
260
+ clearExceptionOccurred ();
261
+ EXPECT_TRUE (env ().IsSameObject (arena_ref2.get (env ()), string));
262
+ }
263
+
264
+ TEST_F (ArenaRefTestAndroid, ThrowBeforeMoveAssignment) {
265
+ Local<String> string = env ().NewStringUtf (" hello world" );
266
+ ArenaRef arena_ref1 (env (), string);
267
+ ArenaRef arena_ref2;
268
+ EXPECT_EQ (arena_ref1.get (env ()).ToString (env ()).size (), 11U );
269
+ throwException ();
270
+ arena_ref2 = std::move (arena_ref1);
271
+ clearExceptionOccurred ();
272
+ EXPECT_TRUE (env ().IsSameObject (arena_ref2.get (env ()), string));
138
273
}
139
274
140
275
} // namespace
0 commit comments