From 7089c75d93a3fb7e92f5c5ab62da5a1f9e49e953 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=AD=20Becerra=20Mil=C3=A0?= Date: Mon, 18 Jan 2021 12:14:03 +0100 Subject: [PATCH 01/13] Add Firestore auth emulator --- .../firebase/auth/FirebaseUserManager.java | 14 ++++- .../multitenancy/FirebaseTenantClient.java | 13 ++++- .../FirebaseTenantClientTest.java | 55 ++++++++++++++++++- 3 files changed, 78 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/google/firebase/auth/FirebaseUserManager.java b/src/main/java/com/google/firebase/auth/FirebaseUserManager.java index 554d0179a..a5afbb8cd 100644 --- a/src/main/java/com/google/firebase/auth/FirebaseUserManager.java +++ b/src/main/java/com/google/firebase/auth/FirebaseUserManager.java @@ -72,6 +72,8 @@ final class FirebaseUserManager { private static final String ID_TOOLKIT_URL = "https://identitytoolkit.googleapis.com/%s/projects/%s"; + private static final String ID_TOOLKIT_URL_EMULATOR = + "http://%s/identitytoolkit.googleapis.com/%s/projects/%s"; private final String userMgtBaseUrl; private final String idpConfigMgtBaseUrl; @@ -85,8 +87,8 @@ private FirebaseUserManager(Builder builder) { + "set the project ID explicitly via FirebaseOptions. Alternatively you can also " + "set the project ID via the GOOGLE_CLOUD_PROJECT environment variable."); this.jsonFactory = checkNotNull(builder.jsonFactory, "JsonFactory must not be null"); - final String idToolkitUrlV1 = String.format(ID_TOOLKIT_URL, "v1", projectId); - final String idToolkitUrlV2 = String.format(ID_TOOLKIT_URL, "v2", projectId); + final String idToolkitUrlV1 = getIdToolkitUrl( projectId, "v1" ); + final String idToolkitUrlV2 = getIdToolkitUrl( projectId, "v2" ); final String tenantId = builder.tenantId; if (tenantId == null) { this.userMgtBaseUrl = idToolkitUrlV1; @@ -100,6 +102,14 @@ private FirebaseUserManager(Builder builder) { this.httpClient = new AuthHttpClient(jsonFactory, builder.requestFactory); } + private String getIdToolkitUrl(String projectId, String version) { + String maybeEmulator = System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); + if(maybeEmulator != null) { + return String.format( ID_TOOLKIT_URL_EMULATOR, maybeEmulator, version, projectId ); + } + return String.format( ID_TOOLKIT_URL, version, projectId ); + } + @VisibleForTesting void setInterceptor(HttpResponseInterceptor interceptor) { httpClient.setInterceptor(interceptor); diff --git a/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java b/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java index 5b776a49a..8bb6b6698 100644 --- a/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java +++ b/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java @@ -42,6 +42,9 @@ final class FirebaseTenantClient { private static final String ID_TOOLKIT_URL = "https://identitytoolkit.googleapis.com/%s/projects/%s"; + private static final String ID_TOOLKIT_URL_EMULATOR = + "http://%s/identitytoolkit.googleapis.com/%s/projects/%s"; + private final String tenantMgtBaseUrl; private final AuthHttpClient httpClient; @@ -58,10 +61,18 @@ final class FirebaseTenantClient { "Project ID is required to access the auth service. Use a service account credential or " + "set the project ID explicitly via FirebaseOptions. Alternatively you can also " + "set the project ID via the GOOGLE_CLOUD_PROJECT environment variable."); - this.tenantMgtBaseUrl = String.format(ID_TOOLKIT_URL, "v2", projectId); + this.tenantMgtBaseUrl = buildTenantMgtBaseUrl( projectId ); this.httpClient = new AuthHttpClient(jsonFactory, requestFactory); } + private String buildTenantMgtBaseUrl(String projectId) { + String maybeEmulator = System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); + if(maybeEmulator != null) { + return String.format( ID_TOOLKIT_URL_EMULATOR, maybeEmulator, "v2", projectId ); + } + return String.format( ID_TOOLKIT_URL, "v2", projectId ); + } + void setInterceptor(HttpResponseInterceptor interceptor) { httpClient.setInterceptor(interceptor); } diff --git a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java index 4bc84cb4d..49dfce4c5 100644 --- a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java +++ b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java @@ -50,9 +50,13 @@ import com.google.firebase.testing.TestUtils; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; +import java.util.Map; + import org.junit.After; +import org.junit.Rule; import org.junit.Test; public class FirebaseTenantClientTest { @@ -63,10 +67,15 @@ public class FirebaseTenantClientTest { private static final GoogleCredentials credentials = new MockGoogleCredentials(TEST_TOKEN); + private static final String FIREBASE_AUTH_EMULATOR_HOST = "localhost:3000"; + private static final String PROJECT_BASE_URL = "https://identitytoolkit.googleapis.com/v2/projects/test-project-id"; + private static final String PROJECT_BASE_URL_EMULATOR = + String.format( "http://%s/identitytoolkit.googleapis.com/v2/projects/test-project-id", FIREBASE_AUTH_EMULATOR_HOST ); private static final String TENANTS_BASE_URL = PROJECT_BASE_URL + "/tenants"; + private static final String TENANTS_BASE_URL_EMULATOR = PROJECT_BASE_URL_EMULATOR + "/tenants"; @After public void tearDown() { @@ -309,7 +318,51 @@ public void testDeleteTenantWithNotFoundError() { assertTrue(e.getCause() instanceof HttpResponseException); assertNotNull(e.getHttpResponse()); } - checkUrl(interceptor, "DELETE", TENANTS_BASE_URL + "/UNKNOWN"); + checkUrl(interceptor, "DELETE", TENANTS_BASE_URL + PROJECT_BASE_URL_EMULATOR); + } + + @Test + public void testGetTenantEmulator() throws Exception { + injectEnvironmentVariable("FIREBASE_AUTH_EMULATOR_HOST", FIREBASE_AUTH_EMULATOR_HOST); + TestResponseInterceptor interceptor = initializeAppForTenantManagement( + TestUtils.loadResource("tenant.json")); + + Tenant tenant = FirebaseAuth.getInstance().getTenantManager().getTenant("TENANT_1"); + + checkTenant(tenant, "TENANT_1"); + checkRequestHeaders(interceptor); + checkUrl(interceptor, "GET", TENANTS_BASE_URL_EMULATOR + "/TENANT_1"); + } + + private static void injectEnvironmentVariable(String key, String value) + throws Exception { + + Class processEnvironment = Class.forName("java.lang.ProcessEnvironment"); + + Field unmodifiableMapField = getAccessibleField(processEnvironment, "theUnmodifiableEnvironment"); + Object unmodifiableMap = unmodifiableMapField.get(null); + injectIntoUnmodifiableMap(key, value, unmodifiableMap); + + Field mapField = getAccessibleField(processEnvironment, "theEnvironment"); + Map map = (Map) mapField.get(null); + map.put(key, value); + } + + private static Field getAccessibleField(Class clazz, String fieldName) + throws NoSuchFieldException { + + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } + + private static void injectIntoUnmodifiableMap(String key, String value, Object map) + throws ReflectiveOperationException { + + Class unmodifiableMap = Class.forName("java.util.Collections$UnmodifiableMap"); + Field field = getAccessibleField(unmodifiableMap, "m"); + Object obj = field.get(map); + ((Map) obj).put(key, value); } private static void checkTenant(Tenant tenant, String tenantId) { From f1e261a2df0e691ad726d9a8975105429028f8fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=AD=20Becerra=20Mil=C3=A0?= Date: Mon, 18 Jan 2021 12:41:01 +0100 Subject: [PATCH 02/13] Fix build --- .../com/google/firebase/auth/FirebaseUserManager.java | 8 ++++---- .../firebase/auth/multitenancy/FirebaseTenantClient.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/google/firebase/auth/FirebaseUserManager.java b/src/main/java/com/google/firebase/auth/FirebaseUserManager.java index a5afbb8cd..7939eea3f 100644 --- a/src/main/java/com/google/firebase/auth/FirebaseUserManager.java +++ b/src/main/java/com/google/firebase/auth/FirebaseUserManager.java @@ -87,8 +87,8 @@ private FirebaseUserManager(Builder builder) { + "set the project ID explicitly via FirebaseOptions. Alternatively you can also " + "set the project ID via the GOOGLE_CLOUD_PROJECT environment variable."); this.jsonFactory = checkNotNull(builder.jsonFactory, "JsonFactory must not be null"); - final String idToolkitUrlV1 = getIdToolkitUrl( projectId, "v1" ); - final String idToolkitUrlV2 = getIdToolkitUrl( projectId, "v2" ); + final String idToolkitUrlV1 = getIdToolkitUrl(projectId, "v1"); + final String idToolkitUrlV2 = getIdToolkitUrl(projectId, "v2"); final String tenantId = builder.tenantId; if (tenantId == null) { this.userMgtBaseUrl = idToolkitUrlV1; @@ -105,9 +105,9 @@ private FirebaseUserManager(Builder builder) { private String getIdToolkitUrl(String projectId, String version) { String maybeEmulator = System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); if(maybeEmulator != null) { - return String.format( ID_TOOLKIT_URL_EMULATOR, maybeEmulator, version, projectId ); + return String.format(ID_TOOLKIT_URL_EMULATOR, maybeEmulator, version, projectId); } - return String.format( ID_TOOLKIT_URL, version, projectId ); + return String.format(ID_TOOLKIT_URL, version, projectId); } @VisibleForTesting diff --git a/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java b/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java index 8bb6b6698..523fecd78 100644 --- a/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java +++ b/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java @@ -61,16 +61,16 @@ final class FirebaseTenantClient { "Project ID is required to access the auth service. Use a service account credential or " + "set the project ID explicitly via FirebaseOptions. Alternatively you can also " + "set the project ID via the GOOGLE_CLOUD_PROJECT environment variable."); - this.tenantMgtBaseUrl = buildTenantMgtBaseUrl( projectId ); + this.tenantMgtBaseUrl = buildTenantMgtBaseUrl(projectId); this.httpClient = new AuthHttpClient(jsonFactory, requestFactory); } private String buildTenantMgtBaseUrl(String projectId) { String maybeEmulator = System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); if(maybeEmulator != null) { - return String.format( ID_TOOLKIT_URL_EMULATOR, maybeEmulator, "v2", projectId ); + return String.format(ID_TOOLKIT_URL_EMULATOR, maybeEmulator, "v2", projectId); } - return String.format( ID_TOOLKIT_URL, "v2", projectId ); + return String.format(ID_TOOLKIT_URL, "v2", projectId); } void setInterceptor(HttpResponseInterceptor interceptor) { From b2fae88a957d0d4a5a908a60fac971e38ecb5e02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=AD=20Becerra=20Mil=C3=A0?= Date: Mon, 18 Jan 2021 12:49:07 +0100 Subject: [PATCH 03/13] Fix checkstyle --- .../firebase/auth/FirebaseUserManager.java | 2 +- .../auth/multitenancy/FirebaseTenantClient.java | 2 +- .../multitenancy/FirebaseTenantClientTest.java | 16 +--------------- 3 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/google/firebase/auth/FirebaseUserManager.java b/src/main/java/com/google/firebase/auth/FirebaseUserManager.java index 7939eea3f..f5ae395a5 100644 --- a/src/main/java/com/google/firebase/auth/FirebaseUserManager.java +++ b/src/main/java/com/google/firebase/auth/FirebaseUserManager.java @@ -104,7 +104,7 @@ private FirebaseUserManager(Builder builder) { private String getIdToolkitUrl(String projectId, String version) { String maybeEmulator = System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); - if(maybeEmulator != null) { + if (maybeEmulator != null) { return String.format(ID_TOOLKIT_URL_EMULATOR, maybeEmulator, version, projectId); } return String.format(ID_TOOLKIT_URL, version, projectId); diff --git a/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java b/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java index 523fecd78..c7a9aae0b 100644 --- a/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java +++ b/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java @@ -67,7 +67,7 @@ final class FirebaseTenantClient { private String buildTenantMgtBaseUrl(String projectId) { String maybeEmulator = System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); - if(maybeEmulator != null) { + if (maybeEmulator != null) { return String.format(ID_TOOLKIT_URL_EMULATOR, maybeEmulator, "v2", projectId); } return String.format(ID_TOOLKIT_URL, "v2", projectId); diff --git a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java index 49dfce4c5..09ce1ea52 100644 --- a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java +++ b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java @@ -72,7 +72,7 @@ public class FirebaseTenantClientTest { private static final String PROJECT_BASE_URL = "https://identitytoolkit.googleapis.com/v2/projects/test-project-id"; private static final String PROJECT_BASE_URL_EMULATOR = - String.format( "http://%s/identitytoolkit.googleapis.com/v2/projects/test-project-id", FIREBASE_AUTH_EMULATOR_HOST ); + String.format("http://%s/identitytoolkit.googleapis.com/v2/projects/test-project-id", FIREBASE_AUTH_EMULATOR_HOST); private static final String TENANTS_BASE_URL = PROJECT_BASE_URL + "/tenants"; private static final String TENANTS_BASE_URL_EMULATOR = PROJECT_BASE_URL_EMULATOR + "/tenants"; @@ -339,10 +339,6 @@ private static void injectEnvironmentVariable(String key, String value) Class processEnvironment = Class.forName("java.lang.ProcessEnvironment"); - Field unmodifiableMapField = getAccessibleField(processEnvironment, "theUnmodifiableEnvironment"); - Object unmodifiableMap = unmodifiableMapField.get(null); - injectIntoUnmodifiableMap(key, value, unmodifiableMap); - Field mapField = getAccessibleField(processEnvironment, "theEnvironment"); Map map = (Map) mapField.get(null); map.put(key, value); @@ -350,21 +346,11 @@ private static void injectEnvironmentVariable(String key, String value) private static Field getAccessibleField(Class clazz, String fieldName) throws NoSuchFieldException { - Field field = clazz.getDeclaredField(fieldName); field.setAccessible(true); return field; } - private static void injectIntoUnmodifiableMap(String key, String value, Object map) - throws ReflectiveOperationException { - - Class unmodifiableMap = Class.forName("java.util.Collections$UnmodifiableMap"); - Field field = getAccessibleField(unmodifiableMap, "m"); - Object obj = field.get(map); - ((Map) obj).put(key, value); - } - private static void checkTenant(Tenant tenant, String tenantId) { assertEquals(tenantId, tenant.getTenantId()); assertEquals("DISPLAY_NAME", tenant.getDisplayName()); From a45384bb735da86995117431a121c08f51070356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=AD=20Becerra=20Mil=C3=A0?= Date: Wed, 20 Jan 2021 17:09:41 +0100 Subject: [PATCH 04/13] Fix test --- .../firebase/auth/FirebaseUserManager.java | 10 +++++++++- .../multitenancy/FirebaseTenantClient.java | 10 +++++++++- .../FirebaseTenantClientTest.java | 19 +------------------ 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/google/firebase/auth/FirebaseUserManager.java b/src/main/java/com/google/firebase/auth/FirebaseUserManager.java index f5ae395a5..0e179c8e4 100644 --- a/src/main/java/com/google/firebase/auth/FirebaseUserManager.java +++ b/src/main/java/com/google/firebase/auth/FirebaseUserManager.java @@ -103,13 +103,21 @@ private FirebaseUserManager(Builder builder) { } private String getIdToolkitUrl(String projectId, String version) { - String maybeEmulator = System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); + String maybeEmulator = getFirebaseAuth(); if (maybeEmulator != null) { return String.format(ID_TOOLKIT_URL_EMULATOR, maybeEmulator, version, projectId); } return String.format(ID_TOOLKIT_URL, version, projectId); } + private String getFirebaseAuth() { + String maybeEmulator = System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); + if(maybeEmulator != null) { + return maybeEmulator; + } + return System.getProperty("FIREBASE_AUTH_EMULATOR_HOST"); + } + @VisibleForTesting void setInterceptor(HttpResponseInterceptor interceptor) { httpClient.setInterceptor(interceptor); diff --git a/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java b/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java index c7a9aae0b..5846b2b3b 100644 --- a/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java +++ b/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java @@ -66,13 +66,21 @@ final class FirebaseTenantClient { } private String buildTenantMgtBaseUrl(String projectId) { - String maybeEmulator = System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); + String maybeEmulator = getFirebaseAuth(); if (maybeEmulator != null) { return String.format(ID_TOOLKIT_URL_EMULATOR, maybeEmulator, "v2", projectId); } return String.format(ID_TOOLKIT_URL, "v2", projectId); } + private String getFirebaseAuth() { + String maybeEmulator = System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); + if(maybeEmulator != null) { + return maybeEmulator; + } + return System.getProperty("FIREBASE_AUTH_EMULATOR_HOST"); + } + void setInterceptor(HttpResponseInterceptor interceptor) { httpClient.setInterceptor(interceptor); } diff --git a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java index 09ce1ea52..5e8e31fa3 100644 --- a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java +++ b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java @@ -323,7 +323,7 @@ public void testDeleteTenantWithNotFoundError() { @Test public void testGetTenantEmulator() throws Exception { - injectEnvironmentVariable("FIREBASE_AUTH_EMULATOR_HOST", FIREBASE_AUTH_EMULATOR_HOST); + System.setProperty("FIREBASE_AUTH_EMULATOR_HOST", FIREBASE_AUTH_EMULATOR_HOST); TestResponseInterceptor interceptor = initializeAppForTenantManagement( TestUtils.loadResource("tenant.json")); @@ -334,23 +334,6 @@ public void testGetTenantEmulator() throws Exception { checkUrl(interceptor, "GET", TENANTS_BASE_URL_EMULATOR + "/TENANT_1"); } - private static void injectEnvironmentVariable(String key, String value) - throws Exception { - - Class processEnvironment = Class.forName("java.lang.ProcessEnvironment"); - - Field mapField = getAccessibleField(processEnvironment, "theEnvironment"); - Map map = (Map) mapField.get(null); - map.put(key, value); - } - - private static Field getAccessibleField(Class clazz, String fieldName) - throws NoSuchFieldException { - Field field = clazz.getDeclaredField(fieldName); - field.setAccessible(true); - return field; - } - private static void checkTenant(Tenant tenant, String tenantId) { assertEquals(tenantId, tenant.getTenantId()); assertEquals("DISPLAY_NAME", tenant.getDisplayName()); From 62f3b6cbb73664121f432c01a644e7abe4358126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=AD=20Becerra=20Mil=C3=A0?= Date: Wed, 20 Jan 2021 17:13:30 +0100 Subject: [PATCH 05/13] Fix style --- .../google/firebase/auth/multitenancy/FirebaseTenantClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java b/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java index 5846b2b3b..0b14794d9 100644 --- a/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java +++ b/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java @@ -75,7 +75,7 @@ private String buildTenantMgtBaseUrl(String projectId) { private String getFirebaseAuth() { String maybeEmulator = System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); - if(maybeEmulator != null) { + if (maybeEmulator != null) { return maybeEmulator; } return System.getProperty("FIREBASE_AUTH_EMULATOR_HOST"); From b3c4bf749886a58900b0b6d4a48ab29581fbbf4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=AD=20Becerra=20Mil=C3=A0?= Date: Wed, 20 Jan 2021 17:17:25 +0100 Subject: [PATCH 06/13] Clean style --- src/main/java/com/google/firebase/auth/FirebaseUserManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/google/firebase/auth/FirebaseUserManager.java b/src/main/java/com/google/firebase/auth/FirebaseUserManager.java index 0e179c8e4..3a7107b2e 100644 --- a/src/main/java/com/google/firebase/auth/FirebaseUserManager.java +++ b/src/main/java/com/google/firebase/auth/FirebaseUserManager.java @@ -112,7 +112,7 @@ private String getIdToolkitUrl(String projectId, String version) { private String getFirebaseAuth() { String maybeEmulator = System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); - if(maybeEmulator != null) { + if (maybeEmulator != null) { return maybeEmulator; } return System.getProperty("FIREBASE_AUTH_EMULATOR_HOST"); From 71e06b7f8d4834a8bcfb1857ba8c6ba79452b375 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=AD=20Becerra=20Mil=C3=A0?= Date: Wed, 20 Jan 2021 17:20:46 +0100 Subject: [PATCH 07/13] Remove property --- .../firebase/auth/multitenancy/FirebaseTenantClientTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java index 5e8e31fa3..3bad80ef1 100644 --- a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java +++ b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java @@ -328,6 +328,7 @@ public void testGetTenantEmulator() throws Exception { TestUtils.loadResource("tenant.json")); Tenant tenant = FirebaseAuth.getInstance().getTenantManager().getTenant("TENANT_1"); + System.setProperty("FIREBASE_AUTH_EMULATOR_HOST", null); checkTenant(tenant, "TENANT_1"); checkRequestHeaders(interceptor); From 110e84b23bd518c0f08bf0ace0a9aa18b0b43304 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=AD=20Becerra=20Mil=C3=A0?= Date: Wed, 20 Jan 2021 17:29:30 +0100 Subject: [PATCH 08/13] Clean --- .../google/firebase/auth/FirebaseUserManager.java | 6 +----- .../auth/multitenancy/FirebaseTenantClient.java | 10 +++------- .../multitenancy/FirebaseTenantClientTest.java | 14 -------------- 3 files changed, 4 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/google/firebase/auth/FirebaseUserManager.java b/src/main/java/com/google/firebase/auth/FirebaseUserManager.java index 3a7107b2e..25f81144d 100644 --- a/src/main/java/com/google/firebase/auth/FirebaseUserManager.java +++ b/src/main/java/com/google/firebase/auth/FirebaseUserManager.java @@ -111,11 +111,7 @@ private String getIdToolkitUrl(String projectId, String version) { } private String getFirebaseAuth() { - String maybeEmulator = System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); - if (maybeEmulator != null) { - return maybeEmulator; - } - return System.getProperty("FIREBASE_AUTH_EMULATOR_HOST"); + return System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); } @VisibleForTesting diff --git a/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java b/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java index 0b14794d9..e7244649c 100644 --- a/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java +++ b/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java @@ -66,19 +66,15 @@ final class FirebaseTenantClient { } private String buildTenantMgtBaseUrl(String projectId) { - String maybeEmulator = getFirebaseAuth(); + String maybeEmulator = getFirebaseAuthEmulator(); if (maybeEmulator != null) { return String.format(ID_TOOLKIT_URL_EMULATOR, maybeEmulator, "v2", projectId); } return String.format(ID_TOOLKIT_URL, "v2", projectId); } - private String getFirebaseAuth() { - String maybeEmulator = System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); - if (maybeEmulator != null) { - return maybeEmulator; - } - return System.getProperty("FIREBASE_AUTH_EMULATOR_HOST"); + private String getFirebaseAuthEmulator() { + return System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); } void setInterceptor(HttpResponseInterceptor interceptor) { diff --git a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java index 3bad80ef1..d855969b3 100644 --- a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java +++ b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java @@ -321,20 +321,6 @@ public void testDeleteTenantWithNotFoundError() { checkUrl(interceptor, "DELETE", TENANTS_BASE_URL + PROJECT_BASE_URL_EMULATOR); } - @Test - public void testGetTenantEmulator() throws Exception { - System.setProperty("FIREBASE_AUTH_EMULATOR_HOST", FIREBASE_AUTH_EMULATOR_HOST); - TestResponseInterceptor interceptor = initializeAppForTenantManagement( - TestUtils.loadResource("tenant.json")); - - Tenant tenant = FirebaseAuth.getInstance().getTenantManager().getTenant("TENANT_1"); - System.setProperty("FIREBASE_AUTH_EMULATOR_HOST", null); - - checkTenant(tenant, "TENANT_1"); - checkRequestHeaders(interceptor); - checkUrl(interceptor, "GET", TENANTS_BASE_URL_EMULATOR + "/TENANT_1"); - } - private static void checkTenant(Tenant tenant, String tenantId) { assertEquals(tenantId, tenant.getTenantId()); assertEquals("DISPLAY_NAME", tenant.getDisplayName()); From f14be2474fb63c456446044ec5eff712661ea41a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=AD=20Becerra=20Mil=C3=A0?= Date: Wed, 20 Jan 2021 17:45:57 +0100 Subject: [PATCH 09/13] Clean --- .../auth/multitenancy/FirebaseTenantClientTest.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java index d855969b3..3d1655c89 100644 --- a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java +++ b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java @@ -50,13 +50,10 @@ import com.google.firebase.testing.TestUtils; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; -import java.util.Map; import org.junit.After; -import org.junit.Rule; import org.junit.Test; public class FirebaseTenantClientTest { @@ -67,15 +64,11 @@ public class FirebaseTenantClientTest { private static final GoogleCredentials credentials = new MockGoogleCredentials(TEST_TOKEN); - private static final String FIREBASE_AUTH_EMULATOR_HOST = "localhost:3000"; - private static final String PROJECT_BASE_URL = "https://identitytoolkit.googleapis.com/v2/projects/test-project-id"; - private static final String PROJECT_BASE_URL_EMULATOR = - String.format("http://%s/identitytoolkit.googleapis.com/v2/projects/test-project-id", FIREBASE_AUTH_EMULATOR_HOST); private static final String TENANTS_BASE_URL = PROJECT_BASE_URL + "/tenants"; - private static final String TENANTS_BASE_URL_EMULATOR = PROJECT_BASE_URL_EMULATOR + "/tenants"; + @After public void tearDown() { @@ -318,7 +311,7 @@ public void testDeleteTenantWithNotFoundError() { assertTrue(e.getCause() instanceof HttpResponseException); assertNotNull(e.getHttpResponse()); } - checkUrl(interceptor, "DELETE", TENANTS_BASE_URL + PROJECT_BASE_URL_EMULATOR); + checkUrl(interceptor, "DELETE", TENANTS_BASE_URL + "/UNKNOWN"); } private static void checkTenant(Tenant tenant, String tenantId) { From 9cce38e205764e34def71390868ee13d4ee7e43a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=AD=20Becerra=20Mil=C3=A0?= Date: Sat, 30 Jan 2021 09:08:06 +0100 Subject: [PATCH 10/13] Add test & improve some methods name. --- pom.xml | 8 +++- .../firebase/auth/FirebaseUserManager.java | 4 +- .../multitenancy/FirebaseTenantClient.java | 8 ++-- .../auth/FirebaseUserManagerTest.java | 39 ++++++++++++++++++- .../FirebaseTenantClientTest.java | 27 ++++++++++++- 5 files changed, 77 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index c90439f51..7acf80160 100644 --- a/pom.xml +++ b/pom.xml @@ -352,7 +352,7 @@ integration-test verify - + @@ -490,5 +490,11 @@ 2.0 test + + + com.github.stefanbirkner + system-rules + 1.19.0 + diff --git a/src/main/java/com/google/firebase/auth/FirebaseUserManager.java b/src/main/java/com/google/firebase/auth/FirebaseUserManager.java index 25f81144d..334296922 100644 --- a/src/main/java/com/google/firebase/auth/FirebaseUserManager.java +++ b/src/main/java/com/google/firebase/auth/FirebaseUserManager.java @@ -103,14 +103,14 @@ private FirebaseUserManager(Builder builder) { } private String getIdToolkitUrl(String projectId, String version) { - String maybeEmulator = getFirebaseAuth(); + String maybeEmulator = getEmulatorHost(); if (maybeEmulator != null) { return String.format(ID_TOOLKIT_URL_EMULATOR, maybeEmulator, version, projectId); } return String.format(ID_TOOLKIT_URL, version, projectId); } - private String getFirebaseAuth() { + private String getEmulatorHost() { return System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); } diff --git a/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java b/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java index e7244649c..cf71e5bf0 100644 --- a/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java +++ b/src/main/java/com/google/firebase/auth/multitenancy/FirebaseTenantClient.java @@ -61,19 +61,19 @@ final class FirebaseTenantClient { "Project ID is required to access the auth service. Use a service account credential or " + "set the project ID explicitly via FirebaseOptions. Alternatively you can also " + "set the project ID via the GOOGLE_CLOUD_PROJECT environment variable."); - this.tenantMgtBaseUrl = buildTenantMgtBaseUrl(projectId); + this.tenantMgtBaseUrl = getTenantMgtBaseUrl(projectId); this.httpClient = new AuthHttpClient(jsonFactory, requestFactory); } - private String buildTenantMgtBaseUrl(String projectId) { - String maybeEmulator = getFirebaseAuthEmulator(); + private String getTenantMgtBaseUrl(String projectId) { + String maybeEmulator = getEmulatorHost(); if (maybeEmulator != null) { return String.format(ID_TOOLKIT_URL_EMULATOR, maybeEmulator, "v2", projectId); } return String.format(ID_TOOLKIT_URL, "v2", projectId); } - private String getFirebaseAuthEmulator() { + private String getEmulatorHost() { return System.getenv("FIREBASE_AUTH_EMULATOR_HOST"); } diff --git a/src/test/java/com/google/firebase/auth/FirebaseUserManagerTest.java b/src/test/java/com/google/firebase/auth/FirebaseUserManagerTest.java index 772f9ba8d..b2a91ebcd 100644 --- a/src/test/java/com/google/firebase/auth/FirebaseUserManagerTest.java +++ b/src/test/java/com/google/firebase/auth/FirebaseUserManagerTest.java @@ -62,7 +62,9 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import org.junit.After; +import org.junit.Rule; import org.junit.Test; +import org.junit.contrib.java.lang.system.EnvironmentVariables; public class FirebaseUserManagerTest { @@ -90,12 +92,21 @@ public class FirebaseUserManagerTest { private static final String TENANTS_BASE_URL = PROJECT_BASE_URL + "/tenants"; + private static final String AUTH_EMULATOR = "localhost:8000"; + private static final String PROJECT_BASE_URL_EMULATOR = + "http://" + AUTH_EMULATOR + "/identitytoolkit.googleapis.com/v2/projects/test-project-id"; + private static final String TENANTS_BASE_URL_EMULATOR = PROJECT_BASE_URL_EMULATOR + "/tenants"; + private static final String SAML_RESPONSE = TestUtils.loadResource("saml.json"); private static final String OIDC_RESPONSE = TestUtils.loadResource("oidc.json"); + @Rule + public final EnvironmentVariables environmentVariables = new EnvironmentVariables(); + @After public void tearDown() { + environmentVariables.clear("FIREBASE_AUTH_EMULATOR_HOST", AUTH_EMULATOR); TestOnlyImplFirebaseTrampolines.clearInstancesForTest(); } @@ -1517,7 +1528,7 @@ public void testCreateOidcProviderAsync() throws Exception { .setClientId("CLIENT_ID") .setIssuer("https://oidc.com/issuer"); - OidcProviderConfig config = + OidcProviderConfig config = FirebaseAuth.getInstance().createOidcProviderConfigAsync(createRequest).get(); checkOidcProviderConfig(config, "oidc.provider-id"); @@ -2678,6 +2689,32 @@ public void testTenantAwareDeleteSamlProviderConfig() throws Exception { checkUrl(interceptor, "DELETE", expectedUrl); } + @Test + public void testCreateOidcProviderFromEmulatorAuth() throws Exception { + environmentVariables.set("FIREBASE_AUTH_EMULATOR_HOST", AUTH_EMULATOR); + TestResponseInterceptor interceptor = initializeAppForUserManagement(OIDC_RESPONSE); + OidcProviderConfig.CreateRequest createRequest = + new OidcProviderConfig.CreateRequest() + .setProviderId("oidc.provider-id") + .setDisplayName("DISPLAY_NAME") + .setEnabled(true) + .setClientId("CLIENT_ID") + .setIssuer("https://oidc.com/issuer"); + + OidcProviderConfig config = FirebaseAuth.getInstance().createOidcProviderConfig(createRequest); + + checkOidcProviderConfig(config, "oidc.provider-id"); + checkRequestHeaders(interceptor); + checkUrl(interceptor, "POST", PROJECT_BASE_URL_EMULATOR + "/oauthIdpConfigs"); + GenericJson parsed = parseRequestContent(interceptor); + assertEquals("DISPLAY_NAME", parsed.get("displayName")); + assertTrue((boolean) parsed.get("enabled")); + assertEquals("CLIENT_ID", parsed.get("clientId")); + assertEquals("https://oidc.com/issuer", parsed.get("issuer")); + GenericUrl url = interceptor.getResponse().getRequest().getUrl(); + assertEquals("oidc.provider-id", url.getFirst("oauthIdpConfigId")); + } + private static TestResponseInterceptor initializeAppForUserManagementWithStatusCode( int statusCode, String response) { FirebaseApp.initializeApp(FirebaseOptions.builder() diff --git a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java index 3d1655c89..9c3db8832 100644 --- a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java +++ b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java @@ -52,8 +52,10 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import org.junit.contrib.java.lang.system.EnvironmentVariables; import org.junit.After; +import org.junit.Rule; import org.junit.Test; public class FirebaseTenantClientTest { @@ -69,9 +71,17 @@ public class FirebaseTenantClientTest { private static final String TENANTS_BASE_URL = PROJECT_BASE_URL + "/tenants"; + private static final String AUTH_EMULATOR = "localhost:8000"; + private static final String PROJECT_BASE_URL_EMULATOR = + "http://" + AUTH_EMULATOR + "/identitytoolkit.googleapis.com/v2/projects/test-project-id"; + private static final String TENANTS_BASE_URL_EMULATOR = PROJECT_BASE_URL_EMULATOR + "/tenants"; + + @Rule + public final EnvironmentVariables environmentVariables = new EnvironmentVariables(); @After - public void tearDown() { + public void tearDown() throws ReflectiveOperationException { + environmentVariables.clear("FIREBASE_AUTH_EMULATOR_HOST", AUTH_EMULATOR); TestOnlyImplFirebaseTrampolines.clearInstancesForTest(); } @@ -314,6 +324,21 @@ public void testDeleteTenantWithNotFoundError() { checkUrl(interceptor, "DELETE", TENANTS_BASE_URL + "/UNKNOWN"); } + @Test + public void testGetTenantFromAuthEmulator() throws Exception { + environmentVariables.set("FIREBASE_AUTH_EMULATOR_HOST", AUTH_EMULATOR); + TestResponseInterceptor interceptor = initializeAppForTenantManagement( + TestUtils.loadResource("tenant.json")); + + Tenant tenant = FirebaseAuth.getInstance().getTenantManager().getTenant("TENANT_1"); + + + checkTenant(tenant, "TENANT_1"); + checkRequestHeaders(interceptor); + checkUrl(interceptor, "GET", TENANTS_BASE_URL_EMULATOR + "/TENANT_1"); + + } + private static void checkTenant(Tenant tenant, String tenantId) { assertEquals(tenantId, tenant.getTenantId()); assertEquals("DISPLAY_NAME", tenant.getDisplayName()); From f5d20f905b9ca71b6e44b92947a9db1f55d23ab4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=AD=20Becerra=20Mil=C3=A0?= Date: Sat, 30 Jan 2021 09:12:13 +0100 Subject: [PATCH 11/13] Fix checkstyle --- .../auth/multitenancy/FirebaseTenantClientTest.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java index 9c3db8832..2d04faebb 100644 --- a/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java +++ b/src/test/java/com/google/firebase/auth/multitenancy/FirebaseTenantClientTest.java @@ -52,11 +52,11 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.junit.contrib.java.lang.system.EnvironmentVariables; import org.junit.After; import org.junit.Rule; import org.junit.Test; +import org.junit.contrib.java.lang.system.EnvironmentVariables; public class FirebaseTenantClientTest { @@ -332,11 +332,9 @@ public void testGetTenantFromAuthEmulator() throws Exception { Tenant tenant = FirebaseAuth.getInstance().getTenantManager().getTenant("TENANT_1"); - - checkTenant(tenant, "TENANT_1"); - checkRequestHeaders(interceptor); - checkUrl(interceptor, "GET", TENANTS_BASE_URL_EMULATOR + "/TENANT_1"); - + checkTenant(tenant, "TENANT_1"); + checkRequestHeaders(interceptor); + checkUrl(interceptor, "GET", TENANTS_BASE_URL_EMULATOR + "/TENANT_1"); } private static void checkTenant(Tenant tenant, String tenantId) { From 36bd501d13e107a3f85a09fa2e56f810ad5aff0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=AD=20Becerra=20Mil=C3=A0?= Date: Wed, 10 Feb 2021 16:31:17 +0100 Subject: [PATCH 12/13] Fix scope for system rules --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 7acf80160..15e84ecb1 100644 --- a/pom.xml +++ b/pom.xml @@ -495,6 +495,7 @@ com.github.stefanbirkner system-rules 1.19.0 + test From 4ac25e6a616c2327c2135beb5f314ae354ecd3a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=AD=20Becerra=20Mil=C3=A0?= Date: Wed, 10 Feb 2021 17:05:26 +0100 Subject: [PATCH 13/13] Remove unused var --- .../java/com/google/firebase/auth/FirebaseUserManagerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/google/firebase/auth/FirebaseUserManagerTest.java b/src/test/java/com/google/firebase/auth/FirebaseUserManagerTest.java index b2a91ebcd..8d0906ffa 100644 --- a/src/test/java/com/google/firebase/auth/FirebaseUserManagerTest.java +++ b/src/test/java/com/google/firebase/auth/FirebaseUserManagerTest.java @@ -95,7 +95,6 @@ public class FirebaseUserManagerTest { private static final String AUTH_EMULATOR = "localhost:8000"; private static final String PROJECT_BASE_URL_EMULATOR = "http://" + AUTH_EMULATOR + "/identitytoolkit.googleapis.com/v2/projects/test-project-id"; - private static final String TENANTS_BASE_URL_EMULATOR = PROJECT_BASE_URL_EMULATOR + "/tenants"; private static final String SAML_RESPONSE = TestUtils.loadResource("saml.json");