Skip to content

Add FirestoreClientProvider #6050

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 66 commits into from
Aug 12, 2024
Merged
Show file tree
Hide file tree
Changes from 42 commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
830d631
dbToken Persistence
tom-andersen May 8, 2024
37b97be
Copyright
tom-andersen May 8, 2024
d9cf32e
Remove user from globals cache.
tom-andersen May 14, 2024
88919eb
Merge branch 'master' into tomandersen/dbToken
tom-andersen May 14, 2024
a1ff6d6
Merge branch 'master' into tomandersen/dbToken
tom-andersen May 17, 2024
297d2c4
Fix
tom-andersen May 17, 2024
09def37
Merge branch 'master' into tomandersen/dbToken
tom-andersen May 17, 2024
e80b843
Merge branch 'master' into tomandersen/dbToken
tom-andersen May 22, 2024
cb08356
Fix from review comments
tom-andersen May 27, 2024
f79a0a2
Merge branch 'master' into tomandersen/dbToken
tom-andersen May 27, 2024
686e19c
Rename
tom-andersen Jun 5, 2024
b5f66a0
Merge branch 'master' into tomandersen/dbToken
tom-andersen Jun 5, 2024
be8097f
AbstractStream refactor
tom-andersen Jun 5, 2024
b61a395
AbstractStream refactor
tom-andersen Jun 5, 2024
0d25982
Whitespace
tom-andersen Jun 5, 2024
6d0f288
Merge branch 'tomandersen/dbToken' into tomandersen/streamRefactor
tom-andersen Jun 5, 2024
f2c309f
Merge branch 'master' into tomandersen/dbToken
tom-andersen Jun 11, 2024
906acc5
Merge branch 'tomandersen/dbToken' into tomandersen/streamRefactor
tom-andersen Jun 11, 2024
b9f339a
Merge branch 'master' into tomandersen/dbToken
tom-andersen Jun 12, 2024
c65331b
Merge branch 'tomandersen/dbToken' into tomandersen/streamRefactor
tom-andersen Jun 12, 2024
01f424c
Merge branch 'main' into tomandersen/dbToken
tom-andersen Jun 14, 2024
2c4d4d1
Merge branch 'tomandersen/dbToken' into tomandersen/streamRefactor
tom-andersen Jun 14, 2024
3113171
Refactor ComponentProvider
tom-andersen Jun 14, 2024
a3be1e6
Remove dead code
tom-andersen Jun 17, 2024
c61a40c
Fix
tom-andersen Jun 17, 2024
93fd42f
Merge branch 'tomandersen/streamRefactor' into tomandersen/componentP…
tom-andersen Jun 17, 2024
4808d45
Comments and cleanup
tom-andersen Jun 17, 2024
103f775
Merge remote-tracking branch 'origin/tomandersen/componentProviderRef…
tom-andersen Jun 17, 2024
5d8d687
Merge branch 'main' into tomandersen/dbToken
tom-andersen Jun 17, 2024
0beca8a
Merge branch 'tomandersen/dbToken' into tomandersen/streamRefactor
tom-andersen Jun 17, 2024
22a97f3
Merge branch 'tomandersen/streamRefactor' into tomandersen/componentP…
tom-andersen Jun 17, 2024
b749f5c
Whitespace
tom-andersen Jun 17, 2024
89991ef
Merge remote-tracking branch 'origin/tomandersen/componentProviderRef…
tom-andersen Jun 17, 2024
29b2ef9
gRPC integration test of write handshake
tom-andersen Jun 17, 2024
fbc7ad9
PR feedback
tom-andersen Jun 17, 2024
90db84e
Merge branch 'tomandersen/dbToken' into tomandersen/streamRefactor
tom-andersen Jun 17, 2024
2b09c74
Merge branch 'tomandersen/streamRefactor' into tomandersen/componentP…
tom-andersen Jun 17, 2024
6f48bc3
Merge branch 'tomandersen/componentProviderRefactor' into tomandersen…
tom-andersen Jun 17, 2024
3aff190
Merge branch 'main' into tomandersen/streamRefactor
tom-andersen Jun 18, 2024
2699116
Merge branch 'tomandersen/streamRefactor' into tomandersen/componentP…
tom-andersen Jun 19, 2024
1cbaac1
Merge branch 'tomandersen/componentProviderRefactor' into tomandersen…
tom-andersen Jun 19, 2024
5e3f9f5
FirestoreClientProvider
tom-andersen Jun 19, 2024
7a8b052
Fix
tom-andersen Jun 21, 2024
66676d4
Merge remote-tracking branch 'origin/tomandersen/componentProviderRef…
tom-andersen Jun 21, 2024
ec7c414
Merge branch 'tomandersen/componentProviderRefactor' into tomandersen…
tom-andersen Jun 21, 2024
b797dd5
Merge branch 'tomandersen/handshakeTest' into tomandersen/firestoreCl…
tom-andersen Jun 21, 2024
f44a728
Merge remote-tracking branch 'origin/main' into tomandersen/firestore…
tom-andersen Jul 4, 2024
fae9bc0
Fix after merge
tom-andersen Jul 4, 2024
74bce13
Merge remote-tracking branch 'origin/main' into tomandersen/firestore…
tom-andersen Jul 4, 2024
0783dcd
Whitespace
tom-andersen Jul 4, 2024
63e2ec2
Fix
tom-andersen Jul 4, 2024
f2945bf
Merge remote-tracking branch 'origin/main' into tomandersen/firestore…
tom-andersen Jul 17, 2024
44540c4
Pretty
tom-andersen Jul 17, 2024
272cf53
Fix
tom-andersen Jul 17, 2024
1163a7b
Merge branch 'main' into tomandersen/firestoreClientProvider
tom-andersen Jul 18, 2024
285e6fd
Fixes from code review.
tom-andersen Jul 22, 2024
b1c88e2
Merge branch 'main' into tomandersen/firestoreClientProvider
tom-andersen Jul 22, 2024
f989c0e
Remove dead code.
tom-andersen Jul 22, 2024
0d35529
Fix according to review
tom-andersen Jul 22, 2024
1aa54b3
Add comments
tom-andersen Jul 26, 2024
4ea521e
Merge remote-tracking branch 'origin/main' into tomandersen/firestore…
tom-andersen Jul 26, 2024
0637848
Merge branch 'main' into tomandersen/firestoreClientProvider
tom-andersen Jul 29, 2024
f61fade
Merge branch 'main' into tomandersen/firestoreClientProvider
tom-andersen Jul 30, 2024
00f5a2a
Merge branch 'main' into tomandersen/firestoreClientProvider
tom-andersen Jul 30, 2024
00d6e22
Merge branch 'main' into tomandersen/firestoreClientProvider
tom-andersen Jul 30, 2024
dd7c5e6
Merge branch 'main' into tomandersen/firestoreClientProvider
tom-andersen Aug 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@
import com.google.firebase.FirebaseApp;
import com.google.firebase.firestore.auth.CredentialsProvider;
import com.google.firebase.firestore.auth.User;
import com.google.firebase.firestore.core.ComponentProvider;
import com.google.firebase.firestore.model.DatabaseId;
import com.google.firebase.firestore.util.AsyncQueue;
import com.google.firebase.firestore.util.Function;

/** Gives access to package private methods in integration tests. */
public final class AccessHelper {
Expand All @@ -32,6 +34,7 @@ public static FirebaseFirestore newFirebaseFirestore(
CredentialsProvider<User> authProvider,
CredentialsProvider<String> appCheckProvider,
AsyncQueue asyncQueue,
Function<FirebaseFirestoreSettings, ComponentProvider> componentProviderFactory,
FirebaseApp firebaseApp,
FirebaseFirestore.InstanceRegistry instanceRegistry) {
return new FirebaseFirestore(
Expand All @@ -41,6 +44,7 @@ public static FirebaseFirestore newFirebaseFirestore(
authProvider,
appCheckProvider,
asyncQueue,
componentProviderFactory,
firebaseApp,
instanceRegistry,
null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import com.google.firebase.firestore.FirebaseFirestoreException.Code;
import com.google.firebase.firestore.Query.Direction;
import com.google.firebase.firestore.auth.User;
import com.google.firebase.firestore.core.FirestoreClient;
import com.google.firebase.firestore.model.DatabaseId;
import com.google.firebase.firestore.testutil.EventAccumulator;
import com.google.firebase.firestore.testutil.IntegrationTestUtil;
Expand Down Expand Up @@ -1132,7 +1133,7 @@ public void testAppDeleteLeadsToFirestoreTerminate() {

app.delete();

assertTrue(instance.getClient().isTerminated());
assertTrue(instance.callClient(FirestoreClient::isTerminated));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -536,12 +536,12 @@ public void testQueriesFireFromCacheWhenOffline() {
assertFalse(querySnapshot.getMetadata().isFromCache());

// offline event with fromCache=true
waitFor(collection.firestore.getClient().disableNetwork());
waitFor(collection.firestore.disableNetwork());
querySnapshot = accum.await();
assertTrue(querySnapshot.getMetadata().isFromCache());

// back online event with fromCache=false
waitFor(collection.firestore.getClient().enableNetwork());
waitFor(collection.firestore.enableNetwork());
querySnapshot = accum.await();
assertFalse(querySnapshot.getMetadata().isFromCache());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ public void testServerTimestampsCanReturnPreviousValueOfDifferentType() {
@Test
public void testServerTimestampsCanRetainPreviousValueThroughConsecutiveUpdates() {
writeInitialData();
waitFor(docRef.getFirestore().getClient().disableNetwork());
waitFor(docRef.getFirestore().disableNetwork());
accumulator.awaitRemoteEvent();

docRef.update("a", FieldValue.serverTimestamp());
Expand All @@ -226,7 +226,7 @@ public void testServerTimestampsCanRetainPreviousValueThroughConsecutiveUpdates(
localSnapshot = accumulator.awaitLocalEvent();
assertEquals(42L, localSnapshot.get("a", ServerTimestampBehavior.PREVIOUS));

waitFor(docRef.getFirestore().getClient().enableNetwork());
waitFor(docRef.getFirestore().enableNetwork());

DocumentSnapshot remoteSnapshot = accumulator.awaitRemoteEvent();
assertThat(remoteSnapshot.get("a")).isInstanceOf(Timestamp.class);
Expand All @@ -235,7 +235,7 @@ public void testServerTimestampsCanRetainPreviousValueThroughConsecutiveUpdates(
@Test
public void testServerTimestampsUsesPreviousValueFromLocalMutation() {
writeInitialData();
waitFor(docRef.getFirestore().getClient().disableNetwork());
waitFor(docRef.getFirestore().disableNetwork());
accumulator.awaitRemoteEvent();

docRef.update("a", FieldValue.serverTimestamp());
Expand All @@ -249,7 +249,7 @@ public void testServerTimestampsUsesPreviousValueFromLocalMutation() {
localSnapshot = accumulator.awaitLocalEvent();
assertEquals(1337L, localSnapshot.get("a", ServerTimestampBehavior.PREVIOUS));

waitFor(docRef.getFirestore().getClient().enableNetwork());
waitFor(docRef.getFirestore().enableNetwork());

DocumentSnapshot remoteSnapshot = accumulator.awaitRemoteEvent();
assertThat(remoteSnapshot.get("a")).isInstanceOf(Timestamp.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@ public void queriesCannotBeSortedByAnUncommittedServerTimestamp() {
CollectionReference collection = testCollection();

// Ensure the server timestamp stays uncommitted for the first half of the test
waitFor(collection.firestore.getClient().disableNetwork());
waitFor(collection.firestore.disableNetwork());

TaskCompletionSource<Void> offlineCallbackDone = new TaskCompletionSource<>();
TaskCompletionSource<Void> onlineCallbackDone = new TaskCompletionSource<>();
Expand Down Expand Up @@ -497,7 +497,7 @@ public void queriesCannotBeSortedByAnUncommittedServerTimestamp() {
document.set(map("timestamp", FieldValue.serverTimestamp()));
waitFor(offlineCallbackDone.getTask());

waitFor(collection.firestore.getClient().enableNetwork());
waitFor(collection.firestore.enableNetwork());
waitFor(onlineCallbackDone.getTask());

listenerRegistration.remove();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.firebase.database.collection.ImmutableSortedSet;
import com.google.firebase.firestore.auth.User;
import com.google.firebase.firestore.core.DatabaseInfo;
import com.google.firebase.firestore.core.OnlineState;
import com.google.firebase.firestore.local.LocalStore;
import com.google.firebase.firestore.local.MemoryPersistence;
Expand All @@ -40,14 +41,8 @@ public class RemoteStoreTest {
@Test
public void testRemoteStoreStreamStopsWhenNetworkUnreachable() {
AsyncQueue testQueue = new AsyncQueue();
Datastore datastore =
new Datastore(
IntegrationTestUtil.testEnvDatabaseInfo(),
testQueue,
null,
null,
ApplicationProvider.getApplicationContext(),
null);
RemoteSerializer serializer = new RemoteSerializer(IntegrationTestUtil.testEnvDatabaseId());
Datastore datastore = new Datastore(testQueue, serializer, null);
Semaphore networkChangeSemaphore = new Semaphore(0);
RemoteStore.RemoteStoreCallback callback =
new RemoteStore.RemoteStoreCallback() {
Expand Down Expand Up @@ -75,12 +70,11 @@ public ImmutableSortedSet<DocumentKey> getRemoteKeysForTarget(int targetId) {
};

FakeConnectivityMonitor connectivityMonitor = new FakeConnectivityMonitor();
QueryEngine queryEngine = new QueryEngine();
Persistence persistence = MemoryPersistence.createEagerGcMemoryPersistence();
persistence.start();
LocalStore localStore = new LocalStore(persistence, queryEngine, User.UNAUTHENTICATED);
LocalStore localStore = new LocalStore(persistence, new QueryEngine(), User.UNAUTHENTICATED);
RemoteStore remoteStore =
new RemoteStore(callback, localStore, datastore, testQueue, connectivityMonitor);
new RemoteStore(IntegrationTestUtil.testEnvDatabaseId(), callback, localStore, datastore, testQueue, connectivityMonitor);

waitFor(testQueue.enqueue(remoteStore::forceEnableNetwork));
drain(testQueue);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,11 @@
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import androidx.annotation.NonNull;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.gms.tasks.Task;
import com.google.firebase.firestore.core.DatabaseInfo;
import com.google.firebase.firestore.model.SnapshotVersion;
import com.google.firebase.firestore.model.mutation.Mutation;
import com.google.firebase.firestore.model.mutation.MutationResult;
Expand Down Expand Up @@ -109,14 +111,7 @@ public void onWriteResponse(
/** Creates a WriteStream and gets it in a state that accepts mutations. */
private WriteStream createAndOpenWriteStream(
AsyncQueue testQueue, StreamStatusCallback callback) {
Datastore datastore =
new Datastore(
IntegrationTestUtil.testEnvDatabaseInfo(),
testQueue,
new EmptyCredentialsProvider(),
new EmptyAppCheckTokenProvider(),
ApplicationProvider.getApplicationContext(),
null);
Datastore datastore = createTestDatastore(testQueue, null);
final WriteStream writeStream = datastore.createWriteStream(callback);
waitForWriteStreamOpen(testQueue, writeStream, callback);
return writeStream;
Expand All @@ -131,18 +126,25 @@ private void waitForWriteStreamOpen(
waitFor(callback.handshakeSemaphore);
}

@NonNull
private static Datastore createTestDatastore(AsyncQueue testQueue, GrpcMetadataProvider metadataProvider) {
DatabaseInfo databaseInfo = IntegrationTestUtil.testEnvDatabaseInfo();
RemoteSerializer remoteSerializer = new RemoteSerializer(databaseInfo.getDatabaseId());
FirestoreChannel firestoreChannel = new FirestoreChannel(
testQueue,
ApplicationProvider.getApplicationContext(),
new EmptyCredentialsProvider(),
new EmptyAppCheckTokenProvider(),
databaseInfo,
metadataProvider);
return new Datastore(testQueue, remoteSerializer, firestoreChannel);
}

@Test
public void testWatchStreamStopBeforeHandshake() throws Exception {
AsyncQueue testQueue = new AsyncQueue();
GrpcMetadataProvider mockGrpcProvider = mock(GrpcMetadataProvider.class);
Datastore datastore =
new Datastore(
IntegrationTestUtil.testEnvDatabaseInfo(),
testQueue,
new EmptyCredentialsProvider(),
new EmptyAppCheckTokenProvider(),
ApplicationProvider.getApplicationContext(),
mockGrpcProvider);
Datastore datastore = createTestDatastore(testQueue, mockGrpcProvider);
StreamStatusCallback streamCallback = new StreamStatusCallback() {};
final WatchStream watchStream = datastore.createWatchStream(streamCallback);

Expand All @@ -158,14 +160,7 @@ public void testWatchStreamStopBeforeHandshake() throws Exception {
@Test
public void testWriteStreamStopAfterHandshake() throws Exception {
AsyncQueue testQueue = new AsyncQueue();
Datastore datastore =
new Datastore(
IntegrationTestUtil.testEnvDatabaseInfo(),
testQueue,
new EmptyCredentialsProvider(),
new EmptyAppCheckTokenProvider(),
ApplicationProvider.getApplicationContext(),
null);
Datastore datastore = createTestDatastore(testQueue, null);
final WriteStream[] writeStreamWrapper = new WriteStream[1];
StreamStatusCallback streamCallback =
new StreamStatusCallback() {
Expand Down Expand Up @@ -206,14 +201,7 @@ public void onWriteResponse(
@Test
public void testWriteStreamStopPartial() throws Exception {
AsyncQueue testQueue = new AsyncQueue();
Datastore datastore =
new Datastore(
IntegrationTestUtil.testEnvDatabaseInfo(),
testQueue,
new EmptyCredentialsProvider(),
new EmptyAppCheckTokenProvider(),
ApplicationProvider.getApplicationContext(),
null);
Datastore datastore = createTestDatastore(testQueue, null);
StreamStatusCallback streamCallback = new StreamStatusCallback() {};
final WriteStream writeStream = datastore.createWriteStream(streamCallback);

Expand Down Expand Up @@ -287,14 +275,7 @@ public void testStreamStaysIdle() throws Exception {
public void testStreamRefreshesTokenUponExpiration() throws Exception {
AsyncQueue testQueue = new AsyncQueue();
MockCredentialsProvider mockCredentialsProvider = new MockCredentialsProvider();
Datastore datastore =
new Datastore(
IntegrationTestUtil.testEnvDatabaseInfo(),
testQueue,
mockCredentialsProvider,
new EmptyAppCheckTokenProvider(),
ApplicationProvider.getApplicationContext(),
null);
Datastore datastore = createTestDatastore(testQueue, null);
StreamStatusCallback callback = new StreamStatusCallback();
WriteStream writeStream = datastore.createWriteStream(callback);
waitForWriteStreamOpen(testQueue, writeStream, callback);
Expand All @@ -317,14 +298,7 @@ public void testStreamRefreshesTokenUponExpiration() throws Exception {
public void testTokenIsNotInvalidatedOnceStreamIsHealthy() throws Exception {
AsyncQueue testQueue = new AsyncQueue();
MockCredentialsProvider mockCredentialsProvider = new MockCredentialsProvider();
Datastore datastore =
new Datastore(
IntegrationTestUtil.testEnvDatabaseInfo(),
testQueue,
mockCredentialsProvider,
new EmptyAppCheckTokenProvider(),
ApplicationProvider.getApplicationContext(),
null);
Datastore datastore = createTestDatastore(testQueue, null);
StreamStatusCallback callback = new StreamStatusCallback();
WriteStream writeStream = datastore.createWriteStream(callback);
waitForWriteStreamOpen(testQueue, writeStream, callback);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

import android.content.Context;
import android.os.StrictMode;

import androidx.annotation.NonNull;
import androidx.test.core.app.ApplicationProvider;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.tasks.TaskCompletionSource;
Expand All @@ -42,6 +44,7 @@
import com.google.firebase.firestore.Source;
import com.google.firebase.firestore.WriteBatch;
import com.google.firebase.firestore.auth.User;
import com.google.firebase.firestore.core.ComponentProvider;
import com.google.firebase.firestore.core.DatabaseInfo;
import com.google.firebase.firestore.model.DatabaseId;
import com.google.firebase.firestore.testutil.provider.FirestoreProvider;
Expand Down Expand Up @@ -170,14 +173,20 @@ public static TargetBackend getTargetBackend() {
}
}

@NonNull
public static DatabaseInfo testEnvDatabaseInfo() {
return new DatabaseInfo(
DatabaseId.forProject(provider.projectId()),
testEnvDatabaseId(),
"test-persistenceKey",
getFirestoreHost(),
getSslEnabled());
}

@NonNull
public static DatabaseId testEnvDatabaseId() {
return DatabaseId.forProject(provider.projectId());
}

public static FirebaseFirestoreSettings newTestSettings() {
Logger.debug("IntegrationTestUtil", "target backend is: %s", backend.name());
FirebaseFirestoreSettings.Builder settings = new FirebaseFirestoreSettings.Builder();
Expand Down Expand Up @@ -315,6 +324,7 @@ public static FirebaseFirestore testFirestore(
MockCredentialsProvider.instance(),
new EmptyAppCheckTokenProvider(),
asyncQueue,
ComponentProvider::defaultFactory,
/*firebaseApp=*/ null,
/*instanceRegistry=*/ (dbId) -> {});
waitFor(firestore.clearPersistence());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,7 @@ public List<AggregateField> getAggregateFields() {
public Task<AggregateQuerySnapshot> get(@NonNull AggregateSource source) {
Preconditions.checkNotNull(source, "AggregateSource must not be null");
TaskCompletionSource<AggregateQuerySnapshot> tcs = new TaskCompletionSource<>();
query
.firestore
.getClient()
.runAggregateQuery(query.query, aggregateFieldList)
query.firestore.callClient(client -> client.runAggregateQuery(query.query, aggregateFieldList))
.continueWith(
Executors.DIRECT_EXECUTOR,
(task) -> {
Expand Down
Loading
Loading