From 9ef8a4b981789119e6973d7be3a0f7eb2263d6c4 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 17 Jun 2020 12:02:41 -0400 Subject: [PATCH 01/18] Unified emulator settings for Database --- .../com/google/firebase/FirebaseAppTest.java | 80 +++++++++++---- .../java/com/google/firebase/FirebaseApp.java | 35 ++++++- .../emulators/EmulatedServiceSettings.java | 56 +++++++++++ .../firebase/emulators/EmulatorSettings.java | 98 +++++++++++++++++++ .../firebase/emulators/FirebaseEmulators.java | 28 ++++++ .../database/FirebaseDatabaseTest.java | 45 +++++++-- .../firebase/database/FirebaseDatabase.java | 29 +++++- .../database/core/utilities/Utilities.java | 20 +++- .../database/core/utilities/ParseUrlTest.java | 22 ++++- 9 files changed, 374 insertions(+), 39 deletions(-) create mode 100644 firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java create mode 100644 firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java create mode 100644 firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulators.java diff --git a/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java b/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java index bf913d0254b..8bdc779c414 100644 --- a/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java +++ b/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java @@ -14,19 +14,6 @@ package com.google.firebase; -import static com.google.android.gms.common.util.Base64Utils.decodeUrlSafeNoPadding; -import static com.google.common.truth.Truth.assertThat; -import static com.google.firebase.common.testutil.Assert.assertThrows; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import android.content.BroadcastReceiver; import android.content.ComponentCallbacks2; import android.content.Context; @@ -34,9 +21,11 @@ import android.content.Intent; import android.content.IntentFilter; import android.os.UserManager; + import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; + import com.google.android.gms.common.api.internal.BackgroundDetector; import com.google.common.base.Defaults; import com.google.firebase.auth.FirebaseAuth; @@ -45,8 +34,18 @@ import com.google.firebase.components.TestComponentOne; import com.google.firebase.components.TestComponentTwo; import com.google.firebase.components.TestUserAgentDependentComponent; +import com.google.firebase.emulators.EmulatedServiceSettings; +import com.google.firebase.emulators.EmulatorSettings; +import com.google.firebase.emulators.FirebaseEmulators; import com.google.firebase.platforminfo.UserAgentPublisher; import com.google.firebase.testing.FirebaseAppRule; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.stubbing.Answer; + import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -56,11 +55,19 @@ import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.stubbing.Answer; + +import static com.google.android.gms.common.util.Base64Utils.decodeUrlSafeNoPadding; +import static com.google.common.truth.Truth.assertThat; +import static com.google.firebase.common.testutil.Assert.assertThrows; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; /** Unit tests for {@link com.google.firebase.FirebaseApp}. */ // TODO(arondeak): uncomment lines when Firebase API targets are in integ. @@ -417,6 +424,43 @@ public void testDirectBoot_shouldPreserveDataCollectionAfterUnlock() { assertTrue(firebaseApp.isDataCollectionDefaultEnabled()); } + @Test + public void testEnableEmulators_shouldAllowDoubleSetBeforeAccess() { + Context mockContext = createForwardingMockContext(); + FirebaseApp firebaseApp = FirebaseApp.initializeApp(mockContext); + + EmulatedServiceSettings databaseSettings = + new EmulatedServiceSettings.Builder("10.0.2.2", 9000).build(); + EmulatorSettings emulatorSettings = + new EmulatorSettings.Builder() + .addEmulatedService(FirebaseEmulators.DATABASE, databaseSettings) + .build(); + + // Set twice + firebaseApp.enableEmulators(emulatorSettings); + firebaseApp.enableEmulators(emulatorSettings); + } + + @Test + public void testEnableEmulators_shouldThrowIfSetAfterAccess() { + Context mockContext = createForwardingMockContext(); + FirebaseApp firebaseApp = FirebaseApp.initializeApp(mockContext); + + EmulatedServiceSettings databaseSettings = + new EmulatedServiceSettings.Builder("10.0.2.2", 9000).build(); + EmulatorSettings emulatorSettings = + new EmulatorSettings.Builder() + .addEmulatedService(FirebaseEmulators.DATABASE, databaseSettings) + .build(); + firebaseApp.enableEmulators(emulatorSettings); + + // Access (as if from the Database SDK) + firebaseApp.getEmulatorSettings().getServiceSettings(FirebaseEmulators.DATABASE); + + // Try to set again + assertThrows(IllegalStateException.class, () -> firebaseApp.enableEmulators(emulatorSettings)); + } + /** Returns mock context that forwards calls to targetContext and localBroadcastManager. */ private Context createForwardingMockContext() { final UserManager spyUserManager = spy(targetContext.getSystemService(UserManager.class)); diff --git a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java index 00c4bdb5b28..daef3e17803 100644 --- a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java +++ b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java @@ -14,8 +14,6 @@ package com.google.firebase; -import static com.google.android.gms.common.util.Base64Utils.encodeUrlSafeNoPadding; - import android.annotation.TargetApi; import android.app.Application; import android.content.BroadcastReceiver; @@ -27,11 +25,13 @@ import android.os.Looper; import android.text.TextUtils; import android.util.Log; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.collection.ArrayMap; import androidx.core.os.UserManagerCompat; + import com.google.android.gms.common.annotation.KeepForSdk; import com.google.android.gms.common.api.internal.BackgroundDetector; import com.google.android.gms.common.internal.Objects; @@ -44,12 +44,14 @@ import com.google.firebase.components.ComponentRegistrar; import com.google.firebase.components.ComponentRuntime; import com.google.firebase.components.Lazy; +import com.google.firebase.emulators.EmulatorSettings; import com.google.firebase.events.Publisher; import com.google.firebase.heartbeatinfo.DefaultHeartBeatInfo; import com.google.firebase.internal.DataCollectionConfigStorage; import com.google.firebase.platforminfo.DefaultUserAgentPublisher; import com.google.firebase.platforminfo.KotlinDetector; import com.google.firebase.platforminfo.LibraryVersionComponent; + import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collections; @@ -59,8 +61,11 @@ import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; + import javax.annotation.concurrent.GuardedBy; +import static com.google.android.gms.common.util.Base64Utils.encodeUrlSafeNoPadding; + /** * The entry point of Firebase SDKs. It holds common configuration and state for Firebase APIs. Most * applications don't need to directly interact with FirebaseApp. @@ -109,6 +114,7 @@ public class FirebaseApp { private final String name; private final FirebaseOptions options; private final ComponentRuntime componentRuntime; + private EmulatorSettings emulatorSettings; // Default disabled. We released Firebase publicly without this feature, so making it default // enabled is a backwards incompatible change. @@ -142,6 +148,13 @@ public FirebaseOptions getOptions() { return options; } + /** Returns the specified {@link EmulatorSettings}. */ + @Nullable + public EmulatorSettings getEmulatorSettings() { + checkNotDeleted(); + return emulatorSettings; + } + @Override public boolean equals(Object o) { if (!(o instanceof FirebaseApp)) { @@ -305,6 +318,24 @@ public static FirebaseApp initializeApp( return firebaseApp; } + /** + * Specify which services should access local emulators for this FirebaseApp instance. + * + *

For example, if the {@link EmulatorSettings} contain {@link + * com.google.firebase.emulators.EmulatedServiceSettings} for {@link + * com.google.firebase.emulators.FirebaseEmulators#FIRESTORE}, then calls to Cloud Firestore will + * communicate with the emulator rather than production. + * + * @param emulatorSettings the emulator settings for all services. + */ + public void enableEmulators(@NonNull EmulatorSettings emulatorSettings) { + checkNotDeleted(); + Preconditions.checkState( + !(this.emulatorSettings != null && this.emulatorSettings.isAccessed()), + "Cannot enable emulators after Firebase SDKs have already been used."); + this.emulatorSettings = emulatorSettings; + } + /** * Deletes the {@link FirebaseApp} and all its data. All calls to this {@link FirebaseApp} * instance will throw once it has been called. diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java new file mode 100644 index 00000000000..1ff68fff306 --- /dev/null +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java @@ -0,0 +1,56 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.firebase.emulators; + +import androidx.annotation.NonNull; + +/** + * Settings to connect a single Firebase service to a local emulator. + * + * @see EmulatorSettings + */ +public class EmulatedServiceSettings { + + public static final class Builder { + + private final String host; + private final int port; + + /** + * Create a new EmulatedServiceSettings builder. + * + * @param host the host where the local emulator is running. If you want to access 'localhost' + * from an Android Emulator use '10.0.2.2' instead. + * @param port the port where the local emulator is running. + */ + public Builder(@NonNull String host, int port) { + this.host = host; + this.port = port; + } + + @NonNull + public EmulatedServiceSettings build() { + return new EmulatedServiceSettings(this.host, this.port); + } + } + + public final String host; + public final int port; + + private EmulatedServiceSettings(@NonNull String host, int port) { + this.host = host; + this.port = port; + } +} diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java new file mode 100644 index 00000000000..03117fdcdf2 --- /dev/null +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java @@ -0,0 +1,98 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.firebase.emulators; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.google.firebase.components.Preconditions; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Settings that control which Firebase services should access a local emulator, rather than + * production. + * + * @see com.google.firebase.FirebaseApp#enableEmulators(EmulatorSettings) + */ +public class EmulatorSettings { + + public static final class Builder { + + private final Map settingsMap = new HashMap<>(); + + /** Constructs an empty builder. */ + public Builder() {} + + /** + * Specify the emulator settings for a single service. + * + * @param emulator the emulated service. + * @param settings the emulator settings. + * @return the builder, for chaining. + */ + @NonNull + public Builder addEmulatedService( + @NonNull FirebaseEmulators emulator, @NonNull EmulatedServiceSettings settings) { + Preconditions.checkState( + !settingsMap.containsKey(emulator), + "Cannot call addEmulatedService twice for " + emulator.toString()); + this.settingsMap.put(emulator, settings); + return this; + } + + @NonNull + public EmulatorSettings build() { + return new EmulatorSettings(settingsMap); + } + } + + private final AtomicBoolean accessed = new AtomicBoolean(false); + private final Map settingsMap; + + private EmulatorSettings(@NonNull Map settingsMap) { + this.settingsMap = Collections.unmodifiableMap(settingsMap); + } + + /** + * Determine if any Firebase SDK has already accessed the emulator settings. When true, attempting + * to change the settings should throw an error. + * + * @hide + */ + public boolean isAccessed() { + return accessed.get(); + } + + /** + * Fetch the emulation settings for a single Firebase service. Once this method has been called + * {@link #isAccessed()} will return true. + * + * @hide + */ + @Nullable + public EmulatedServiceSettings getServiceSettings(@NonNull FirebaseEmulators emulator) { + accessed.set(true); + + if (settingsMap.containsKey(emulator)) { + return settingsMap.get(emulator); + } + + return null; + } +} diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulators.java b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulators.java new file mode 100644 index 00000000000..53f66a5ed94 --- /dev/null +++ b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulators.java @@ -0,0 +1,28 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.firebase.emulators; + +/** + * Enum for Firebase services that can be emulated using the Firebase Emulator Suite. + * + * @see com.google.firebase.FirebaseApp#enableEmulators(EmulatorSettings) + * @see EmulatorSettings + * @see EmulatedServiceSettings + */ +public enum FirebaseEmulators { + DATABASE, + FIRESTORE, + FUNCTIONS, +} diff --git a/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java b/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java index 121a8a3e93e..7fb534f6485 100644 --- a/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java +++ b/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java @@ -14,14 +14,9 @@ package com.google.firebase.database; -import static com.google.firebase.database.IntegrationTestHelpers.fromSingleQuotedString; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.fail; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; + import com.google.firebase.FirebaseApp; import com.google.firebase.FirebaseOptions; import com.google.firebase.database.core.DatabaseConfig; @@ -30,15 +25,26 @@ import com.google.firebase.database.core.persistence.MockPersistenceStorageEngine; import com.google.firebase.database.core.persistence.PersistenceManager; import com.google.firebase.database.future.WriteFuture; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import com.google.firebase.emulators.EmulatedServiceSettings; +import com.google.firebase.emulators.EmulatorSettings; +import com.google.firebase.emulators.FirebaseEmulators; + import org.junit.After; import org.junit.Assert; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static com.google.firebase.database.IntegrationTestHelpers.fromSingleQuotedString; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.fail; + @org.junit.runner.RunWith(AndroidJUnit4.class) public class FirebaseDatabaseTest { @Rule public RetryRule retryRule = new RetryRule(3); @@ -64,6 +70,27 @@ public void getInstanceForApp() { assertEquals(IntegrationTestValues.getAltNamespace(), db.getReference().toString()); } + @Test + public void getInstanceForAppWithEmulator() { + FirebaseApp app = + appForDatabaseUrl(IntegrationTestValues.getAltNamespace(), "getInstanceForAppWithEmulator"); + + EmulatedServiceSettings serviceSettings = + new EmulatedServiceSettings.Builder("10.0.2.2", 9000).build(); + EmulatorSettings emulatorSettings = + new EmulatorSettings.Builder() + .addEmulatedService(FirebaseEmulators.DATABASE, serviceSettings) + .build(); + app.enableEmulators(emulatorSettings); + + FirebaseDatabase db = FirebaseDatabase.getInstance(app); + DatabaseReference rootRef = db.getReference(); + assertEquals(rootRef.toString(), "http://10.0.2.2:9000"); + + DatabaseReference urlReference = db.getReferenceFromUrl("https://otherns.firebaseio.com"); + assertEquals(urlReference.toString(), "http://10.0.2.2:9000"); + } + @Test public void getInstanceForAppWithUrl() { FirebaseApp app = diff --git a/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java b/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java index d9a79a3d4bb..90e9e25aa96 100644 --- a/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java +++ b/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java @@ -14,12 +14,13 @@ package com.google.firebase.database; -import static com.google.android.gms.common.internal.Preconditions.checkNotNull; - import android.text.TextUtils; + import androidx.annotation.NonNull; + import com.google.firebase.FirebaseApp; import com.google.firebase.FirebaseOptions; +import com.google.firebase.database.annotations.Nullable; import com.google.firebase.database.core.DatabaseConfig; import com.google.firebase.database.core.Path; import com.google.firebase.database.core.Repo; @@ -28,6 +29,11 @@ import com.google.firebase.database.core.utilities.ParsedUrl; import com.google.firebase.database.core.utilities.Utilities; import com.google.firebase.database.core.utilities.Validation; +import com.google.firebase.emulators.EmulatedServiceSettings; +import com.google.firebase.emulators.EmulatorSettings; +import com.google.firebase.emulators.FirebaseEmulators; + +import static com.google.android.gms.common.internal.Preconditions.checkNotNull; /** * The entry point for accessing a Firebase Database. You can get an instance by calling {@link @@ -99,7 +105,7 @@ public static synchronized FirebaseDatabase getInstance( + "FirebaseApp or from your getInstance() call."); } - ParsedUrl parsedUrl = Utilities.parseUrl(url); + ParsedUrl parsedUrl = Utilities.parseUrl(url, getEmulatorServiceSettings(app)); if (!parsedUrl.path.isEmpty()) { throw new DatabaseException( "Specified Database URL '" @@ -112,6 +118,13 @@ public static synchronized FirebaseDatabase getInstance( checkNotNull(app, "Provided FirebaseApp must not be null."); FirebaseDatabaseComponent component = app.get(FirebaseDatabaseComponent.class); checkNotNull(component, "Firebase Database component is not present."); + + EmulatorSettings emulatorSettings = app.getEmulatorSettings(); + EmulatedServiceSettings serviceSettings = + emulatorSettings != null + ? emulatorSettings.getServiceSettings(FirebaseEmulators.DATABASE) + : null; + return component.get(parsedUrl.repoInfo); } @@ -188,7 +201,7 @@ public DatabaseReference getReferenceFromUrl(@NonNull String url) { "Can't pass null for argument 'url' in " + "FirebaseDatabase.getReferenceFromUrl()"); } - ParsedUrl parsedUrl = Utilities.parseUrl(url); + ParsedUrl parsedUrl = Utilities.parseUrl(url, getEmulatorServiceSettings(this.app)); if (!parsedUrl.repoInfo.host.equals(this.repo.getRepoInfo().host)) { throw new DatabaseException( "Invalid URL (" @@ -288,6 +301,14 @@ public synchronized void setPersistenceCacheSizeBytes(long cacheSizeInBytes) { this.config.setPersistenceCacheSizeBytes(cacheSizeInBytes); } + @Nullable + private static EmulatedServiceSettings getEmulatorServiceSettings(@NonNull FirebaseApp app) { + EmulatorSettings emulatorSettings = app.getEmulatorSettings(); + return emulatorSettings != null + ? emulatorSettings.getServiceSettings(FirebaseEmulators.DATABASE) + : null; + } + /** @return The semver version for this build of the Firebase Database client */ @NonNull public static String getSdkVersion() { diff --git a/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java b/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java index 6267d328e22..86c76105896 100644 --- a/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java +++ b/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java @@ -16,7 +16,10 @@ import android.net.Uri; import android.util.Base64; + +import androidx.annotation.NonNull; import androidx.annotation.Nullable; + import com.google.android.gms.tasks.Task; import com.google.android.gms.tasks.TaskCompletionSource; import com.google.firebase.database.DatabaseError; @@ -24,6 +27,8 @@ import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.core.Path; import com.google.firebase.database.core.RepoInfo; +import com.google.firebase.emulators.EmulatedServiceSettings; + import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -32,7 +37,13 @@ public class Utilities { private static final char[] HEX_CHARACTERS = "0123456789abcdef".toCharArray(); - public static ParsedUrl parseUrl(String url) throws DatabaseException { + public static ParsedUrl parseUrl(@NonNull String url) { + return Utilities.parseUrl(url, null); + } + + public static ParsedUrl parseUrl( + @NonNull String url, @Nullable EmulatedServiceSettings serviceSettings) + throws DatabaseException { try { Uri uri = Uri.parse(url); @@ -73,6 +84,13 @@ public static ParsedUrl parseUrl(String url) throws DatabaseException { originalPathString = originalPathString.replace("+", " "); Validation.validateRootPathString(originalPathString); + // TODO: Should log this out + if (serviceSettings != null) { + repoInfo.secure = false; + repoInfo.host = serviceSettings.host + ":" + serviceSettings.port; + repoInfo.internalHost = repoInfo.host; + } + ParsedUrl parsedUrl = new ParsedUrl(); parsedUrl.path = new Path(originalPathString); parsedUrl.repoInfo = repoInfo; diff --git a/firebase-database/src/test/java/com/google/firebase/database/core/utilities/ParseUrlTest.java b/firebase-database/src/test/java/com/google/firebase/database/core/utilities/ParseUrlTest.java index 9e902d0ebd5..c92656cf212 100644 --- a/firebase-database/src/test/java/com/google/firebase/database/core/utilities/ParseUrlTest.java +++ b/firebase-database/src/test/java/com/google/firebase/database/core/utilities/ParseUrlTest.java @@ -14,15 +14,17 @@ package com.google.firebase.database.core.utilities; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - import com.google.firebase.database.DatabaseException; +import com.google.firebase.emulators.EmulatedServiceSettings; + import org.junit.Test; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + @org.junit.runner.RunWith(RobolectricTestRunner.class) @Config(manifest = Config.NONE) public class ParseUrlTest { @@ -35,7 +37,6 @@ public void testUrlParsing() throws DatabaseException { assertEquals("gsoltis.fblocal.com:9000", parsed.repoInfo.internalHost); parsed = Utilities.parseUrl("http://gsoltis.firebaseio.com/foo/bar"); - assertEquals("/foo/bar", parsed.path.toString()); assertEquals("gsoltis.firebaseio.com", parsed.repoInfo.host); assertEquals("gsoltis.firebaseio.com", parsed.repoInfo.internalHost); @@ -90,4 +91,15 @@ public void testUrlParsingSslDetection() throws DatabaseException { parsed = Utilities.parseUrl("http://gsoltis.firebaseio.com"); assertTrue(parsed.repoInfo.secure); } + + @Test + public void testUrlParsingWithEmulator() { + EmulatedServiceSettings serviceSettings = + new EmulatedServiceSettings.Builder("10.0.2.2", 9000).build(); + + ParsedUrl parsedUrl = Utilities.parseUrl("https://myns.firebaseio.com", serviceSettings); + assertFalse(parsedUrl.repoInfo.secure); + assertEquals(parsedUrl.repoInfo.host, "10.0.2.2:9000"); + assertEquals(parsedUrl.repoInfo.namespace, "myns"); + } } From 9d4be7dc503875f6a77bc1a8109225281bc67518 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 17 Jun 2020 12:23:16 -0400 Subject: [PATCH 02/18] API surface --- firebase-common/api.txt | 31 +++++++++++++++++++++++++++++++ firebase-common/gradle.properties | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/firebase-common/api.txt b/firebase-common/api.txt index adbb4aa440e..a0e2d4760a6 100644 --- a/firebase-common/api.txt +++ b/firebase-common/api.txt @@ -2,8 +2,10 @@ package com.google.firebase { public class FirebaseApp { + method public void enableEmulators(@NonNull com.google.firebase.emulators.EmulatorSettings); method @NonNull public android.content.Context getApplicationContext(); method @NonNull public static java.util.List getApps(@NonNull android.content.Context); + method @Nullable public com.google.firebase.emulators.EmulatorSettings getEmulatorSettings(); method @NonNull public static com.google.firebase.FirebaseApp getInstance(); method @NonNull public static com.google.firebase.FirebaseApp getInstance(@NonNull String); method @NonNull public String getName(); @@ -47,6 +49,35 @@ package com.google.firebase { } +package com.google.firebase.emulators { + + public class EmulatedServiceSettings { + field public final String host; + field public final int port; + } + + public static final class EmulatedServiceSettings.Builder { + ctor public EmulatedServiceSettings.Builder(@NonNull String, int); + method @NonNull public com.google.firebase.emulators.EmulatedServiceSettings build(); + } + + public class EmulatorSettings { + } + + public static final class EmulatorSettings.Builder { + ctor public EmulatorSettings.Builder(); + method @NonNull public com.google.firebase.emulators.EmulatorSettings.Builder addEmulatedService(@NonNull com.google.firebase.emulators.FirebaseEmulators, @NonNull com.google.firebase.emulators.EmulatedServiceSettings); + method @NonNull public com.google.firebase.emulators.EmulatorSettings build(); + } + + public enum FirebaseEmulators { + enum_constant public static final com.google.firebase.emulators.FirebaseEmulators DATABASE; + enum_constant public static final com.google.firebase.emulators.FirebaseEmulators FIRESTORE; + enum_constant public static final com.google.firebase.emulators.FirebaseEmulators FUNCTIONS; + } + +} + package com.google.firebase.provider { public class FirebaseInitProvider extends android.content.ContentProvider { diff --git a/firebase-common/gradle.properties b/firebase-common/gradle.properties index 9cf896e0d12..6dd5dfa1d8c 100644 --- a/firebase-common/gradle.properties +++ b/firebase-common/gradle.properties @@ -1,3 +1,3 @@ -version=19.3.1 +version=19.4.0 latestReleasedVersion=19.3.0 android.enableUnitTestBinaryResources=true From 1ca25d48bb598c471b3a253fdee570cc2fdcc847 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 17 Jun 2020 15:02:23 -0400 Subject: [PATCH 03/18] Hide new methods --- firebase-common/api.txt | 31 ------------------- firebase-common/gradle.properties | 2 +- .../java/com/google/firebase/FirebaseApp.java | 13 +++++++- .../emulators/EmulatedServiceSettings.java | 6 ++++ .../firebase/emulators/EmulatorSettings.java | 5 +++ .../firebase/emulators/FirebaseEmulators.java | 6 ++++ 6 files changed, 30 insertions(+), 33 deletions(-) diff --git a/firebase-common/api.txt b/firebase-common/api.txt index a0e2d4760a6..adbb4aa440e 100644 --- a/firebase-common/api.txt +++ b/firebase-common/api.txt @@ -2,10 +2,8 @@ package com.google.firebase { public class FirebaseApp { - method public void enableEmulators(@NonNull com.google.firebase.emulators.EmulatorSettings); method @NonNull public android.content.Context getApplicationContext(); method @NonNull public static java.util.List getApps(@NonNull android.content.Context); - method @Nullable public com.google.firebase.emulators.EmulatorSettings getEmulatorSettings(); method @NonNull public static com.google.firebase.FirebaseApp getInstance(); method @NonNull public static com.google.firebase.FirebaseApp getInstance(@NonNull String); method @NonNull public String getName(); @@ -49,35 +47,6 @@ package com.google.firebase { } -package com.google.firebase.emulators { - - public class EmulatedServiceSettings { - field public final String host; - field public final int port; - } - - public static final class EmulatedServiceSettings.Builder { - ctor public EmulatedServiceSettings.Builder(@NonNull String, int); - method @NonNull public com.google.firebase.emulators.EmulatedServiceSettings build(); - } - - public class EmulatorSettings { - } - - public static final class EmulatorSettings.Builder { - ctor public EmulatorSettings.Builder(); - method @NonNull public com.google.firebase.emulators.EmulatorSettings.Builder addEmulatedService(@NonNull com.google.firebase.emulators.FirebaseEmulators, @NonNull com.google.firebase.emulators.EmulatedServiceSettings); - method @NonNull public com.google.firebase.emulators.EmulatorSettings build(); - } - - public enum FirebaseEmulators { - enum_constant public static final com.google.firebase.emulators.FirebaseEmulators DATABASE; - enum_constant public static final com.google.firebase.emulators.FirebaseEmulators FIRESTORE; - enum_constant public static final com.google.firebase.emulators.FirebaseEmulators FUNCTIONS; - } - -} - package com.google.firebase.provider { public class FirebaseInitProvider extends android.content.ContentProvider { diff --git a/firebase-common/gradle.properties b/firebase-common/gradle.properties index 6dd5dfa1d8c..9cf896e0d12 100644 --- a/firebase-common/gradle.properties +++ b/firebase-common/gradle.properties @@ -1,3 +1,3 @@ -version=19.4.0 +version=19.3.1 latestReleasedVersion=19.3.0 android.enableUnitTestBinaryResources=true diff --git a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java index daef3e17803..b29e354b0ab 100644 --- a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java +++ b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java @@ -148,7 +148,14 @@ public FirebaseOptions getOptions() { return options; } - /** Returns the specified {@link EmulatorSettings}. */ + /** + * Returns the specified {@link EmulatorSettings}. + * + *

TODO(samstern): Un-hide this once Firestore, Database, and Functions are implemented + * + * @hide + */ + @KeepForSdk @Nullable public EmulatorSettings getEmulatorSettings() { checkNotDeleted(); @@ -326,8 +333,12 @@ public static FirebaseApp initializeApp( * com.google.firebase.emulators.FirebaseEmulators#FIRESTORE}, then calls to Cloud Firestore will * communicate with the emulator rather than production. * + *

TODO(samstern): Un-hide this once Firestore, Database, and Functions are implemented + * * @param emulatorSettings the emulator settings for all services. + * @hide */ + @KeepForSdk public void enableEmulators(@NonNull EmulatorSettings emulatorSettings) { checkNotDeleted(); Preconditions.checkState( diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java index 1ff68fff306..e61b420b19d 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java @@ -16,11 +16,17 @@ import androidx.annotation.NonNull; +import com.google.android.gms.common.annotation.KeepForSdk; + /** * Settings to connect a single Firebase service to a local emulator. * + *

TODO(samstern): Un-hide this once Firestore, Database, and Functions are implemented + * * @see EmulatorSettings + * @hide */ +@KeepForSdk public class EmulatedServiceSettings { public static final class Builder { diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java index 03117fdcdf2..62de708f791 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java @@ -17,6 +17,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.google.android.gms.common.annotation.KeepForSdk; import com.google.firebase.components.Preconditions; import java.util.Collections; @@ -28,8 +29,12 @@ * Settings that control which Firebase services should access a local emulator, rather than * production. * + *

TODO(samstern): Un-hide this once Firestore, Database, and Functions are implemented + * * @see com.google.firebase.FirebaseApp#enableEmulators(EmulatorSettings) + * @hide */ +@KeepForSdk public class EmulatorSettings { public static final class Builder { diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulators.java b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulators.java index 53f66a5ed94..814bb311cbe 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulators.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulators.java @@ -14,13 +14,19 @@ package com.google.firebase.emulators; +import com.google.android.gms.common.annotation.KeepForSdk; + /** * Enum for Firebase services that can be emulated using the Firebase Emulator Suite. * + *

TODO(samstern): Un-hide this once Firestore, Database, and Functions are implemented + * * @see com.google.firebase.FirebaseApp#enableEmulators(EmulatorSettings) * @see EmulatorSettings * @see EmulatedServiceSettings + * @hide */ +@KeepForSdk public enum FirebaseEmulators { DATABASE, FIRESTORE, From f39c11f0dc7822886627d553bcd00eeb0f42dc8c Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 18 Jun 2020 12:09:56 -0400 Subject: [PATCH 04/18] Remove the enum, flip the dependency --- .../com/google/firebase/FirebaseAppTest.java | 14 +++++++---- .../java/com/google/firebase/FirebaseApp.java | 3 ++- .../firebase/emulators/EmulatorSettings.java | 10 ++++---- ...seEmulators.java => FirebaseEmulator.java} | 24 +++++++++++++++---- .../database/FirebaseDatabaseTest.java | 4 ++-- .../firebase/database/FirebaseDatabase.java | 8 ++++--- 6 files changed, 43 insertions(+), 20 deletions(-) rename firebase-common/src/main/java/com/google/firebase/emulators/{FirebaseEmulators.java => FirebaseEmulator.java} (66%) diff --git a/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java b/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java index 8bdc779c414..7d8bfffb385 100644 --- a/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java +++ b/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java @@ -36,7 +36,7 @@ import com.google.firebase.components.TestUserAgentDependentComponent; import com.google.firebase.emulators.EmulatedServiceSettings; import com.google.firebase.emulators.EmulatorSettings; -import com.google.firebase.emulators.FirebaseEmulators; +import com.google.firebase.emulators.FirebaseEmulator; import com.google.firebase.platforminfo.UserAgentPublisher; import com.google.firebase.testing.FirebaseAppRule; @@ -429,11 +429,15 @@ public void testEnableEmulators_shouldAllowDoubleSetBeforeAccess() { Context mockContext = createForwardingMockContext(); FirebaseApp firebaseApp = FirebaseApp.initializeApp(mockContext); + // A developer would call FirebaseDatabase.EMULATOR but we can't introduce that + // dependency for this test. + FirebaseEmulator emulator = FirebaseEmulator.forName("database"); + EmulatedServiceSettings databaseSettings = new EmulatedServiceSettings.Builder("10.0.2.2", 9000).build(); EmulatorSettings emulatorSettings = new EmulatorSettings.Builder() - .addEmulatedService(FirebaseEmulators.DATABASE, databaseSettings) + .addEmulatedService(emulator, databaseSettings) .build(); // Set twice @@ -446,16 +450,18 @@ public void testEnableEmulators_shouldThrowIfSetAfterAccess() { Context mockContext = createForwardingMockContext(); FirebaseApp firebaseApp = FirebaseApp.initializeApp(mockContext); + FirebaseEmulator emulator = FirebaseEmulator.forName("database"); + EmulatedServiceSettings databaseSettings = new EmulatedServiceSettings.Builder("10.0.2.2", 9000).build(); EmulatorSettings emulatorSettings = new EmulatorSettings.Builder() - .addEmulatedService(FirebaseEmulators.DATABASE, databaseSettings) + .addEmulatedService(emulator, databaseSettings) .build(); firebaseApp.enableEmulators(emulatorSettings); // Access (as if from the Database SDK) - firebaseApp.getEmulatorSettings().getServiceSettings(FirebaseEmulators.DATABASE); + firebaseApp.getEmulatorSettings().getServiceSettings(emulator); // Try to set again assertThrows(IllegalStateException.class, () -> firebaseApp.enableEmulators(emulatorSettings)); diff --git a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java index b29e354b0ab..51ffe46e9cd 100644 --- a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java +++ b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java @@ -45,6 +45,7 @@ import com.google.firebase.components.ComponentRuntime; import com.google.firebase.components.Lazy; import com.google.firebase.emulators.EmulatorSettings; +import com.google.firebase.emulators.FirebaseEmulator; import com.google.firebase.events.Publisher; import com.google.firebase.heartbeatinfo.DefaultHeartBeatInfo; import com.google.firebase.internal.DataCollectionConfigStorage; @@ -330,7 +331,7 @@ public static FirebaseApp initializeApp( * *

For example, if the {@link EmulatorSettings} contain {@link * com.google.firebase.emulators.EmulatedServiceSettings} for {@link - * com.google.firebase.emulators.FirebaseEmulators#FIRESTORE}, then calls to Cloud Firestore will + * FirebaseEmulator#FIRESTORE}, then calls to Cloud Firestore will * communicate with the emulator rather than production. * *

TODO(samstern): Un-hide this once Firestore, Database, and Functions are implemented diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java index 62de708f791..5bbffb8eef1 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java @@ -39,7 +39,7 @@ public class EmulatorSettings { public static final class Builder { - private final Map settingsMap = new HashMap<>(); + private final Map settingsMap = new HashMap<>(); /** Constructs an empty builder. */ public Builder() {} @@ -53,7 +53,7 @@ public Builder() {} */ @NonNull public Builder addEmulatedService( - @NonNull FirebaseEmulators emulator, @NonNull EmulatedServiceSettings settings) { + @NonNull FirebaseEmulator emulator, @NonNull EmulatedServiceSettings settings) { Preconditions.checkState( !settingsMap.containsKey(emulator), "Cannot call addEmulatedService twice for " + emulator.toString()); @@ -68,9 +68,9 @@ public EmulatorSettings build() { } private final AtomicBoolean accessed = new AtomicBoolean(false); - private final Map settingsMap; + private final Map settingsMap; - private EmulatorSettings(@NonNull Map settingsMap) { + private EmulatorSettings(@NonNull Map settingsMap) { this.settingsMap = Collections.unmodifiableMap(settingsMap); } @@ -91,7 +91,7 @@ public boolean isAccessed() { * @hide */ @Nullable - public EmulatedServiceSettings getServiceSettings(@NonNull FirebaseEmulators emulator) { + public EmulatedServiceSettings getServiceSettings(@NonNull FirebaseEmulator emulator) { accessed.set(true); if (settingsMap.containsKey(emulator)) { diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulators.java b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java similarity index 66% rename from firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulators.java rename to firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java index 814bb311cbe..429607f3ea8 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulators.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java @@ -14,10 +14,12 @@ package com.google.firebase.emulators; +import androidx.annotation.NonNull; + import com.google.android.gms.common.annotation.KeepForSdk; /** - * Enum for Firebase services that can be emulated using the Firebase Emulator Suite. + * Identifier Firebase services that can be emulated using the Firebase Emulator Suite. * *

TODO(samstern): Un-hide this once Firestore, Database, and Functions are implemented * @@ -27,8 +29,20 @@ * @hide */ @KeepForSdk -public enum FirebaseEmulators { - DATABASE, - FIRESTORE, - FUNCTIONS, +public class FirebaseEmulator { + + public final String name; + + /** + * Only to be called by SDKs which support emulators in order to make constants. + * @hide + */ + @NonNull + public static FirebaseEmulator forName(String name) { + return new FirebaseEmulator(name); + } + + private FirebaseEmulator(String name) { + this.name = name; + } } diff --git a/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java b/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java index 7fb534f6485..b8c7f768717 100644 --- a/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java +++ b/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java @@ -27,7 +27,7 @@ import com.google.firebase.database.future.WriteFuture; import com.google.firebase.emulators.EmulatedServiceSettings; import com.google.firebase.emulators.EmulatorSettings; -import com.google.firebase.emulators.FirebaseEmulators; +import com.google.firebase.emulators.FirebaseEmulator; import org.junit.After; import org.junit.Assert; @@ -79,7 +79,7 @@ public void getInstanceForAppWithEmulator() { new EmulatedServiceSettings.Builder("10.0.2.2", 9000).build(); EmulatorSettings emulatorSettings = new EmulatorSettings.Builder() - .addEmulatedService(FirebaseEmulators.DATABASE, serviceSettings) + .addEmulatedService(FirebaseDatabase.EMULATOR, serviceSettings) .build(); app.enableEmulators(emulatorSettings); diff --git a/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java b/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java index 90e9e25aa96..db5290c28b8 100644 --- a/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java +++ b/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java @@ -31,7 +31,7 @@ import com.google.firebase.database.core.utilities.Validation; import com.google.firebase.emulators.EmulatedServiceSettings; import com.google.firebase.emulators.EmulatorSettings; -import com.google.firebase.emulators.FirebaseEmulators; +import com.google.firebase.emulators.FirebaseEmulator; import static com.google.android.gms.common.internal.Preconditions.checkNotNull; @@ -42,6 +42,8 @@ */ public class FirebaseDatabase { + public static final FirebaseEmulator EMULATOR = FirebaseEmulator.forName("database"); + private static final String SDK_VERSION = BuildConfig.VERSION_NAME; private final FirebaseApp app; @@ -122,7 +124,7 @@ public static synchronized FirebaseDatabase getInstance( EmulatorSettings emulatorSettings = app.getEmulatorSettings(); EmulatedServiceSettings serviceSettings = emulatorSettings != null - ? emulatorSettings.getServiceSettings(FirebaseEmulators.DATABASE) + ? emulatorSettings.getServiceSettings(EMULATOR) : null; return component.get(parsedUrl.repoInfo); @@ -305,7 +307,7 @@ public synchronized void setPersistenceCacheSizeBytes(long cacheSizeInBytes) { private static EmulatedServiceSettings getEmulatorServiceSettings(@NonNull FirebaseApp app) { EmulatorSettings emulatorSettings = app.getEmulatorSettings(); return emulatorSettings != null - ? emulatorSettings.getServiceSettings(FirebaseEmulators.DATABASE) + ? emulatorSettings.getServiceSettings(EMULATOR) : null; } From 0f931bb81b85d0580545012d0800201fd063e134 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 18 Jun 2020 12:11:14 -0400 Subject: [PATCH 05/18] Google Java Format --- .../com/google/firebase/FirebaseAppTest.java | 48 ++++++++----------- .../java/com/google/firebase/FirebaseApp.java | 13 ++--- .../emulators/EmulatedServiceSettings.java | 1 - .../firebase/emulators/EmulatorSettings.java | 4 +- .../firebase/emulators/FirebaseEmulator.java | 2 +- .../database/FirebaseDatabaseTest.java | 22 ++++----- .../firebase/database/FirebaseDatabase.java | 14 ++---- .../database/core/utilities/Utilities.java | 3 -- .../database/core/utilities/ParseUrlTest.java | 9 ++-- 9 files changed, 43 insertions(+), 73 deletions(-) diff --git a/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java b/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java index 7d8bfffb385..2a86f5203a9 100644 --- a/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java +++ b/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java @@ -14,6 +14,19 @@ package com.google.firebase; +import static com.google.android.gms.common.util.Base64Utils.decodeUrlSafeNoPadding; +import static com.google.common.truth.Truth.assertThat; +import static com.google.firebase.common.testutil.Assert.assertThrows; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import android.content.BroadcastReceiver; import android.content.ComponentCallbacks2; import android.content.Context; @@ -21,11 +34,9 @@ import android.content.Intent; import android.content.IntentFilter; import android.os.UserManager; - import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; - import com.google.android.gms.common.api.internal.BackgroundDetector; import com.google.common.base.Defaults; import com.google.firebase.auth.FirebaseAuth; @@ -39,13 +50,6 @@ import com.google.firebase.emulators.FirebaseEmulator; import com.google.firebase.platforminfo.UserAgentPublisher; import com.google.firebase.testing.FirebaseAppRule; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.stubbing.Answer; - import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -55,19 +59,11 @@ import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; - -import static com.google.android.gms.common.util.Base64Utils.decodeUrlSafeNoPadding; -import static com.google.common.truth.Truth.assertThat; -import static com.google.firebase.common.testutil.Assert.assertThrows; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.stubbing.Answer; /** Unit tests for {@link com.google.firebase.FirebaseApp}. */ // TODO(arondeak): uncomment lines when Firebase API targets are in integ. @@ -436,9 +432,7 @@ public void testEnableEmulators_shouldAllowDoubleSetBeforeAccess() { EmulatedServiceSettings databaseSettings = new EmulatedServiceSettings.Builder("10.0.2.2", 9000).build(); EmulatorSettings emulatorSettings = - new EmulatorSettings.Builder() - .addEmulatedService(emulator, databaseSettings) - .build(); + new EmulatorSettings.Builder().addEmulatedService(emulator, databaseSettings).build(); // Set twice firebaseApp.enableEmulators(emulatorSettings); @@ -455,9 +449,7 @@ public void testEnableEmulators_shouldThrowIfSetAfterAccess() { EmulatedServiceSettings databaseSettings = new EmulatedServiceSettings.Builder("10.0.2.2", 9000).build(); EmulatorSettings emulatorSettings = - new EmulatorSettings.Builder() - .addEmulatedService(emulator, databaseSettings) - .build(); + new EmulatorSettings.Builder().addEmulatedService(emulator, databaseSettings).build(); firebaseApp.enableEmulators(emulatorSettings); // Access (as if from the Database SDK) diff --git a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java index 51ffe46e9cd..a9a68a1bcbd 100644 --- a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java +++ b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java @@ -14,6 +14,8 @@ package com.google.firebase; +import static com.google.android.gms.common.util.Base64Utils.encodeUrlSafeNoPadding; + import android.annotation.TargetApi; import android.app.Application; import android.content.BroadcastReceiver; @@ -25,13 +27,11 @@ import android.os.Looper; import android.text.TextUtils; import android.util.Log; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.collection.ArrayMap; import androidx.core.os.UserManagerCompat; - import com.google.android.gms.common.annotation.KeepForSdk; import com.google.android.gms.common.api.internal.BackgroundDetector; import com.google.android.gms.common.internal.Objects; @@ -52,7 +52,6 @@ import com.google.firebase.platforminfo.DefaultUserAgentPublisher; import com.google.firebase.platforminfo.KotlinDetector; import com.google.firebase.platforminfo.LibraryVersionComponent; - import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collections; @@ -62,11 +61,8 @@ import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; - import javax.annotation.concurrent.GuardedBy; -import static com.google.android.gms.common.util.Base64Utils.encodeUrlSafeNoPadding; - /** * The entry point of Firebase SDKs. It holds common configuration and state for Firebase APIs. Most * applications don't need to directly interact with FirebaseApp. @@ -330,9 +326,8 @@ public static FirebaseApp initializeApp( * Specify which services should access local emulators for this FirebaseApp instance. * *

For example, if the {@link EmulatorSettings} contain {@link - * com.google.firebase.emulators.EmulatedServiceSettings} for {@link - * FirebaseEmulator#FIRESTORE}, then calls to Cloud Firestore will - * communicate with the emulator rather than production. + * com.google.firebase.emulators.EmulatedServiceSettings} for {@link FirebaseEmulator#FIRESTORE}, + * then calls to Cloud Firestore will communicate with the emulator rather than production. * *

TODO(samstern): Un-hide this once Firestore, Database, and Functions are implemented * diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java index e61b420b19d..9426c963cff 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java @@ -15,7 +15,6 @@ package com.google.firebase.emulators; import androidx.annotation.NonNull; - import com.google.android.gms.common.annotation.KeepForSdk; /** diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java index 5bbffb8eef1..e222526eaa2 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java @@ -16,10 +16,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; - import com.google.android.gms.common.annotation.KeepForSdk; import com.google.firebase.components.Preconditions; - import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -53,7 +51,7 @@ public Builder() {} */ @NonNull public Builder addEmulatedService( - @NonNull FirebaseEmulator emulator, @NonNull EmulatedServiceSettings settings) { + @NonNull FirebaseEmulator emulator, @NonNull EmulatedServiceSettings settings) { Preconditions.checkState( !settingsMap.containsKey(emulator), "Cannot call addEmulatedService twice for " + emulator.toString()); diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java index 429607f3ea8..8d797cd1c77 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java @@ -15,7 +15,6 @@ package com.google.firebase.emulators; import androidx.annotation.NonNull; - import com.google.android.gms.common.annotation.KeepForSdk; /** @@ -35,6 +34,7 @@ public class FirebaseEmulator { /** * Only to be called by SDKs which support emulators in order to make constants. + * * @hide */ @NonNull diff --git a/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java b/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java index b8c7f768717..fc02a264b7a 100644 --- a/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java +++ b/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java @@ -14,9 +14,14 @@ package com.google.firebase.database; +import static com.google.firebase.database.IntegrationTestHelpers.fromSingleQuotedString; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.fail; + import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - import com.google.firebase.FirebaseApp; import com.google.firebase.FirebaseOptions; import com.google.firebase.database.core.DatabaseConfig; @@ -27,24 +32,15 @@ import com.google.firebase.database.future.WriteFuture; import com.google.firebase.emulators.EmulatedServiceSettings; import com.google.firebase.emulators.EmulatorSettings; -import com.google.firebase.emulators.FirebaseEmulator; - +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import org.junit.After; import org.junit.Assert; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static com.google.firebase.database.IntegrationTestHelpers.fromSingleQuotedString; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.fail; - @org.junit.runner.RunWith(AndroidJUnit4.class) public class FirebaseDatabaseTest { @Rule public RetryRule retryRule = new RetryRule(3); diff --git a/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java b/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java index db5290c28b8..7c46dc6ad70 100644 --- a/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java +++ b/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java @@ -14,10 +14,10 @@ package com.google.firebase.database; -import android.text.TextUtils; +import static com.google.android.gms.common.internal.Preconditions.checkNotNull; +import android.text.TextUtils; import androidx.annotation.NonNull; - import com.google.firebase.FirebaseApp; import com.google.firebase.FirebaseOptions; import com.google.firebase.database.annotations.Nullable; @@ -33,8 +33,6 @@ import com.google.firebase.emulators.EmulatorSettings; import com.google.firebase.emulators.FirebaseEmulator; -import static com.google.android.gms.common.internal.Preconditions.checkNotNull; - /** * The entry point for accessing a Firebase Database. You can get an instance by calling {@link * FirebaseDatabase#getInstance()}. To access a location in the database and read or write data, use @@ -123,9 +121,7 @@ public static synchronized FirebaseDatabase getInstance( EmulatorSettings emulatorSettings = app.getEmulatorSettings(); EmulatedServiceSettings serviceSettings = - emulatorSettings != null - ? emulatorSettings.getServiceSettings(EMULATOR) - : null; + emulatorSettings != null ? emulatorSettings.getServiceSettings(EMULATOR) : null; return component.get(parsedUrl.repoInfo); } @@ -306,9 +302,7 @@ public synchronized void setPersistenceCacheSizeBytes(long cacheSizeInBytes) { @Nullable private static EmulatedServiceSettings getEmulatorServiceSettings(@NonNull FirebaseApp app) { EmulatorSettings emulatorSettings = app.getEmulatorSettings(); - return emulatorSettings != null - ? emulatorSettings.getServiceSettings(EMULATOR) - : null; + return emulatorSettings != null ? emulatorSettings.getServiceSettings(EMULATOR) : null; } /** @return The semver version for this build of the Firebase Database client */ diff --git a/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java b/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java index 86c76105896..50299dc311b 100644 --- a/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java +++ b/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java @@ -16,10 +16,8 @@ import android.net.Uri; import android.util.Base64; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; - import com.google.android.gms.tasks.Task; import com.google.android.gms.tasks.TaskCompletionSource; import com.google.firebase.database.DatabaseError; @@ -28,7 +26,6 @@ import com.google.firebase.database.core.Path; import com.google.firebase.database.core.RepoInfo; import com.google.firebase.emulators.EmulatedServiceSettings; - import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; diff --git a/firebase-database/src/test/java/com/google/firebase/database/core/utilities/ParseUrlTest.java b/firebase-database/src/test/java/com/google/firebase/database/core/utilities/ParseUrlTest.java index c92656cf212..c1dd7c2f71b 100644 --- a/firebase-database/src/test/java/com/google/firebase/database/core/utilities/ParseUrlTest.java +++ b/firebase-database/src/test/java/com/google/firebase/database/core/utilities/ParseUrlTest.java @@ -14,17 +14,16 @@ package com.google.firebase.database.core.utilities; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + import com.google.firebase.database.DatabaseException; import com.google.firebase.emulators.EmulatedServiceSettings; - import org.junit.Test; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - @org.junit.runner.RunWith(RobolectricTestRunner.class) @Config(manifest = Config.NONE) public class ParseUrlTest { From fb262d3d115886b1d52b0b9cec376dd812bd55d4 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 18 Jun 2020 12:13:22 -0400 Subject: [PATCH 06/18] No more @KeepForSdk --- .../src/main/java/com/google/firebase/FirebaseApp.java | 2 -- .../com/google/firebase/emulators/EmulatedServiceSettings.java | 1 - .../java/com/google/firebase/emulators/EmulatorSettings.java | 1 - .../java/com/google/firebase/emulators/FirebaseEmulator.java | 1 - 4 files changed, 5 deletions(-) diff --git a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java index a9a68a1bcbd..5d0db0ec323 100644 --- a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java +++ b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java @@ -152,7 +152,6 @@ public FirebaseOptions getOptions() { * * @hide */ - @KeepForSdk @Nullable public EmulatorSettings getEmulatorSettings() { checkNotDeleted(); @@ -334,7 +333,6 @@ public static FirebaseApp initializeApp( * @param emulatorSettings the emulator settings for all services. * @hide */ - @KeepForSdk public void enableEmulators(@NonNull EmulatorSettings emulatorSettings) { checkNotDeleted(); Preconditions.checkState( diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java index 9426c963cff..772e9adb7b3 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java @@ -25,7 +25,6 @@ * @see EmulatorSettings * @hide */ -@KeepForSdk public class EmulatedServiceSettings { public static final class Builder { diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java index e222526eaa2..d9bf9410709 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java @@ -32,7 +32,6 @@ * @see com.google.firebase.FirebaseApp#enableEmulators(EmulatorSettings) * @hide */ -@KeepForSdk public class EmulatorSettings { public static final class Builder { diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java index 8d797cd1c77..831a79e46b4 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java @@ -27,7 +27,6 @@ * @see EmulatedServiceSettings * @hide */ -@KeepForSdk public class FirebaseEmulator { public final String name; From 276276465609ecb45dc5870e7e81643cf7916c02 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 18 Jun 2020 12:18:29 -0400 Subject: [PATCH 07/18] Respond to most review comments --- .../src/main/java/com/google/firebase/FirebaseApp.java | 6 +++--- .../firebase/emulators/EmulatedServiceSettings.java | 1 - .../com/google/firebase/emulators/EmulatorSettings.java | 4 +++- .../com/google/firebase/emulators/FirebaseEmulator.java | 1 - .../com/google/firebase/database/FirebaseDatabase.java | 8 +------- 5 files changed, 7 insertions(+), 13 deletions(-) diff --git a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java index 5d0db0ec323..eb941e7c88a 100644 --- a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java +++ b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java @@ -111,7 +111,7 @@ public class FirebaseApp { private final String name; private final FirebaseOptions options; private final ComponentRuntime componentRuntime; - private EmulatorSettings emulatorSettings; + private EmulatorSettings emulatorSettings = EmulatorSettings.DEFAULT; // Default disabled. We released Firebase publicly without this feature, so making it default // enabled is a backwards incompatible change. @@ -146,13 +146,13 @@ public FirebaseOptions getOptions() { } /** - * Returns the specified {@link EmulatorSettings}. + * Returns the specified {@link EmulatorSettings} or {@link EmulatorSettings#DEFAULT}. * *

TODO(samstern): Un-hide this once Firestore, Database, and Functions are implemented * * @hide */ - @Nullable + @NonNull public EmulatorSettings getEmulatorSettings() { checkNotDeleted(); return emulatorSettings; diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java index 772e9adb7b3..cd8a42e3586 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java @@ -15,7 +15,6 @@ package com.google.firebase.emulators; import androidx.annotation.NonNull; -import com.google.android.gms.common.annotation.KeepForSdk; /** * Settings to connect a single Firebase service to a local emulator. diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java index d9bf9410709..684efefdd1e 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java @@ -16,7 +16,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.google.android.gms.common.annotation.KeepForSdk; import com.google.firebase.components.Preconditions; import java.util.Collections; import java.util.HashMap; @@ -34,6 +33,9 @@ */ public class EmulatorSettings { + /** Empty emulator settings to be used as an internal default * */ + public static final EmulatorSettings DEFAULT = new EmulatorSettings.Builder().build(); + public static final class Builder { private final Map settingsMap = new HashMap<>(); diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java index 831a79e46b4..ea81470a0d9 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java @@ -15,7 +15,6 @@ package com.google.firebase.emulators; import androidx.annotation.NonNull; -import com.google.android.gms.common.annotation.KeepForSdk; /** * Identifier Firebase services that can be emulated using the Firebase Emulator Suite. diff --git a/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java b/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java index 7c46dc6ad70..d8bca73485f 100644 --- a/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java +++ b/firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabase.java @@ -30,7 +30,6 @@ import com.google.firebase.database.core.utilities.Utilities; import com.google.firebase.database.core.utilities.Validation; import com.google.firebase.emulators.EmulatedServiceSettings; -import com.google.firebase.emulators.EmulatorSettings; import com.google.firebase.emulators.FirebaseEmulator; /** @@ -119,10 +118,6 @@ public static synchronized FirebaseDatabase getInstance( FirebaseDatabaseComponent component = app.get(FirebaseDatabaseComponent.class); checkNotNull(component, "Firebase Database component is not present."); - EmulatorSettings emulatorSettings = app.getEmulatorSettings(); - EmulatedServiceSettings serviceSettings = - emulatorSettings != null ? emulatorSettings.getServiceSettings(EMULATOR) : null; - return component.get(parsedUrl.repoInfo); } @@ -301,8 +296,7 @@ public synchronized void setPersistenceCacheSizeBytes(long cacheSizeInBytes) { @Nullable private static EmulatedServiceSettings getEmulatorServiceSettings(@NonNull FirebaseApp app) { - EmulatorSettings emulatorSettings = app.getEmulatorSettings(); - return emulatorSettings != null ? emulatorSettings.getServiceSettings(EMULATOR) : null; + return app.getEmulatorSettings().getServiceSettings(EMULATOR); } /** @return The semver version for this build of the Firebase Database client */ From 24b8f3a42fb3e220661bce8895e9c5fc4d863648 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 18 Jun 2020 12:43:17 -0400 Subject: [PATCH 08/18] Clone the map --- .../java/com/google/firebase/emulators/EmulatorSettings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java index 684efefdd1e..26ed187ed65 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java @@ -62,7 +62,7 @@ public Builder addEmulatedService( @NonNull public EmulatorSettings build() { - return new EmulatorSettings(settingsMap); + return new EmulatorSettings(new HashMap<>(settingsMap)); } } From 4dd3c232fc7bdf4e36f1526c051d04cf2df04c54 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 18 Jun 2020 12:52:29 -0400 Subject: [PATCH 09/18] Fix bug arising from shared DEFAULT --- .../src/main/java/com/google/firebase/FirebaseApp.java | 6 +++--- .../com/google/firebase/emulators/EmulatorSettings.java | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java index eb941e7c88a..e61d807c58a 100644 --- a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java +++ b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java @@ -111,7 +111,7 @@ public class FirebaseApp { private final String name; private final FirebaseOptions options; private final ComponentRuntime componentRuntime; - private EmulatorSettings emulatorSettings = EmulatorSettings.DEFAULT; + private EmulatorSettings emulatorSettings = EmulatorSettings.getDefault(); // Default disabled. We released Firebase publicly without this feature, so making it default // enabled is a backwards incompatible change. @@ -146,7 +146,7 @@ public FirebaseOptions getOptions() { } /** - * Returns the specified {@link EmulatorSettings} or {@link EmulatorSettings#DEFAULT}. + * Returns the specified {@link EmulatorSettings} or a default. * *

TODO(samstern): Un-hide this once Firestore, Database, and Functions are implemented * @@ -336,7 +336,7 @@ public static FirebaseApp initializeApp( public void enableEmulators(@NonNull EmulatorSettings emulatorSettings) { checkNotDeleted(); Preconditions.checkState( - !(this.emulatorSettings != null && this.emulatorSettings.isAccessed()), + !this.emulatorSettings.isAccessed(), "Cannot enable emulators after Firebase SDKs have already been used."); this.emulatorSettings = emulatorSettings; } diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java index 26ed187ed65..c04c66aca30 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java @@ -33,8 +33,10 @@ */ public class EmulatorSettings { - /** Empty emulator settings to be used as an internal default * */ - public static final EmulatorSettings DEFAULT = new EmulatorSettings.Builder().build(); + /** Empty emulator settings to be used as an internal default */ + public static EmulatorSettings getDefault() { + return new EmulatorSettings.Builder().build(); + } public static final class Builder { From f7e2832b22436ae5863ef70647280af6505df012 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 18 Jun 2020 16:47:22 -0400 Subject: [PATCH 10/18] Change to freeze verbiage, make FirebaseApp responsible for freezing --- .../java/com/google/firebase/FirebaseApp.java | 3 ++- .../firebase/emulators/EmulatorSettings.java | 27 +++++++++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java index e61d807c58a..3f60497c013 100644 --- a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java +++ b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java @@ -155,6 +155,7 @@ public FirebaseOptions getOptions() { @NonNull public EmulatorSettings getEmulatorSettings() { checkNotDeleted(); + emulatorSettings.freeze(); return emulatorSettings; } @@ -336,7 +337,7 @@ public static FirebaseApp initializeApp( public void enableEmulators(@NonNull EmulatorSettings emulatorSettings) { checkNotDeleted(); Preconditions.checkState( - !this.emulatorSettings.isAccessed(), + !this.emulatorSettings.isFrozen(), "Cannot enable emulators after Firebase SDKs have already been used."); this.emulatorSettings = emulatorSettings; } diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java index c04c66aca30..b3c0a86ae4a 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java @@ -14,6 +14,7 @@ package com.google.firebase.emulators; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.firebase.components.Preconditions; @@ -33,6 +34,8 @@ */ public class EmulatorSettings { + private static final String LOG_TAG = "FirebaseApp"; + /** Empty emulator settings to be used as an internal default */ public static EmulatorSettings getDefault() { return new EmulatorSettings.Builder().build(); @@ -68,32 +71,46 @@ public EmulatorSettings build() { } } - private final AtomicBoolean accessed = new AtomicBoolean(false); + private final AtomicBoolean frozen = new AtomicBoolean(false); private final Map settingsMap; private EmulatorSettings(@NonNull Map settingsMap) { this.settingsMap = Collections.unmodifiableMap(settingsMap); } + /** + * To be called by {@link com.google.firebase.FirebaseApp} once these settings have been accessed + * so that we know when we have passed the point of no return for changing them. + * + * @hide + */ + public void freeze() { + this.frozen.set(true); + } + /** * Determine if any Firebase SDK has already accessed the emulator settings. When true, attempting * to change the settings should throw an error. * * @hide */ - public boolean isAccessed() { - return accessed.get(); + public boolean isFrozen() { + return frozen.get(); } /** * Fetch the emulation settings for a single Firebase service. Once this method has been called - * {@link #isAccessed()} will return true. + * {@link #isFrozen()} will return true. * * @hide */ @Nullable public EmulatedServiceSettings getServiceSettings(@NonNull FirebaseEmulator emulator) { - accessed.set(true); + if (!this.frozen.get()) { + Log.w( + LOG_TAG, + "getServiceSettings() was called on EmulatorSettings before freezing, this may lead to unexpected behavior."); + } if (settingsMap.containsKey(emulator)) { return settingsMap.get(emulator); From 4ef9919eeca049b79bdf8d170217bb252285d51b Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 18 Jun 2020 16:51:18 -0400 Subject: [PATCH 11/18] No more unnecessary builder --- .../com/google/firebase/FirebaseAppTest.java | 6 ++--- .../emulators/EmulatedServiceSettings.java | 25 +------------------ .../database/FirebaseDatabaseTest.java | 3 +-- .../database/core/utilities/ParseUrlTest.java | 3 +-- 4 files changed, 5 insertions(+), 32 deletions(-) diff --git a/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java b/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java index 2a86f5203a9..52c4b8ac623 100644 --- a/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java +++ b/firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java @@ -429,8 +429,7 @@ public void testEnableEmulators_shouldAllowDoubleSetBeforeAccess() { // dependency for this test. FirebaseEmulator emulator = FirebaseEmulator.forName("database"); - EmulatedServiceSettings databaseSettings = - new EmulatedServiceSettings.Builder("10.0.2.2", 9000).build(); + EmulatedServiceSettings databaseSettings = new EmulatedServiceSettings("10.0.2.2", 9000); EmulatorSettings emulatorSettings = new EmulatorSettings.Builder().addEmulatedService(emulator, databaseSettings).build(); @@ -446,8 +445,7 @@ public void testEnableEmulators_shouldThrowIfSetAfterAccess() { FirebaseEmulator emulator = FirebaseEmulator.forName("database"); - EmulatedServiceSettings databaseSettings = - new EmulatedServiceSettings.Builder("10.0.2.2", 9000).build(); + EmulatedServiceSettings databaseSettings = new EmulatedServiceSettings("10.0.2.2", 9000); EmulatorSettings emulatorSettings = new EmulatorSettings.Builder().addEmulatedService(emulator, databaseSettings).build(); firebaseApp.enableEmulators(emulatorSettings); diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java index cd8a42e3586..ce9ca054018 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java @@ -26,33 +26,10 @@ */ public class EmulatedServiceSettings { - public static final class Builder { - - private final String host; - private final int port; - - /** - * Create a new EmulatedServiceSettings builder. - * - * @param host the host where the local emulator is running. If you want to access 'localhost' - * from an Android Emulator use '10.0.2.2' instead. - * @param port the port where the local emulator is running. - */ - public Builder(@NonNull String host, int port) { - this.host = host; - this.port = port; - } - - @NonNull - public EmulatedServiceSettings build() { - return new EmulatedServiceSettings(this.host, this.port); - } - } - public final String host; public final int port; - private EmulatedServiceSettings(@NonNull String host, int port) { + public EmulatedServiceSettings(@NonNull String host, int port) { this.host = host; this.port = port; } diff --git a/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java b/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java index fc02a264b7a..61135dfdee5 100644 --- a/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java +++ b/firebase-database/src/androidTest/java/com/google/firebase/database/FirebaseDatabaseTest.java @@ -71,8 +71,7 @@ public void getInstanceForAppWithEmulator() { FirebaseApp app = appForDatabaseUrl(IntegrationTestValues.getAltNamespace(), "getInstanceForAppWithEmulator"); - EmulatedServiceSettings serviceSettings = - new EmulatedServiceSettings.Builder("10.0.2.2", 9000).build(); + EmulatedServiceSettings serviceSettings = new EmulatedServiceSettings("10.0.2.2", 9000); EmulatorSettings emulatorSettings = new EmulatorSettings.Builder() .addEmulatedService(FirebaseDatabase.EMULATOR, serviceSettings) diff --git a/firebase-database/src/test/java/com/google/firebase/database/core/utilities/ParseUrlTest.java b/firebase-database/src/test/java/com/google/firebase/database/core/utilities/ParseUrlTest.java index c1dd7c2f71b..4ac207f5566 100644 --- a/firebase-database/src/test/java/com/google/firebase/database/core/utilities/ParseUrlTest.java +++ b/firebase-database/src/test/java/com/google/firebase/database/core/utilities/ParseUrlTest.java @@ -93,8 +93,7 @@ public void testUrlParsingSslDetection() throws DatabaseException { @Test public void testUrlParsingWithEmulator() { - EmulatedServiceSettings serviceSettings = - new EmulatedServiceSettings.Builder("10.0.2.2", 9000).build(); + EmulatedServiceSettings serviceSettings = new EmulatedServiceSettings("10.0.2.2", 9000); ParsedUrl parsedUrl = Utilities.parseUrl("https://myns.firebaseio.com", serviceSettings); assertFalse(parsedUrl.repoInfo.secure); From a2a4cd66abc9fa9a76a69d007abd940fa55f8c31 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 18 Jun 2020 17:16:20 -0400 Subject: [PATCH 12/18] Move frozen to FirebaseApp --- .../java/com/google/firebase/FirebaseApp.java | 9 ++--- .../firebase/emulators/EmulatorSettings.java | 34 +------------------ 2 files changed, 6 insertions(+), 37 deletions(-) diff --git a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java index 3f60497c013..511cdb3ae43 100644 --- a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java +++ b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java @@ -45,7 +45,6 @@ import com.google.firebase.components.ComponentRuntime; import com.google.firebase.components.Lazy; import com.google.firebase.emulators.EmulatorSettings; -import com.google.firebase.emulators.FirebaseEmulator; import com.google.firebase.events.Publisher; import com.google.firebase.heartbeatinfo.DefaultHeartBeatInfo; import com.google.firebase.internal.DataCollectionConfigStorage; @@ -111,6 +110,8 @@ public class FirebaseApp { private final String name; private final FirebaseOptions options; private final ComponentRuntime componentRuntime; + + private final AtomicBoolean emulatorSettingsFrozen = new AtomicBoolean(false); private EmulatorSettings emulatorSettings = EmulatorSettings.getDefault(); // Default disabled. We released Firebase publicly without this feature, so making it default @@ -155,7 +156,7 @@ public FirebaseOptions getOptions() { @NonNull public EmulatorSettings getEmulatorSettings() { checkNotDeleted(); - emulatorSettings.freeze(); + emulatorSettingsFrozen.set(true); return emulatorSettings; } @@ -326,7 +327,7 @@ public static FirebaseApp initializeApp( * Specify which services should access local emulators for this FirebaseApp instance. * *

For example, if the {@link EmulatorSettings} contain {@link - * com.google.firebase.emulators.EmulatedServiceSettings} for {@link FirebaseEmulator#FIRESTORE}, + * com.google.firebase.emulators.EmulatedServiceSettings} for {@link FirebaseDatabase#EMULATOR}, * then calls to Cloud Firestore will communicate with the emulator rather than production. * *

TODO(samstern): Un-hide this once Firestore, Database, and Functions are implemented @@ -337,7 +338,7 @@ public static FirebaseApp initializeApp( public void enableEmulators(@NonNull EmulatorSettings emulatorSettings) { checkNotDeleted(); Preconditions.checkState( - !this.emulatorSettings.isFrozen(), + !this.emulatorSettingsFrozen.get(), "Cannot enable emulators after Firebase SDKs have already been used."); this.emulatorSettings = emulatorSettings; } diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java index b3c0a86ae4a..5ea502eb320 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java @@ -14,14 +14,12 @@ package com.google.firebase.emulators; -import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.firebase.components.Preconditions; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; /** * Settings that control which Firebase services should access a local emulator, rather than @@ -34,8 +32,6 @@ */ public class EmulatorSettings { - private static final String LOG_TAG = "FirebaseApp"; - /** Empty emulator settings to be used as an internal default */ public static EmulatorSettings getDefault() { return new EmulatorSettings.Builder().build(); @@ -71,7 +67,6 @@ public EmulatorSettings build() { } } - private final AtomicBoolean frozen = new AtomicBoolean(false); private final Map settingsMap; private EmulatorSettings(@NonNull Map settingsMap) { @@ -79,39 +74,12 @@ private EmulatorSettings(@NonNull Map } /** - * To be called by {@link com.google.firebase.FirebaseApp} once these settings have been accessed - * so that we know when we have passed the point of no return for changing them. - * - * @hide - */ - public void freeze() { - this.frozen.set(true); - } - - /** - * Determine if any Firebase SDK has already accessed the emulator settings. When true, attempting - * to change the settings should throw an error. - * - * @hide - */ - public boolean isFrozen() { - return frozen.get(); - } - - /** - * Fetch the emulation settings for a single Firebase service. Once this method has been called - * {@link #isFrozen()} will return true. + * Fetch the emulation settings for a single Firebase service. * * @hide */ @Nullable public EmulatedServiceSettings getServiceSettings(@NonNull FirebaseEmulator emulator) { - if (!this.frozen.get()) { - Log.w( - LOG_TAG, - "getServiceSettings() was called on EmulatorSettings before freezing, this may lead to unexpected behavior."); - } - if (settingsMap.containsKey(emulator)) { return settingsMap.get(emulator); } From 4e1373fc39830e5e884ae939e5515a7b15f6b8bc Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 19 Jun 2020 08:54:12 -0400 Subject: [PATCH 13/18] Take sebastian's url parsing suggestion --- .../database/core/utilities/Utilities.java | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java b/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java index 50299dc311b..03c1315e9f4 100644 --- a/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java +++ b/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java @@ -39,7 +39,7 @@ public static ParsedUrl parseUrl(@NonNull String url) { } public static ParsedUrl parseUrl( - @NonNull String url, @Nullable EmulatedServiceSettings serviceSettings) + @NonNull String url, @Nullable EmulatedServiceSettings emulatorSettings) throws DatabaseException { try { Uri uri = Uri.parse(url); @@ -54,26 +54,29 @@ public static ParsedUrl parseUrl( throw new IllegalArgumentException("Database URL does not specify a valid host"); } - RepoInfo repoInfo = new RepoInfo(); - repoInfo.host = host.toLowerCase(); - - int port = uri.getPort(); - if (port != -1) { - repoInfo.secure = scheme.equals("https") || scheme.equals("wss"); - repoInfo.host += ":" + port; - } else { - repoInfo.secure = true; + String namespace = uri.getQueryParameter("ns"); + if (namespace == null) { + String[] parts = host.split("\\.", -1); + namespace = parts[0].toLowerCase(); } - String namespaceParam = uri.getQueryParameter("ns"); - if (namespaceParam != null) { - repoInfo.namespace = namespaceParam; + RepoInfo repoInfo = new RepoInfo(); + if (emulatorSettings != null) { + repoInfo.host = emulatorSettings.host + ":" + emulatorSettings.port; + repoInfo.secure = false; } else { - String[] parts = host.split("\\.", -1); - repoInfo.namespace = parts[0].toLowerCase(); + repoInfo.host = host.toLowerCase(); + int port = uri.getPort(); + if (port != -1) { + repoInfo.secure = scheme.equals("https") || scheme.equals("wss"); + repoInfo.host += ":" + port; + } else { + repoInfo.secure = true; + } } repoInfo.internalHost = repoInfo.host; + repoInfo.namespace = namespace; String originalPathString = extractPathString(url); // URLEncoding a space turns it into a '+', which is different @@ -81,13 +84,6 @@ public static ParsedUrl parseUrl( originalPathString = originalPathString.replace("+", " "); Validation.validateRootPathString(originalPathString); - // TODO: Should log this out - if (serviceSettings != null) { - repoInfo.secure = false; - repoInfo.host = serviceSettings.host + ":" + serviceSettings.port; - repoInfo.internalHost = repoInfo.host; - } - ParsedUrl parsedUrl = new ParsedUrl(); parsedUrl.path = new Path(originalPathString); parsedUrl.repoInfo = repoInfo; From 7f173e07f0e30fe1f92c777b01d0cf36d4ff8eca Mon Sep 17 00:00:00 2001 From: Sam Stern Date: Fri, 19 Jun 2020 09:39:59 -0400 Subject: [PATCH 14/18] Update firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java Co-authored-by: Vladimir Kryachko --- .../com/google/firebase/emulators/EmulatedServiceSettings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java index ce9ca054018..2876b5cca1c 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java @@ -24,7 +24,7 @@ * @see EmulatorSettings * @hide */ -public class EmulatedServiceSettings { +public final class EmulatedServiceSettings { public final String host; public final int port; From 6d1e1797cba7e422fe8ed32ca3792081af774ea1 Mon Sep 17 00:00:00 2001 From: Sam Stern Date: Fri, 19 Jun 2020 09:40:08 -0400 Subject: [PATCH 15/18] Update firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java Co-authored-by: Vladimir Kryachko --- .../java/com/google/firebase/emulators/FirebaseEmulator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java index ea81470a0d9..19a4eae5b57 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java @@ -26,7 +26,7 @@ * @see EmulatedServiceSettings * @hide */ -public class FirebaseEmulator { +public final class FirebaseEmulator { public final String name; From 2d67b78c97b929b928f7c435e878076fe6825fb8 Mon Sep 17 00:00:00 2001 From: Sam Stern Date: Fri, 19 Jun 2020 09:40:19 -0400 Subject: [PATCH 16/18] Update firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java Co-authored-by: Vladimir Kryachko --- .../java/com/google/firebase/emulators/EmulatorSettings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java index 5ea502eb320..cc2ac4b9f37 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java @@ -30,7 +30,7 @@ * @see com.google.firebase.FirebaseApp#enableEmulators(EmulatorSettings) * @hide */ -public class EmulatorSettings { +public final class EmulatorSettings { /** Empty emulator settings to be used as an internal default */ public static EmulatorSettings getDefault() { From 8a51a73ccdeec27e5fac2d50207899d586cc18e1 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 19 Jun 2020 09:42:42 -0400 Subject: [PATCH 17/18] Final review nits --- .../src/main/java/com/google/firebase/FirebaseApp.java | 2 +- .../com/google/firebase/emulators/EmulatorSettings.java | 4 +--- .../com/google/firebase/emulators/FirebaseEmulator.java | 6 +++++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java index 511cdb3ae43..dee3e1d9e90 100644 --- a/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java +++ b/firebase-common/src/main/java/com/google/firebase/FirebaseApp.java @@ -112,7 +112,7 @@ public class FirebaseApp { private final ComponentRuntime componentRuntime; private final AtomicBoolean emulatorSettingsFrozen = new AtomicBoolean(false); - private EmulatorSettings emulatorSettings = EmulatorSettings.getDefault(); + private EmulatorSettings emulatorSettings = EmulatorSettings.DEFAULT; // Default disabled. We released Firebase publicly without this feature, so making it default // enabled is a backwards incompatible change. diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java index cc2ac4b9f37..0ad3c80a32f 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatorSettings.java @@ -33,9 +33,7 @@ public final class EmulatorSettings { /** Empty emulator settings to be used as an internal default */ - public static EmulatorSettings getDefault() { - return new EmulatorSettings.Builder().build(); - } + public static final EmulatorSettings DEFAULT = new EmulatorSettings.Builder().build(); public static final class Builder { diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java index 19a4eae5b57..8c5800fd055 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/FirebaseEmulator.java @@ -28,7 +28,7 @@ */ public final class FirebaseEmulator { - public final String name; + private final String name; /** * Only to be called by SDKs which support emulators in order to make constants. @@ -43,4 +43,8 @@ public static FirebaseEmulator forName(String name) { private FirebaseEmulator(String name) { this.name = name; } + + public String getName() { + return name; + } } From b072f545e8bf7b23b58bbd19d58749bcd8d4516d Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 19 Jun 2020 09:59:36 -0400 Subject: [PATCH 18/18] One more getter --- .../firebase/emulators/EmulatedServiceSettings.java | 12 ++++++++++-- .../firebase/database/core/utilities/Utilities.java | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java index 2876b5cca1c..5acd04e9aa8 100644 --- a/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java +++ b/firebase-common/src/main/java/com/google/firebase/emulators/EmulatedServiceSettings.java @@ -26,11 +26,19 @@ */ public final class EmulatedServiceSettings { - public final String host; - public final int port; + private final String host; + private final int port; public EmulatedServiceSettings(@NonNull String host, int port) { this.host = host; this.port = port; } + + public String getHost() { + return host; + } + + public int getPort() { + return port; + } } diff --git a/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java b/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java index 03c1315e9f4..1ddbd685824 100644 --- a/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java +++ b/firebase-database/src/main/java/com/google/firebase/database/core/utilities/Utilities.java @@ -62,7 +62,7 @@ public static ParsedUrl parseUrl( RepoInfo repoInfo = new RepoInfo(); if (emulatorSettings != null) { - repoInfo.host = emulatorSettings.host + ":" + emulatorSettings.port; + repoInfo.host = emulatorSettings.getHost() + ":" + emulatorSettings.getPort(); repoInfo.secure = false; } else { repoInfo.host = host.toLowerCase();