|
21 | 21 | import static org.junit.Assert.assertTrue;
|
22 | 22 | import static org.junit.Assert.fail;
|
23 | 23 |
|
| 24 | +import androidx.annotation.NonNull; |
24 | 25 | import androidx.test.ext.junit.runners.AndroidJUnit4;
|
| 26 | +import androidx.test.platform.app.InstrumentationRegistry; |
| 27 | +import com.google.android.gms.tasks.Tasks; |
| 28 | +import com.google.firebase.FirebaseApp; |
| 29 | +import com.google.firebase.FirebaseOptions; |
25 | 30 | import com.google.firebase.database.core.DatabaseConfig;
|
26 | 31 | import com.google.firebase.database.core.Path;
|
27 | 32 | import com.google.firebase.database.core.RepoManager;
|
|
31 | 36 | import java.util.Arrays;
|
32 | 37 | import java.util.List;
|
33 | 38 | import java.util.Map;
|
| 39 | +import java.util.UUID; |
34 | 40 | import java.util.concurrent.ExecutionException;
|
35 | 41 | import java.util.concurrent.Semaphore;
|
36 | 42 | import java.util.concurrent.TimeoutException;
|
@@ -3401,6 +3407,144 @@ public void onComplete(DatabaseError error, DatabaseReference ref) {
|
3401 | 3407 | IntegrationTestHelpers.waitFor(semaphore);
|
3402 | 3408 | }
|
3403 | 3409 |
|
| 3410 | + private static FirebaseApp appForDatabaseUrl(String url, String name) { |
| 3411 | + return FirebaseApp.initializeApp( |
| 3412 | + InstrumentationRegistry.getInstrumentation().getTargetContext(), |
| 3413 | + new FirebaseOptions.Builder() |
| 3414 | + .setApplicationId("appid") |
| 3415 | + .setApiKey("apikey") |
| 3416 | + .setDatabaseUrl(url) |
| 3417 | + .build(), |
| 3418 | + name); |
| 3419 | + } |
| 3420 | + |
| 3421 | + @Test |
| 3422 | + public void emptyQueryGet() throws DatabaseException, InterruptedException, ExecutionException { |
| 3423 | + FirebaseApp app = |
| 3424 | + appForDatabaseUrl(IntegrationTestValues.getNamespace(), UUID.randomUUID().toString()); |
| 3425 | + FirebaseDatabase db = FirebaseDatabase.getInstance(app); |
| 3426 | + assertNull(Tasks.await(db.getReference(UUID.randomUUID().toString()).get()).getValue()); |
| 3427 | + } |
| 3428 | + |
| 3429 | + @Test |
| 3430 | + public void offlineQueryGet() throws DatabaseException, InterruptedException { |
| 3431 | + FirebaseApp app = |
| 3432 | + appForDatabaseUrl(IntegrationTestValues.getNamespace(), UUID.randomUUID().toString()); |
| 3433 | + FirebaseDatabase db = FirebaseDatabase.getInstance(app); |
| 3434 | + DatabaseReference node = db.getReference(); |
| 3435 | + db.goOffline(); |
| 3436 | + try { |
| 3437 | + Tasks.await(node.get()); |
| 3438 | + } catch (ExecutionException e) { |
| 3439 | + assertEquals(e.getCause().getMessage(), "Client is offline"); |
| 3440 | + return; |
| 3441 | + } |
| 3442 | + fail("Client get succeeded even though offline."); |
| 3443 | + } |
| 3444 | + |
| 3445 | + @Test |
| 3446 | + public void getQueryBasic() throws DatabaseException, InterruptedException, ExecutionException { |
| 3447 | + FirebaseApp app = |
| 3448 | + appForDatabaseUrl(IntegrationTestValues.getNamespace(), UUID.randomUUID().toString()); |
| 3449 | + FirebaseDatabase db = FirebaseDatabase.getInstance(app); |
| 3450 | + DatabaseReference node = db.getReference(); |
| 3451 | + Tasks.await(node.setValue(42)); |
| 3452 | + assertEquals(42L, Tasks.await(node.get()).getValue()); |
| 3453 | + } |
| 3454 | + |
| 3455 | + @Test |
| 3456 | + public void getQueryCached() |
| 3457 | + throws DatabaseException, InterruptedException, TimeoutException, TestFailure, |
| 3458 | + ExecutionException { |
| 3459 | + FirebaseApp app = |
| 3460 | + appForDatabaseUrl(IntegrationTestValues.getAltNamespace(), UUID.randomUUID().toString()); |
| 3461 | + FirebaseDatabase db = FirebaseDatabase.getInstance(app); |
| 3462 | + DatabaseReference ref = db.getReference(); |
| 3463 | + final Semaphore semaphore = new Semaphore(0); |
| 3464 | + ValueEventListener listener = |
| 3465 | + new ValueEventListener() { |
| 3466 | + @Override |
| 3467 | + public void onDataChange(@NonNull DataSnapshot snapshot) { |
| 3468 | + if (snapshot.getValue() != null && snapshot.getValue().equals(42L)) { |
| 3469 | + semaphore.release(); |
| 3470 | + } |
| 3471 | + } |
| 3472 | + |
| 3473 | + @Override |
| 3474 | + public void onCancelled(@NonNull DatabaseError error) {} |
| 3475 | + }; |
| 3476 | + ref.addValueEventListener(listener); |
| 3477 | + ref.setValue(42L); |
| 3478 | + IntegrationTestHelpers.waitFor(semaphore); |
| 3479 | + db.goOffline(); |
| 3480 | + try { |
| 3481 | + // Since we still have a listener on `ref`, the 42L should be cached here. |
| 3482 | + assertEquals(42L, Tasks.await(ref.get()).getValue()); |
| 3483 | + } finally { |
| 3484 | + ref.removeEventListener(listener); |
| 3485 | + } |
| 3486 | + } |
| 3487 | + |
| 3488 | + @Test |
| 3489 | + public void getRetrievesLatestServerValue() |
| 3490 | + throws DatabaseException, InterruptedException, ExecutionException, TestFailure, |
| 3491 | + TimeoutException { |
| 3492 | + FirebaseApp readerApp = |
| 3493 | + appForDatabaseUrl(IntegrationTestValues.getNamespace(), UUID.randomUUID().toString()); |
| 3494 | + FirebaseApp writerApp = |
| 3495 | + appForDatabaseUrl(IntegrationTestValues.getNamespace(), UUID.randomUUID().toString()); |
| 3496 | + FirebaseDatabase readerDb = FirebaseDatabase.getInstance(readerApp); |
| 3497 | + FirebaseDatabase writerDb = FirebaseDatabase.getInstance(writerApp); |
| 3498 | + DatabaseReference reader = readerDb.getReference(); |
| 3499 | + DatabaseReference writer = writerDb.getReference(); |
| 3500 | + |
| 3501 | + final Semaphore readerSemaphore = new Semaphore(0); |
| 3502 | + reader.addValueEventListener( |
| 3503 | + new ValueEventListener() { |
| 3504 | + @Override |
| 3505 | + public void onDataChange(@NonNull DataSnapshot snapshot) { |
| 3506 | + if (snapshot.getValue() != null && snapshot.getValue().equals(42L)) { |
| 3507 | + readerSemaphore.release(); |
| 3508 | + } |
| 3509 | + } |
| 3510 | + |
| 3511 | + @Override |
| 3512 | + public void onCancelled(@NonNull DatabaseError error) {} |
| 3513 | + }); |
| 3514 | + |
| 3515 | + WriteFuture write = new WriteFuture(writer, 42L); |
| 3516 | + assertNull(write.timedGet()); |
| 3517 | + IntegrationTestHelpers.waitFor(readerSemaphore); |
| 3518 | + |
| 3519 | + write = new WriteFuture(writer, 43L); |
| 3520 | + assertNull(write.timedGet()); |
| 3521 | + |
| 3522 | + assertEquals(43L, Tasks.await(reader.get()).getValue()); |
| 3523 | + } |
| 3524 | + |
| 3525 | + @Test |
| 3526 | + public void getUpdatesPersistenceCacheWhenEnabled() |
| 3527 | + throws DatabaseException, InterruptedException, ExecutionException, TestFailure, |
| 3528 | + TimeoutException { |
| 3529 | + FirebaseApp readerApp = |
| 3530 | + appForDatabaseUrl(IntegrationTestValues.getNamespace(), UUID.randomUUID().toString()); |
| 3531 | + FirebaseApp writerApp = |
| 3532 | + appForDatabaseUrl(IntegrationTestValues.getNamespace(), UUID.randomUUID().toString()); |
| 3533 | + FirebaseDatabase readerDb = FirebaseDatabase.getInstance(readerApp); |
| 3534 | + readerDb.setPersistenceEnabled(true); |
| 3535 | + FirebaseDatabase writerDb = FirebaseDatabase.getInstance(writerApp); |
| 3536 | + DatabaseReference reader = readerDb.getReference(); |
| 3537 | + DatabaseReference writer = writerDb.getReference(); |
| 3538 | + |
| 3539 | + assertNull(new WriteFuture(writer, 42L).timedGet()); |
| 3540 | + assertEquals(42L, Tasks.await(reader.get()).getValue()); |
| 3541 | + |
| 3542 | + readerDb.goOffline(); |
| 3543 | + |
| 3544 | + Semaphore semaphore = new Semaphore(0); |
| 3545 | + assertNotNull(ReadFuture.untilEquals(reader, 42L).timedGet()); |
| 3546 | + } |
| 3547 | + |
3404 | 3548 | @Test
|
3405 | 3549 | public void querySnapshotChildrenRespectDefaultOrdering()
|
3406 | 3550 | throws DatabaseException, ExecutionException, TimeoutException, TestFailure,
|
|
0 commit comments