@react-native-firebase/app 26.3.2 → 26.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -0
- package/RNFBApp.podspec +1 -1
- package/android/src/main/java/io/invertase/firebase/common/RNFBHandleCollisionException.java +31 -0
- package/android/src/main/java/io/invertase/firebase/common/RNFBHandleMap.java +150 -0
- package/android/src/main/java/io/invertase/firebase/common/TaskExecutorService.java +27 -3
- package/android/src/reactnative/java/io/invertase/firebase/app/NativeRNFBTurboApp.java +3 -1
- package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseVersion.java +1 -1
- package/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.java +3 -2
- package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseJSON.java +5 -3
- package/android/src/test/java/io/invertase/firebase/app/NativeRNFBTurboAppTest.java +26 -1
- package/android/src/test/java/io/invertase/firebase/common/RNFBHandleMapTest.java +275 -0
- package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitterTest.java +1 -1
- package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseJSONTest.java +108 -0
- package/android/src/test/java/io/invertase/firebase/common/TaskExecutorServiceTest.java +97 -0
- package/android/src/test/java/io/invertase/firebase/utils/NativeRNFBTurboUtilsTest.java +0 -2
- package/dist/module/common/Base64.js +13 -21
- package/dist/module/common/Base64.js.map +1 -1
- package/dist/module/common/index.js +17 -9
- package/dist/module/common/index.js.map +1 -1
- package/dist/module/internal/asyncStorage.js +7 -11
- package/dist/module/internal/asyncStorage.js.map +1 -1
- package/dist/module/internal/logger.js +44 -40
- package/dist/module/internal/logger.js.map +1 -1
- package/dist/module/internal/nativeModuleAndroidIos.js +2 -29
- package/dist/module/internal/nativeModuleAndroidIos.js.map +1 -1
- package/dist/module/internal/nativeModuleDebug.js +74 -0
- package/dist/module/internal/nativeModuleDebug.js.map +1 -0
- package/dist/module/internal/nativeModuleWeb.js +9 -29
- package/dist/module/internal/nativeModuleWeb.js.map +1 -1
- package/dist/module/internal/registry/app.js +1 -1
- package/dist/module/internal/registry/app.js.map +1 -1
- package/dist/module/internal/registry/modular.js +2 -2
- package/dist/module/internal/registry/modular.js.map +1 -1
- package/dist/module/internal/registry/nativeModule.js +3 -3
- package/dist/module/internal/registry/nativeModule.js.map +1 -1
- package/dist/module/internal/web/RNFBAppModule.js +16 -15
- package/dist/module/internal/web/RNFBAppModule.js.map +1 -1
- package/dist/module/internal/web/memidb/lib/FakeEventTarget.js +3 -1
- package/dist/module/internal/web/memidb/lib/FakeEventTarget.js.map +1 -1
- package/dist/module/version.js +1 -1
- package/dist/typescript/lib/common/Base64.d.ts.map +1 -1
- package/dist/typescript/lib/common/index.d.ts.map +1 -1
- package/dist/typescript/lib/internal/asyncStorage.d.ts.map +1 -1
- package/dist/typescript/lib/internal/logger.d.ts.map +1 -1
- package/dist/typescript/lib/internal/nativeModuleAndroidIos.d.ts.map +1 -1
- package/dist/typescript/lib/internal/nativeModuleDebug.d.ts +2 -0
- package/dist/typescript/lib/internal/nativeModuleDebug.d.ts.map +1 -0
- package/dist/typescript/lib/internal/nativeModuleWeb.d.ts.map +1 -1
- package/dist/typescript/lib/internal/web/RNFBAppModule.d.ts +7 -7
- package/dist/typescript/lib/internal/web/RNFBAppModule.d.ts.map +1 -1
- package/dist/typescript/lib/version.d.ts +1 -1
- package/firebase-schema.json +1 -1
- package/firebase_spm.rb +240 -95
- package/ios/RNFBApp/RNFBAppModule.mm +42 -16
- package/ios/RNFBApp/RNFBHandleMap.h +73 -0
- package/ios/RNFBApp/RNFBHandleMap.m +116 -0
- package/ios/RNFBApp/RNFBSharedUtils.m +3 -2
- package/ios/RNFBApp/RNFBUtilsModule.mm +2 -3
- package/ios/RNFBApp/RNFBVersion.m +1 -1
- package/ios/RNFBApp.xcodeproj/project.pbxproj +6 -0
- package/ios/RNFBAppUnitTests/RNFBAppUnitTests.xcodeproj/project.pbxproj +237 -0
- package/ios/RNFBAppUnitTests/RNFBAppUnitTests.xcodeproj/xcshareddata/xcschemes/RNFBAppUnitTests.xcscheme +69 -0
- package/ios/RNFBAppUnitTests/RNFBHandleMapTests.m +238 -0
- package/lib/common/Base64.ts +10 -16
- package/lib/common/index.ts +20 -9
- package/lib/internal/asyncStorage.ts +7 -11
- package/lib/internal/logger.ts +53 -43
- package/lib/internal/nativeModuleAndroidIos.ts +2 -40
- package/lib/internal/nativeModuleDebug.ts +97 -0
- package/lib/internal/nativeModuleWeb.ts +10 -40
- package/lib/internal/registry/app.ts +1 -1
- package/lib/internal/registry/modular.ts +2 -2
- package/lib/internal/registry/nativeModule.ts +3 -3
- package/lib/internal/web/RNFBAppModule.ts +16 -15
- package/lib/internal/web/memidb/lib/FakeEventTarget.js +3 -1
- package/lib/version.ts +1 -1
- package/package.json +3 -2
- package/plugin/build/ios/appDelegate.js +18 -8
- package/plugin/src/ios/appDelegate.ts +44 -14
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
package io.invertase.firebase.common;
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Copyright (c) 2016-present Invertase Limited & Contributors
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this library except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import static org.junit.Assert.assertEquals;
|
|
21
|
+
import static org.junit.Assert.assertFalse;
|
|
22
|
+
import static org.junit.Assert.assertNull;
|
|
23
|
+
import static org.junit.Assert.assertSame;
|
|
24
|
+
import static org.junit.Assert.assertTrue;
|
|
25
|
+
import static org.junit.Assert.fail;
|
|
26
|
+
|
|
27
|
+
import java.util.List;
|
|
28
|
+
import java.util.concurrent.CountDownLatch;
|
|
29
|
+
import java.util.concurrent.TimeUnit;
|
|
30
|
+
import java.util.concurrent.atomic.AtomicReference;
|
|
31
|
+
import org.junit.Before;
|
|
32
|
+
import org.junit.Test;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* JVM coverage for {@link RNFBHandleMap}. Tests must not invoke methods on stored values — the map
|
|
36
|
+
* only moves pointers.
|
|
37
|
+
*/
|
|
38
|
+
public class RNFBHandleMapTest {
|
|
39
|
+
|
|
40
|
+
private RNFBHandleMap<Integer, Object> map;
|
|
41
|
+
|
|
42
|
+
@Before
|
|
43
|
+
public void setUp() {
|
|
44
|
+
map = new RNFBHandleMap<>();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@Test
|
|
48
|
+
public void putGetTake_happyPath() throws Exception {
|
|
49
|
+
Object handle = new Object();
|
|
50
|
+
map.put(1, handle);
|
|
51
|
+
|
|
52
|
+
assertSame(handle, map.get(1));
|
|
53
|
+
assertSame(handle, map.take(1));
|
|
54
|
+
assertNull(map.get(1));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@Test
|
|
58
|
+
public void take_missingKey_returnsNull() {
|
|
59
|
+
assertNull(map.take(99));
|
|
60
|
+
assertNull(map.get(99));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@Test
|
|
64
|
+
public void takeAll_returnsSnapshotAndLeavesMapEmpty() throws Exception {
|
|
65
|
+
Object a = new Object();
|
|
66
|
+
Object b = new Object();
|
|
67
|
+
map.put(1, a);
|
|
68
|
+
map.put(2, b);
|
|
69
|
+
|
|
70
|
+
List<Object> snapshot = map.takeAll();
|
|
71
|
+
|
|
72
|
+
assertEquals(2, snapshot.size());
|
|
73
|
+
assertTrue(snapshot.contains(a));
|
|
74
|
+
assertTrue(snapshot.contains(b));
|
|
75
|
+
assertNull(map.get(1));
|
|
76
|
+
assertNull(map.get(2));
|
|
77
|
+
assertTrue(map.takeAll().isEmpty());
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@Test
|
|
81
|
+
public void put_occupiedId_throwsCollision() throws Exception {
|
|
82
|
+
Object first = new Object();
|
|
83
|
+
map.put(1, first);
|
|
84
|
+
try {
|
|
85
|
+
map.put(1, new Object());
|
|
86
|
+
fail("expected RNFBHandleCollisionException");
|
|
87
|
+
} catch (RNFBHandleCollisionException e) {
|
|
88
|
+
assertTrue(e.getMessage().contains("1"));
|
|
89
|
+
assertSame(first, map.get(1));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@Test
|
|
94
|
+
public void putIfAbsent_whenFree_storesAndReturnsTrue() throws Exception {
|
|
95
|
+
Object handle = new Object();
|
|
96
|
+
assertTrue(map.putIfAbsent(1, handle));
|
|
97
|
+
assertSame(handle, map.get(1));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
@Test
|
|
101
|
+
public void putIfAbsent_whenOccupied_keepsExistingAndReturnsFalse() throws Exception {
|
|
102
|
+
Object first = new Object();
|
|
103
|
+
Object second = new Object();
|
|
104
|
+
map.put(1, first);
|
|
105
|
+
assertFalse(map.putIfAbsent(1, second));
|
|
106
|
+
assertSame(first, map.get(1));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@Test
|
|
110
|
+
public void putIfAbsentOrSame_whenAbsent_storesAndReturnsTrue() {
|
|
111
|
+
Object handle = new Object();
|
|
112
|
+
assertTrue(map.putIfAbsentOrSame(1, handle));
|
|
113
|
+
assertSame(handle, map.get(1));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
@Test
|
|
117
|
+
public void putIfAbsentOrSame_whenSameInstance_returnsTrue() throws Exception {
|
|
118
|
+
Object handle = new Object();
|
|
119
|
+
map.put(1, handle);
|
|
120
|
+
assertTrue(map.putIfAbsentOrSame(1, handle));
|
|
121
|
+
assertSame(handle, map.get(1));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
@Test
|
|
125
|
+
public void putIfAbsentOrSame_whenDifferent_returnsFalse() throws Exception {
|
|
126
|
+
Object first = new Object();
|
|
127
|
+
Object second = new Object();
|
|
128
|
+
map.put(1, first);
|
|
129
|
+
assertFalse(map.putIfAbsentOrSame(1, second));
|
|
130
|
+
assertSame(first, map.get(1));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@Test
|
|
134
|
+
public void putReplacing_whenFree_storesAndReturnsNull() throws Exception {
|
|
135
|
+
Object handle = new Object();
|
|
136
|
+
assertNull(map.putReplacing(1, handle));
|
|
137
|
+
assertSame(handle, map.get(1));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
@Test
|
|
141
|
+
public void putReplacing_whenOccupied_replacesLastWins() throws Exception {
|
|
142
|
+
Object first = new Object();
|
|
143
|
+
Object second = new Object();
|
|
144
|
+
map.put(1, first);
|
|
145
|
+
assertSame(first, map.putReplacing(1, second));
|
|
146
|
+
assertSame(second, map.get(1));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
@Test
|
|
150
|
+
public void put_afterTake_allowsReuse() throws Exception {
|
|
151
|
+
Object first = new Object();
|
|
152
|
+
Object second = new Object();
|
|
153
|
+
map.put(1, first);
|
|
154
|
+
assertSame(first, map.take(1));
|
|
155
|
+
map.put(1, second);
|
|
156
|
+
assertSame(second, map.get(1));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
@Test
|
|
160
|
+
public void takeIf_whenPredicateTrue_removesAndReturns() throws Exception {
|
|
161
|
+
Object handle = new Object();
|
|
162
|
+
map.put(1, handle);
|
|
163
|
+
assertSame(handle, map.takeIf(1, v -> v == handle));
|
|
164
|
+
assertNull(map.get(1));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
@Test
|
|
168
|
+
public void takeIf_whenPredicateFalse_leavesMapping() throws Exception {
|
|
169
|
+
Object handle = new Object();
|
|
170
|
+
map.put(1, handle);
|
|
171
|
+
assertNull(map.takeIf(1, v -> false));
|
|
172
|
+
assertSame(handle, map.get(1));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
@Test
|
|
176
|
+
public void takeIf_whenMissing_returnsNull() {
|
|
177
|
+
assertNull(map.takeIf(99, v -> true));
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
@Test
|
|
181
|
+
public void take_sameIdFromTwoThreads_onlyOneReturnsNonNull() throws Exception {
|
|
182
|
+
Object handle = new Object();
|
|
183
|
+
map.put(1, handle);
|
|
184
|
+
|
|
185
|
+
CountDownLatch start = new CountDownLatch(1);
|
|
186
|
+
CountDownLatch done = new CountDownLatch(2);
|
|
187
|
+
AtomicReference<Object> first = new AtomicReference<>();
|
|
188
|
+
AtomicReference<Object> second = new AtomicReference<>();
|
|
189
|
+
|
|
190
|
+
Thread t1 =
|
|
191
|
+
new Thread(
|
|
192
|
+
() -> {
|
|
193
|
+
try {
|
|
194
|
+
start.await();
|
|
195
|
+
first.set(map.take(1));
|
|
196
|
+
} catch (InterruptedException e) {
|
|
197
|
+
Thread.currentThread().interrupt();
|
|
198
|
+
} finally {
|
|
199
|
+
done.countDown();
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
Thread t2 =
|
|
203
|
+
new Thread(
|
|
204
|
+
() -> {
|
|
205
|
+
try {
|
|
206
|
+
start.await();
|
|
207
|
+
second.set(map.take(1));
|
|
208
|
+
} catch (InterruptedException e) {
|
|
209
|
+
Thread.currentThread().interrupt();
|
|
210
|
+
} finally {
|
|
211
|
+
done.countDown();
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
t1.start();
|
|
216
|
+
t2.start();
|
|
217
|
+
start.countDown();
|
|
218
|
+
assertTrue(done.await(5, TimeUnit.SECONDS));
|
|
219
|
+
|
|
220
|
+
Object a = first.get();
|
|
221
|
+
Object b = second.get();
|
|
222
|
+
boolean onlyFirst = a == handle && b == null;
|
|
223
|
+
boolean onlySecond = b == handle && a == null;
|
|
224
|
+
assertTrue(onlyFirst || onlySecond);
|
|
225
|
+
assertNull(map.get(1));
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
@Test
|
|
229
|
+
public void putReplacing_sameIdFromTwoThreads_lastWins() throws Exception {
|
|
230
|
+
Object first = new Object();
|
|
231
|
+
Object second = new Object();
|
|
232
|
+
Object third = new Object();
|
|
233
|
+
map.put(1, first);
|
|
234
|
+
|
|
235
|
+
CountDownLatch start = new CountDownLatch(1);
|
|
236
|
+
CountDownLatch done = new CountDownLatch(2);
|
|
237
|
+
AtomicReference<Object> prevA = new AtomicReference<>();
|
|
238
|
+
AtomicReference<Object> prevB = new AtomicReference<>();
|
|
239
|
+
|
|
240
|
+
Thread t1 =
|
|
241
|
+
new Thread(
|
|
242
|
+
() -> {
|
|
243
|
+
try {
|
|
244
|
+
start.await();
|
|
245
|
+
prevA.set(map.putReplacing(1, second));
|
|
246
|
+
} catch (InterruptedException e) {
|
|
247
|
+
Thread.currentThread().interrupt();
|
|
248
|
+
} finally {
|
|
249
|
+
done.countDown();
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
Thread t2 =
|
|
253
|
+
new Thread(
|
|
254
|
+
() -> {
|
|
255
|
+
try {
|
|
256
|
+
start.await();
|
|
257
|
+
prevB.set(map.putReplacing(1, third));
|
|
258
|
+
} catch (InterruptedException e) {
|
|
259
|
+
Thread.currentThread().interrupt();
|
|
260
|
+
} finally {
|
|
261
|
+
done.countDown();
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
t1.start();
|
|
266
|
+
t2.start();
|
|
267
|
+
start.countDown();
|
|
268
|
+
assertTrue(done.await(5, TimeUnit.SECONDS));
|
|
269
|
+
|
|
270
|
+
Object winner = map.get(1);
|
|
271
|
+
assertTrue(winner == second || winner == third);
|
|
272
|
+
Object returnedFirst = prevA.get() == first ? prevA.get() : prevB.get();
|
|
273
|
+
assertSame(first, returnedFirst);
|
|
274
|
+
}
|
|
275
|
+
}
|
package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitterTest.java
CHANGED
|
@@ -65,7 +65,7 @@ import org.robolectric.shadows.ShadowLooper;
|
|
|
65
65
|
* require the Detox/Jet harness.
|
|
66
66
|
*/
|
|
67
67
|
@RunWith(RobolectricTestRunner.class)
|
|
68
|
-
@Config(
|
|
68
|
+
@Config(application = ReactNativeFirebaseEventEmitterTest.HostApplication.class)
|
|
69
69
|
public class ReactNativeFirebaseEventEmitterTest {
|
|
70
70
|
|
|
71
71
|
private static final String EVENT = "auth_state_changed";
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
package io.invertase.firebase.common;
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Copyright (c) 2016-present Invertase Limited & Contributors
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this library except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import static org.junit.Assert.assertSame;
|
|
20
|
+
import static org.mockito.ArgumentMatchers.eq;
|
|
21
|
+
import static org.mockito.Mockito.mock;
|
|
22
|
+
import static org.mockito.Mockito.mockStatic;
|
|
23
|
+
import static org.mockito.Mockito.verifyNoInteractions;
|
|
24
|
+
import static org.mockito.Mockito.when;
|
|
25
|
+
|
|
26
|
+
import com.facebook.react.bridge.Arguments;
|
|
27
|
+
import com.facebook.react.bridge.WritableMap;
|
|
28
|
+
import java.lang.reflect.Field;
|
|
29
|
+
import java.util.Collections;
|
|
30
|
+
import java.util.List;
|
|
31
|
+
import org.json.JSONObject;
|
|
32
|
+
import org.junit.After;
|
|
33
|
+
import org.junit.Before;
|
|
34
|
+
import org.junit.Test;
|
|
35
|
+
import org.mockito.MockedStatic;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Plain JUnit4 + Mockito (AndroidTest-AD-1). Covers {@link ReactNativeFirebaseJSON#getAll()}.
|
|
39
|
+
* JSONObject is mocked because Android's org.json stubs are not available on the JVM.
|
|
40
|
+
*/
|
|
41
|
+
public class ReactNativeFirebaseJSONTest {
|
|
42
|
+
|
|
43
|
+
private ReactNativeFirebaseJSON json;
|
|
44
|
+
private Field jsonObjectField;
|
|
45
|
+
private Object originalJsonObject;
|
|
46
|
+
|
|
47
|
+
@Before
|
|
48
|
+
public void setUp() throws Exception {
|
|
49
|
+
json = ReactNativeFirebaseJSON.getSharedInstance();
|
|
50
|
+
jsonObjectField = ReactNativeFirebaseJSON.class.getDeclaredField("jsonObject");
|
|
51
|
+
jsonObjectField.setAccessible(true);
|
|
52
|
+
originalJsonObject = jsonObjectField.get(json);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@After
|
|
56
|
+
public void tearDown() throws Exception {
|
|
57
|
+
jsonObjectField.set(json, originalJsonObject);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@Test
|
|
61
|
+
public void getAllReturnsEmptyMapWhenJsonObjectIsNull() throws Exception {
|
|
62
|
+
WritableMap emptyMap = mock(WritableMap.class);
|
|
63
|
+
jsonObjectField.set(json, null);
|
|
64
|
+
|
|
65
|
+
try (MockedStatic<Arguments> arguments = mockStatic(Arguments.class)) {
|
|
66
|
+
arguments.when(Arguments::createMap).thenReturn(emptyMap);
|
|
67
|
+
|
|
68
|
+
assertSame(emptyMap, json.getAll());
|
|
69
|
+
verifyNoInteractions(emptyMap);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@Test
|
|
74
|
+
public void getAllReturnsEmptyMapForEmptyJsonObject() throws Exception {
|
|
75
|
+
WritableMap emptyMap = mock(WritableMap.class);
|
|
76
|
+
JSONObject jsonObject = mock(JSONObject.class);
|
|
77
|
+
when(jsonObject.keys()).thenReturn(Collections.emptyIterator());
|
|
78
|
+
jsonObjectField.set(json, jsonObject);
|
|
79
|
+
|
|
80
|
+
try (MockedStatic<Arguments> arguments = mockStatic(Arguments.class)) {
|
|
81
|
+
arguments.when(Arguments::createMap).thenReturn(emptyMap);
|
|
82
|
+
|
|
83
|
+
assertSame(emptyMap, json.getAll());
|
|
84
|
+
verifyNoInteractions(emptyMap);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@Test
|
|
89
|
+
public void getAllMapsNonEmptyJsonObjectEntries() throws Exception {
|
|
90
|
+
WritableMap writableMap = mock(WritableMap.class);
|
|
91
|
+
JSONObject jsonObject = mock(JSONObject.class);
|
|
92
|
+
when(jsonObject.keys()).thenReturn(List.of("analytics_auto_collection_enabled").iterator());
|
|
93
|
+
when(jsonObject.get("analytics_auto_collection_enabled")).thenReturn(false);
|
|
94
|
+
jsonObjectField.set(json, jsonObject);
|
|
95
|
+
|
|
96
|
+
try (MockedStatic<Arguments> arguments = mockStatic(Arguments.class);
|
|
97
|
+
MockedStatic<SharedUtils> sharedUtils = mockStatic(SharedUtils.class)) {
|
|
98
|
+
arguments.when(Arguments::createMap).thenReturn(writableMap);
|
|
99
|
+
|
|
100
|
+
assertSame(writableMap, json.getAll());
|
|
101
|
+
|
|
102
|
+
sharedUtils.verify(
|
|
103
|
+
() ->
|
|
104
|
+
SharedUtils.mapPutValue(
|
|
105
|
+
eq("analytics_auto_collection_enabled"), eq(false), eq(writableMap)));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
package io.invertase.firebase.common;
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Copyright (c) 2016-present Invertase Limited & Contributors
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this library except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import static org.junit.Assert.assertFalse;
|
|
21
|
+
import static org.junit.Assert.assertTrue;
|
|
22
|
+
import static org.mockito.ArgumentMatchers.anyInt;
|
|
23
|
+
import static org.mockito.ArgumentMatchers.anyString;
|
|
24
|
+
import static org.mockito.Mockito.mock;
|
|
25
|
+
import static org.mockito.Mockito.mockStatic;
|
|
26
|
+
import static org.mockito.Mockito.when;
|
|
27
|
+
|
|
28
|
+
import java.util.concurrent.CountDownLatch;
|
|
29
|
+
import java.util.concurrent.ExecutorService;
|
|
30
|
+
import java.util.concurrent.TimeUnit;
|
|
31
|
+
import java.util.concurrent.atomic.AtomicBoolean;
|
|
32
|
+
import org.junit.After;
|
|
33
|
+
import org.junit.Before;
|
|
34
|
+
import org.junit.Test;
|
|
35
|
+
import org.mockito.MockedStatic;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Plain JUnit4 + Mockito (AndroidTest-AD-1). Constructor reads pool sizing from {@link
|
|
39
|
+
* ReactNativeFirebaseJSON}; stub that away so we never touch Android's unmocked {@code
|
|
40
|
+
* org.json.JSONObject}.
|
|
41
|
+
*/
|
|
42
|
+
public class TaskExecutorServiceTest {
|
|
43
|
+
|
|
44
|
+
private MockedStatic<ReactNativeFirebaseJSON> jsonStatic;
|
|
45
|
+
|
|
46
|
+
@Before
|
|
47
|
+
public void setUp() {
|
|
48
|
+
ReactNativeFirebaseJSON json = mock(ReactNativeFirebaseJSON.class);
|
|
49
|
+
when(json.getIntValue(anyString(), anyInt())).thenAnswer(inv -> inv.getArgument(1));
|
|
50
|
+
jsonStatic = mockStatic(ReactNativeFirebaseJSON.class);
|
|
51
|
+
jsonStatic.when(ReactNativeFirebaseJSON::getSharedInstance).thenReturn(json);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@After
|
|
55
|
+
public void tearDown() {
|
|
56
|
+
jsonStatic.close();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@Test
|
|
60
|
+
public void transactionalExecutorRunsSubmittedWork() throws Exception {
|
|
61
|
+
TaskExecutorService service = new TaskExecutorService("TestTransactionalRuns");
|
|
62
|
+
ExecutorService executor = service.getTransactionalExecutor();
|
|
63
|
+
CountDownLatch latch = new CountDownLatch(1);
|
|
64
|
+
|
|
65
|
+
executor.execute(latch::countDown);
|
|
66
|
+
|
|
67
|
+
assertTrue("work submitted before shutdown runs", latch.await(5, TimeUnit.SECONDS));
|
|
68
|
+
service.shutdown();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@Test
|
|
72
|
+
public void transactionalExecutorDiscardsWorkSubmittedAfterShutdown() {
|
|
73
|
+
TaskExecutorService service = new TaskExecutorService("TestTransactionalShutdown");
|
|
74
|
+
ExecutorService executor = service.getTransactionalExecutor();
|
|
75
|
+
service.shutdown();
|
|
76
|
+
AtomicBoolean ran = new AtomicBoolean(false);
|
|
77
|
+
|
|
78
|
+
// Must not throw RejectedExecutionException - this is the crash path hit when a
|
|
79
|
+
// play-services Task completes after module invalidation has shut the executor down.
|
|
80
|
+
executor.execute(() -> ran.set(true));
|
|
81
|
+
|
|
82
|
+
assertFalse("work submitted after shutdown is discarded", ran.get());
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@Test
|
|
86
|
+
public void pooledExecutorDiscardsWorkSubmittedAfterShutdown() {
|
|
87
|
+
TaskExecutorService service = new TaskExecutorService("TestPooledShutdown");
|
|
88
|
+
ExecutorService executor = service.getExecutor(false, "");
|
|
89
|
+
service.shutdown();
|
|
90
|
+
AtomicBoolean ran = new AtomicBoolean(false);
|
|
91
|
+
|
|
92
|
+
// Exercises the executeInFallback handler's shutdown guard.
|
|
93
|
+
executor.execute(() -> ran.set(true));
|
|
94
|
+
|
|
95
|
+
assertFalse("work submitted after shutdown is discarded", ran.get());
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -36,14 +36,12 @@ import org.junit.Test;
|
|
|
36
36
|
import org.junit.runner.RunWith;
|
|
37
37
|
import org.robolectric.RobolectricTestRunner;
|
|
38
38
|
import org.robolectric.RuntimeEnvironment;
|
|
39
|
-
import org.robolectric.annotation.Config;
|
|
40
39
|
|
|
41
40
|
/**
|
|
42
41
|
* JVM coverage for {@link NativeRNFBTurboUtils} appVersion constant export branches (null, empty,
|
|
43
42
|
* package-manager failure).
|
|
44
43
|
*/
|
|
45
44
|
@RunWith(RobolectricTestRunner.class)
|
|
46
|
-
@Config(sdk = 34)
|
|
47
45
|
public class NativeRNFBTurboUtilsTest {
|
|
48
46
|
|
|
49
47
|
private ReactApplicationContext reactContext;
|
|
@@ -19,7 +19,6 @@
|
|
|
19
19
|
|
|
20
20
|
// @ts-expect-error - No type declarations available
|
|
21
21
|
import binaryToBase64 from 'react-native/Libraries/Utilities/binaryToBase64';
|
|
22
|
-
import { promiseDefer } from "./promise.js";
|
|
23
22
|
const CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
|
24
23
|
|
|
25
24
|
/**
|
|
@@ -63,26 +62,19 @@ function atob(input) {
|
|
|
63
62
|
*/
|
|
64
63
|
function fromData(data) {
|
|
65
64
|
if (data instanceof Blob) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
fileReader.onerror = event => {
|
|
82
|
-
fileReader?.abort();
|
|
83
|
-
reject?.(event);
|
|
84
|
-
};
|
|
85
|
-
return promise;
|
|
65
|
+
return new Promise((resolve, reject) => {
|
|
66
|
+
const fileReader = new FileReader();
|
|
67
|
+
fileReader.onloadend = () => {
|
|
68
|
+
if (fileReader.result) {
|
|
69
|
+
resolve({
|
|
70
|
+
string: fileReader.result,
|
|
71
|
+
format: 'data_url'
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
fileReader.onerror = event => reject(event);
|
|
76
|
+
fileReader.readAsDataURL(data);
|
|
77
|
+
});
|
|
86
78
|
}
|
|
87
79
|
if (data instanceof ArrayBuffer || data instanceof Uint8Array) {
|
|
88
80
|
return Promise.resolve({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["binaryToBase64","
|
|
1
|
+
{"version":3,"names":["binaryToBase64","CHARS","btoa","input","map","i","block","output","charAt","charCode","charCodeAt","Error","atob","bc","bs","buffer","str","replace","length","String","fromCharCode","indexOf","fromData","data","Blob","Promise","resolve","reject","fileReader","FileReader","onloadend","result","string","format","onerror","event","readAsDataURL","ArrayBuffer","Uint8Array"],"sourceRoot":"../../../lib","sources":["common/Base64.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -26,20 +26,28 @@ export * from "./validate.js";
|
|
|
26
26
|
export { default as Base64 } from "./Base64.js";
|
|
27
27
|
export { default as ReferenceBase } from "./ReferenceBase.js";
|
|
28
28
|
export function getDataUrlParts(dataUrlString) {
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
if (!mediaType || !base64String) {
|
|
29
|
+
const match = /^data:([^,]*?)(;base64)?,([\s\S]*)$/.exec(dataUrlString);
|
|
30
|
+
if (!match) {
|
|
32
31
|
return {
|
|
33
32
|
base64String: undefined,
|
|
34
33
|
mediaType: undefined
|
|
35
34
|
};
|
|
36
35
|
}
|
|
37
|
-
mediaType =
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
const mediaType = match[1] || undefined;
|
|
37
|
+
let base64String = match[3] ?? '';
|
|
38
|
+
try {
|
|
39
|
+
if (base64String.includes('%')) {
|
|
40
|
+
base64String = decodeURIComponent(base64String);
|
|
41
|
+
}
|
|
42
|
+
if (!match[2]) {
|
|
43
|
+
const binaryString = encodeURIComponent(base64String).replace(/%([0-9A-F]{2})/g, (_, hex) => String.fromCharCode(Number.parseInt(hex, 16)));
|
|
44
|
+
base64String = Base64.btoa(binaryString);
|
|
45
|
+
}
|
|
46
|
+
} catch (_) {
|
|
47
|
+
return {
|
|
48
|
+
base64String: undefined,
|
|
49
|
+
mediaType: undefined
|
|
50
|
+
};
|
|
43
51
|
}
|
|
44
52
|
return {
|
|
45
53
|
base64String,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","Base64","isFunction","isObject","isString","default","ReferenceBase","getDataUrlParts","dataUrlString","
|
|
1
|
+
{"version":3,"names":["Platform","Base64","isFunction","isObject","isString","default","ReferenceBase","getDataUrlParts","dataUrlString","match","exec","base64String","undefined","mediaType","includes","decodeURIComponent","binaryString","encodeURIComponent","replace","_","hex","String","fromCharCode","Number","parseInt","btoa","once","fn","context","onceResult","ranOnce","onceInner","args","apply","isError","value","Object","prototype","toString","call","Error","hasOwnProperty","target","property","stripTrailingSlash","string","endsWith","slice","isIOS","OS","isAndroid","isOther","tryJSONParse","JSON","parse","tryJSONStringify","data","stringify","parseListenerOrObserver","listenerOrObserver","next","bind"],"sourceRoot":"../../../lib","sources":["common/index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,QAAQ,QAAQ,cAAc;AACvC,OAAOC,MAAM,MAAM,aAAU;AAC7B,SAASC,UAAU,EAAEC,QAAQ,EAAEC,QAAQ,QAAQ,eAAY;AAG3D,cAAc,SAAM;AACpB,cAAc,WAAQ;AACtB,cAAc,cAAW;AACzB,cAAc,eAAY;AAE1B,SAASC,OAAO,IAAIJ,MAAM,QAAQ,aAAU;AAC5C,SAASI,OAAO,IAAIC,aAAa,QAAQ,oBAAiB;AAI1D,OAAO,SAASC,eAAeA,CAACC,aAAqB,EAAgB;EACnE,MAAMC,KAAK,GAAG,qCAAqC,CAACC,IAAI,CAACF,aAAa,CAAC;EACvE,IAAI,CAACC,KAAK,EAAE;IACV,OAAO;MAAEE,YAAY,EAAEC,SAAS;MAAEC,SAAS,EAAED;IAAU,CAAC;EAC1D;EAEA,MAAMC,SAAS,GAAGJ,KAAK,CAAC,CAAC,CAAC,IAAIG,SAAS;EACvC,IAAID,YAAY,GAAGF,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;EAEjC,IAAI;IACF,IAAIE,YAAY,CAACG,QAAQ,CAAC,GAAG,CAAC,EAAE;MAC9BH,YAAY,GAAGI,kBAAkB,CAACJ,YAAY,CAAC;IACjD;IACA,IAAI,CAACF,KAAK,CAAC,CAAC,CAAC,EAAE;MACb,MAAMO,YAAY,GAAGC,kBAAkB,CAACN,YAAY,CAAC,CAACO,OAAO,CAC3D,iBAAiB,EACjB,CAACC,CAAC,EAAEC,GAAW,KAAKC,MAAM,CAACC,YAAY,CAACC,MAAM,CAACC,QAAQ,CAACJ,GAAG,EAAE,EAAE,CAAC,CAClE,CAAC;MACDT,YAAY,GAAGV,MAAM,CAACwB,IAAI,CAACT,YAAY,CAAC;IAC1C;EACF,CAAC,CAAC,OAAOG,CAAC,EAAE;IACV,OAAO;MAAER,YAAY,EAAEC,SAAS;MAAEC,SAAS,EAAED;IAAU,CAAC;EAC1D;EAEA,OAAO;IAAED,YAAY;IAAEE;EAAU,CAAC;AACpC;AAEA,OAAO,SAASa,IAAIA,CAClBC,EAAK,EACLC,OAAa,EAC8B;EAC3C,IAAIC,UAAyB;EAC7B,IAAIC,OAAO,GAAG,KAAK;EAEnB,OAAO,SAASC,SAASA,CAAY,GAAGC,IAAmB,EAAiB;IAC1E,IAAI,CAACF,OAAO,EAAE;MACZA,OAAO,GAAG,IAAI;MACdD,UAAU,GAAGF,EAAE,CAACM,KAAK,CAACL,OAAO,IAAI,IAAI,EAAEI,IAAI,CAAC;IAC9C;IAEA,OAAOH,UAAU;EACnB,CAAC;AACH;AAEA,OAAO,SAASK,OAAOA,CAACC,KAAU,EAAkB;EAClD,IAAIC,MAAM,CAACC,SAAS,CAACC,QAAQ,CAACC,IAAI,CAACJ,KAAK,CAAC,KAAK,gBAAgB,EAAE;IAC9D,OAAO,IAAI;EACb;EAEA,OAAOA,KAAK,YAAYK,KAAK;AAC/B;AAEA,OAAO,SAASC,cAAcA,CAACC,MAAc,EAAEC,QAAyB,EAAW;EACjF,OAAOP,MAAM,CAACK,cAAc,CAACF,IAAI,CAACG,MAAM,EAAEC,QAAQ,CAAC;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAACC,MAAW,EAAO;EACnD,IAAI,CAACzC,QAAQ,CAACyC,MAAM,CAAC,EAAE;IACrB,OAAOA,MAAM;EACf;EACA,OAAOA,MAAM,CAACC,QAAQ,CAAC,GAAG,CAAC,GAAGD,MAAM,CAACE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAGF,MAAM;AAC5D;AAEA,OAAO,MAAMG,KAAK,GAAGhD,QAAQ,CAACiD,EAAE,KAAK,KAAK;AAE1C,OAAO,MAAMC,SAAS,GAAGlD,QAAQ,CAACiD,EAAE,KAAK,SAAS;AAElD,OAAO,MAAME,OAAO,GAAGnD,QAAQ,CAACiD,EAAE,KAAK,KAAK,IAAIjD,QAAQ,CAACiD,EAAE,KAAK,SAAS;AAEzE,OAAO,SAASG,YAAYA,CAACP,MAAiC,EAAO;EACnE,IAAI;IACF,OAAOA,MAAM,IAAIQ,IAAI,CAACC,KAAK,CAACT,MAAM,CAAC;EACrC,CAAC,CAAC,OAAO1B,CAAC,EAAE;IACV,OAAO0B,MAAM;EACf;AACF;AAEA,OAAO,SAASU,gBAAgBA,CAACC,IAAS,EAAiB;EACzD,IAAI;IACF,OAAOH,IAAI,CAACI,SAAS,CAACD,IAAI,CAAC;EAC7B,CAAC,CAAC,OAAOrC,CAAC,EAAE;IACV,OAAO,IAAI;EACb;AACF;AAEA,OAAO,SAASuC,uBAAuBA,CACrCC,kBAAsD,EAClC;EACpB,IAAI,CAACzD,UAAU,CAACyD,kBAAkB,CAAC,IAAI,CAACxD,QAAQ,CAACwD,kBAAkB,CAAC,EAAE;IACpE,MAAM,IAAInB,KAAK,CAAC,6EAA6E,CAAC;EAChG;EACA,IAAItC,UAAU,CAACyD,kBAAkB,CAAC,EAAE;IAClC,OAAOA,kBAAkB;EAC3B;EACA,IAAIxD,QAAQ,CAACwD,kBAAkB,CAAC,IAAIzD,UAAU,CAAEyD,kBAAkB,CAAiBC,IAAI,CAAC,EAAE;IACxF,OAAQD,kBAAkB,CAAiBC,IAAI,CAAEC,IAAI,CAACF,kBAAkB,CAAC;EAC3E;EAEA,MAAM,IAAInB,KAAK,CAAC,6EAA6E,CAAC;AAChG","ignoreList":[]}
|
|
@@ -28,11 +28,7 @@ const asyncStorageMemory = {
|
|
|
28
28
|
return Promise.resolve();
|
|
29
29
|
},
|
|
30
30
|
getItem(key) {
|
|
31
|
-
|
|
32
|
-
if (hasValue) {
|
|
33
|
-
return Promise.resolve(memoryStorage.get(key) || null);
|
|
34
|
-
}
|
|
35
|
-
return Promise.resolve(null);
|
|
31
|
+
return Promise.resolve(memoryStorage.get(key) ?? null);
|
|
36
32
|
},
|
|
37
33
|
removeItem(key) {
|
|
38
34
|
memoryStorage.delete(key);
|
|
@@ -57,17 +53,17 @@ export function isMemoryStorage() {
|
|
|
57
53
|
}
|
|
58
54
|
|
|
59
55
|
// Set an item in storage with the React Native Firebase prefix
|
|
60
|
-
export
|
|
61
|
-
return
|
|
56
|
+
export function setItem(key, value) {
|
|
57
|
+
return asyncStorage.setItem(prefix + key, value);
|
|
62
58
|
}
|
|
63
59
|
|
|
64
60
|
// Get an item from storage with the React Native Firebase prefix
|
|
65
|
-
export
|
|
66
|
-
return
|
|
61
|
+
export function getItem(key) {
|
|
62
|
+
return asyncStorage.getItem(prefix + key);
|
|
67
63
|
}
|
|
68
64
|
|
|
69
65
|
// Remove an item from storage with the React Native Firebase prefix
|
|
70
|
-
export
|
|
71
|
-
return
|
|
66
|
+
export function removeItem(key) {
|
|
67
|
+
return asyncStorage.removeItem(prefix + key);
|
|
72
68
|
}
|
|
73
69
|
//# sourceMappingURL=asyncStorage.js.map
|