@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.
Files changed (79) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/RNFBApp.podspec +1 -1
  3. package/android/src/main/java/io/invertase/firebase/common/RNFBHandleCollisionException.java +31 -0
  4. package/android/src/main/java/io/invertase/firebase/common/RNFBHandleMap.java +150 -0
  5. package/android/src/main/java/io/invertase/firebase/common/TaskExecutorService.java +27 -3
  6. package/android/src/reactnative/java/io/invertase/firebase/app/NativeRNFBTurboApp.java +3 -1
  7. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseVersion.java +1 -1
  8. package/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.java +3 -2
  9. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseJSON.java +5 -3
  10. package/android/src/test/java/io/invertase/firebase/app/NativeRNFBTurboAppTest.java +26 -1
  11. package/android/src/test/java/io/invertase/firebase/common/RNFBHandleMapTest.java +275 -0
  12. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitterTest.java +1 -1
  13. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseJSONTest.java +108 -0
  14. package/android/src/test/java/io/invertase/firebase/common/TaskExecutorServiceTest.java +97 -0
  15. package/android/src/test/java/io/invertase/firebase/utils/NativeRNFBTurboUtilsTest.java +0 -2
  16. package/dist/module/common/Base64.js +13 -21
  17. package/dist/module/common/Base64.js.map +1 -1
  18. package/dist/module/common/index.js +17 -9
  19. package/dist/module/common/index.js.map +1 -1
  20. package/dist/module/internal/asyncStorage.js +7 -11
  21. package/dist/module/internal/asyncStorage.js.map +1 -1
  22. package/dist/module/internal/logger.js +44 -40
  23. package/dist/module/internal/logger.js.map +1 -1
  24. package/dist/module/internal/nativeModuleAndroidIos.js +2 -29
  25. package/dist/module/internal/nativeModuleAndroidIos.js.map +1 -1
  26. package/dist/module/internal/nativeModuleDebug.js +74 -0
  27. package/dist/module/internal/nativeModuleDebug.js.map +1 -0
  28. package/dist/module/internal/nativeModuleWeb.js +9 -29
  29. package/dist/module/internal/nativeModuleWeb.js.map +1 -1
  30. package/dist/module/internal/registry/app.js +1 -1
  31. package/dist/module/internal/registry/app.js.map +1 -1
  32. package/dist/module/internal/registry/modular.js +2 -2
  33. package/dist/module/internal/registry/modular.js.map +1 -1
  34. package/dist/module/internal/registry/nativeModule.js +3 -3
  35. package/dist/module/internal/registry/nativeModule.js.map +1 -1
  36. package/dist/module/internal/web/RNFBAppModule.js +16 -15
  37. package/dist/module/internal/web/RNFBAppModule.js.map +1 -1
  38. package/dist/module/internal/web/memidb/lib/FakeEventTarget.js +3 -1
  39. package/dist/module/internal/web/memidb/lib/FakeEventTarget.js.map +1 -1
  40. package/dist/module/version.js +1 -1
  41. package/dist/typescript/lib/common/Base64.d.ts.map +1 -1
  42. package/dist/typescript/lib/common/index.d.ts.map +1 -1
  43. package/dist/typescript/lib/internal/asyncStorage.d.ts.map +1 -1
  44. package/dist/typescript/lib/internal/logger.d.ts.map +1 -1
  45. package/dist/typescript/lib/internal/nativeModuleAndroidIos.d.ts.map +1 -1
  46. package/dist/typescript/lib/internal/nativeModuleDebug.d.ts +2 -0
  47. package/dist/typescript/lib/internal/nativeModuleDebug.d.ts.map +1 -0
  48. package/dist/typescript/lib/internal/nativeModuleWeb.d.ts.map +1 -1
  49. package/dist/typescript/lib/internal/web/RNFBAppModule.d.ts +7 -7
  50. package/dist/typescript/lib/internal/web/RNFBAppModule.d.ts.map +1 -1
  51. package/dist/typescript/lib/version.d.ts +1 -1
  52. package/firebase-schema.json +1 -1
  53. package/firebase_spm.rb +240 -95
  54. package/ios/RNFBApp/RNFBAppModule.mm +42 -16
  55. package/ios/RNFBApp/RNFBHandleMap.h +73 -0
  56. package/ios/RNFBApp/RNFBHandleMap.m +116 -0
  57. package/ios/RNFBApp/RNFBSharedUtils.m +3 -2
  58. package/ios/RNFBApp/RNFBUtilsModule.mm +2 -3
  59. package/ios/RNFBApp/RNFBVersion.m +1 -1
  60. package/ios/RNFBApp.xcodeproj/project.pbxproj +6 -0
  61. package/ios/RNFBAppUnitTests/RNFBAppUnitTests.xcodeproj/project.pbxproj +237 -0
  62. package/ios/RNFBAppUnitTests/RNFBAppUnitTests.xcodeproj/xcshareddata/xcschemes/RNFBAppUnitTests.xcscheme +69 -0
  63. package/ios/RNFBAppUnitTests/RNFBHandleMapTests.m +238 -0
  64. package/lib/common/Base64.ts +10 -16
  65. package/lib/common/index.ts +20 -9
  66. package/lib/internal/asyncStorage.ts +7 -11
  67. package/lib/internal/logger.ts +53 -43
  68. package/lib/internal/nativeModuleAndroidIos.ts +2 -40
  69. package/lib/internal/nativeModuleDebug.ts +97 -0
  70. package/lib/internal/nativeModuleWeb.ts +10 -40
  71. package/lib/internal/registry/app.ts +1 -1
  72. package/lib/internal/registry/modular.ts +2 -2
  73. package/lib/internal/registry/nativeModule.ts +3 -3
  74. package/lib/internal/web/RNFBAppModule.ts +16 -15
  75. package/lib/internal/web/memidb/lib/FakeEventTarget.js +3 -1
  76. package/lib/version.ts +1 -1
  77. package/package.json +3 -2
  78. package/plugin/build/ios/appDelegate.js +18 -8
  79. 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
+ }
@@ -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(sdk = 34, application = ReactNativeFirebaseEventEmitterTest.HostApplication.class)
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
- const fileReader = new FileReader();
67
- const {
68
- resolve,
69
- reject,
70
- promise
71
- } = promiseDefer();
72
- fileReader.readAsDataURL(data);
73
- fileReader.onloadend = () => {
74
- if (fileReader?.result) {
75
- resolve?.({
76
- string: fileReader.result,
77
- format: 'data_url'
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","promiseDefer","CHARS","btoa","input","map","i","block","output","charAt","charCode","charCodeAt","Error","atob","bc","bs","buffer","str","replace","length","String","fromCharCode","indexOf","fromData","data","Blob","fileReader","FileReader","resolve","reject","promise","readAsDataURL","onloadend","result","string","format","onerror","event","abort","ArrayBuffer","Uint8Array","Promise"],"sourceRoot":"../../../lib","sources":["common/Base64.ts"],"mappings":"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","ignoreList":[]}
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 isBase64 = dataUrlString.includes(';base64');
30
- let [mediaType, base64String] = dataUrlString.split(',');
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 = mediaType.replace('data:', '').replace(';base64', '');
38
- if (base64String && base64String.includes('%')) {
39
- base64String = decodeURIComponent(base64String);
40
- }
41
- if (!isBase64) {
42
- base64String = Base64.btoa(base64String);
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","isBase64","includes","mediaType","base64String","split","undefined","replace","decodeURIComponent","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":"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","ignoreList":[]}
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":"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","ignoreList":[]}
@@ -28,11 +28,7 @@ const asyncStorageMemory = {
28
28
  return Promise.resolve();
29
29
  },
30
30
  getItem(key) {
31
- const hasValue = memoryStorage.has(key);
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 async function setItem(key, value) {
61
- return await asyncStorage.setItem(prefix + key, value);
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 async function getItem(key) {
66
- return await asyncStorage.getItem(prefix + key);
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 async function removeItem(key) {
71
- return await asyncStorage.removeItem(prefix + key);
66
+ export function removeItem(key) {
67
+ return asyncStorage.removeItem(prefix + key);
72
68
  }
73
69
  //# sourceMappingURL=asyncStorage.js.map