diff --git a/src/androidTest/java/tests/integration/ProxyFactoryTest.java b/src/androidTest/java/tests/integration/ProxyFactoryTest.java index 1a156ed3f..bd4d8cc4f 100644 --- a/src/androidTest/java/tests/integration/ProxyFactoryTest.java +++ b/src/androidTest/java/tests/integration/ProxyFactoryTest.java @@ -5,6 +5,8 @@ import android.content.Context; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.test.platform.app.InstrumentationRegistry; import org.junit.After; @@ -26,9 +28,12 @@ import io.split.android.client.SplitFactoryBuilder; import io.split.android.client.api.Key; import io.split.android.client.events.SplitEvent; +import io.split.android.client.network.SplitAuthenticatedRequest; +import io.split.android.client.network.SplitAuthenticator; import io.split.android.client.service.impressions.ImpressionsMode; import io.split.android.client.service.synchronizer.ThreadUtils; import io.split.android.client.storage.db.SplitRoomDatabase; +import io.split.android.client.utils.logger.Logger; import io.split.android.client.utils.logger.SplitLogLevel; import okhttp3.mockwebserver.Dispatcher; import okhttp3.mockwebserver.MockResponse; @@ -175,4 +180,118 @@ public MockResponse dispatch(RecordedRequest request) { proxyServer.shutdown(); baseServer.shutdown(); } + + @Test + public void authenticatorIsUsed() throws IOException, InterruptedException { + + AtomicBoolean mySegmentsHit = new AtomicBoolean(false); + AtomicBoolean splitChangesHit = new AtomicBoolean(false); + CountDownLatch authLatch = new CountDownLatch(1); + CountDownLatch eventsLatch = new CountDownLatch(1); + CountDownLatch proxyAuthorizationHeaderLatch = new CountDownLatch(1); + + // init server + MockWebServer proxyServer = new MockWebServer(); + proxyServer.setDispatcher(new Dispatcher() { + @Override + public MockResponse dispatch(RecordedRequest request) { + String requestLine = request.getRequestLine(); + if (request.getHeader("Proxy-Authorization") != null) { + proxyAuthorizationHeaderLatch.countDown(); + } + if (requestLine.contains("/mySegments")) { + mySegmentsHit.set(true); + return new MockResponse().setResponseCode((request.getHeader("Proxy-Authorization") != null) ? 200 : 407).setBody("{\"mySegments\":[{ \"id\":\"id1\", \"name\":\"segment1\"}, { \"id\":\"id1\", \"name\":\"segment2\"}]}"); + } else if (requestLine.contains("splitChanges")) { + splitChangesHit.set(true); + return new MockResponse().setResponseCode((request.getHeader("Proxy-Authorization") != null) ? 200 : 407).setBody(mSplitChanges); + } else if (requestLine.contains("auth")) { + authLatch.countDown(); + return new MockResponse().setResponseCode((request.getHeader("Proxy-Authorization") != null) ? 200 : 407).setBody("{}"); + } else if (requestLine.contains("Impressions")) { + eventsLatch.countDown(); + return new MockResponse().setResponseCode((request.getHeader("Proxy-Authorization") != null) ? 200 : 407).setBody("{}"); + } else { + return new MockResponse().setResponseCode((request.getHeader("Proxy-Authorization") != null) ? 200 : 407).setBody("{}"); + } + } + }); + proxyServer.start(); + + MockWebServer baseServer = new MockWebServer(); + baseServer.setDispatcher(new Dispatcher() { + @Override + public MockResponse dispatch(RecordedRequest request) { + String requestLine = request.getRequestLine(); + return new MockResponse().setResponseCode(200); + } + }); + baseServer.start(); + + String url = baseServer.url("").toString(); + ServiceEndpoints endpoints = ServiceEndpoints.builder() + .apiEndpoint(url) + .eventsEndpoint(url) + .sseAuthServiceEndpoint(url) + .streamingServiceEndpoint(url) + .build(); + + // init db + Context context = InstrumentationRegistry.getInstrumentation().getContext(); + SplitRoomDatabase splitRoomDatabase = DatabaseHelper.getTestDatabase(context); + splitRoomDatabase.clearAllTables(); + + // init factory + Key key = IntegrationHelper.dummyUserKey(); + mSplitFactory = IntegrationHelper.buildFactory(IntegrationHelper.dummyApiKey(), + key, + new SplitClientConfig.Builder() + .serviceEndpoints(endpoints) + .proxyAuthenticator(new SplitAuthenticator() { + @Override + public SplitAuthenticatedRequest authenticate(@NonNull SplitAuthenticatedRequest request) { + request.setHeader("Proxy-Authorization", "Bearer 1234567890"); + return request; + } + }) + .impressionsMode(ImpressionsMode.DEBUG) + .impressionsQueueSize(1) + .impressionsChunkSize(1) + .impressionsPerPush(1) + .impressionsRefreshRate(1) + .proxyHost(proxyServer.url("").toString()) + .logLevel(SplitLogLevel.VERBOSE) + .build(), + context, null, splitRoomDatabase); + + // init client + SplitClient client = mSplitFactory.client(key); + CountDownLatch readyLatch = new CountDownLatch(1); + TestingHelper.TestEventTask readyTask = new TestingHelper.TestEventTask(readyLatch); + client.on(SplitEvent.SDK_READY, readyTask); + boolean await = readyLatch.await(10, TimeUnit.SECONDS); + if (!await) { + Assert.fail("SDK_READY event not received"); + } + + client.getTreatment("FACUNDO_TEST"); + client.getTreatment("FACUNDO_TEST"); + client.getTreatment("FACUNDO_TEST"); + Thread.sleep(500); + client.flush(); + + boolean awaitAuth = authLatch.await(5, TimeUnit.SECONDS); + boolean awaitEvents = eventsLatch.await(5, TimeUnit.SECONDS); + boolean awaitProxyAuthorizationHeader = proxyAuthorizationHeaderLatch.await(5, TimeUnit.SECONDS); + // assert + assertTrue(mySegmentsHit.get()); + assertTrue(splitChangesHit.get()); + assertTrue(awaitAuth); + assertTrue(awaitEvents); + assertTrue(awaitProxyAuthorizationHeader); + + // teardown + proxyServer.shutdown(); + baseServer.shutdown(); + } }