From 91b5e437902a1ffd0b9bdb6fce28f3339baeeec3 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaitsev Date: Thu, 24 Mar 2016 15:29:53 +0200 Subject: [PATCH] Bump Retrofit version to 2.0.0 --- .../network/OkHttpInterceptorsModule.java | 7 ++- .../rules/MockWebServerRule.java | 2 +- .../QualityMattersRestApiIntegrationTest.java | 2 +- .../qualitymatters/ApplicationComponent.java | 4 +- .../qualitymatters/QualityMattersApp.java | 2 +- .../qualitymatters/api/ApiModule.java | 13 ++--- .../qualitymatters/api/ChangeableBaseUrl.java | 30 ------------ .../network/HostSelectionInterceptor.java | 47 +++++++++++++++++++ .../api/ChangeableBaseUrlTest.java | 23 --------- .../network/HostSelectionInterceptorTest.java | 22 +++++++++ dependencies.gradle | 2 +- 11 files changed, 84 insertions(+), 70 deletions(-) delete mode 100644 app/src/main/java/com/artemzin/qualitymatters/api/ChangeableBaseUrl.java create mode 100644 app/src/main/java/com/artemzin/qualitymatters/network/HostSelectionInterceptor.java delete mode 100644 app/src/unitTests/java/com/artemzin/qualitymatters/api/ChangeableBaseUrlTest.java create mode 100644 app/src/unitTests/java/com/artemzin/qualitymatters/network/HostSelectionInterceptorTest.java diff --git a/app/src/debug/java/com/artemzin/qualitymatters/network/OkHttpInterceptorsModule.java b/app/src/debug/java/com/artemzin/qualitymatters/network/OkHttpInterceptorsModule.java index 2684b8a..0a44c10 100644 --- a/app/src/debug/java/com/artemzin/qualitymatters/network/OkHttpInterceptorsModule.java +++ b/app/src/debug/java/com/artemzin/qualitymatters/network/OkHttpInterceptorsModule.java @@ -14,7 +14,9 @@ import okhttp3.logging.HttpLoggingInterceptor; import timber.log.Timber; +import static java.util.Arrays.asList; import static java.util.Collections.singletonList; +import static java.util.Collections.unmodifiableList; /** * Provides OkHttp interceptors for debug build. @@ -29,8 +31,9 @@ public HttpLoggingInterceptor provideHttpLoggingInterceptor() { } @Provides @OkHttpInterceptors @Singleton @NonNull - public List provideOkHttpInterceptors(@NonNull HttpLoggingInterceptor httpLoggingInterceptor) { - return singletonList(httpLoggingInterceptor); + public List provideOkHttpInterceptors(@NonNull HttpLoggingInterceptor httpLoggingInterceptor, + @NonNull HostSelectionInterceptor hostSelectionInterceptor) { + return unmodifiableList(asList(httpLoggingInterceptor, hostSelectionInterceptor)); } @Provides @OkHttpNetworkInterceptors @Singleton @NonNull diff --git a/app/src/functionalTests/java/com/artemzin/qualitymatters/functional_tests/rules/MockWebServerRule.java b/app/src/functionalTests/java/com/artemzin/qualitymatters/functional_tests/rules/MockWebServerRule.java index 5e7ceb4..b7e85f0 100644 --- a/app/src/functionalTests/java/com/artemzin/qualitymatters/functional_tests/rules/MockWebServerRule.java +++ b/app/src/functionalTests/java/com/artemzin/qualitymatters/functional_tests/rules/MockWebServerRule.java @@ -36,7 +36,7 @@ public void evaluate() throws Throwable { final MockWebServer mockWebServer = new MockWebServer(); mockWebServer.start(); - TestUtils.app().applicationComponent().changeableBaseUrl().setBaseUrl(mockWebServer.url("").toString()); + TestUtils.app().applicationComponent().hostSelectionInterceptor().setBaseUrl(mockWebServer.url("").toString()); if (!needsMockWebServer.setupMethod().isEmpty()) { final Method setupMethod = testClassInstance.getClass().getDeclaredMethod(needsMockWebServer.setupMethod(), MockWebServer.class); diff --git a/app/src/integrationTests/java/com/artemzin/qualitymatters/integration_tests/api/QualityMattersRestApiIntegrationTest.java b/app/src/integrationTests/java/com/artemzin/qualitymatters/integration_tests/api/QualityMattersRestApiIntegrationTest.java index e083739..18b35af 100644 --- a/app/src/integrationTests/java/com/artemzin/qualitymatters/integration_tests/api/QualityMattersRestApiIntegrationTest.java +++ b/app/src/integrationTests/java/com/artemzin/qualitymatters/integration_tests/api/QualityMattersRestApiIntegrationTest.java @@ -47,7 +47,7 @@ public void beforeEachTest() throws IOException { mockWebServer.start(); // Change base url to the mocked - QualityMattersIntegrationRobolectricTestRunner.qualityMattersApp().applicationComponent().changeableBaseUrl().setBaseUrl(mockWebServer.url("").toString()); + QualityMattersIntegrationRobolectricTestRunner.qualityMattersApp().applicationComponent().hostSelectionInterceptor().setBaseUrl(mockWebServer.url("").toString()); qualityMattersRestApi = QualityMattersIntegrationRobolectricTestRunner.qualityMattersApp().applicationComponent().qualityMattersApi(); } diff --git a/app/src/main/java/com/artemzin/qualitymatters/ApplicationComponent.java b/app/src/main/java/com/artemzin/qualitymatters/ApplicationComponent.java index 2f22651..5f4a786 100644 --- a/app/src/main/java/com/artemzin/qualitymatters/ApplicationComponent.java +++ b/app/src/main/java/com/artemzin/qualitymatters/ApplicationComponent.java @@ -3,12 +3,12 @@ import android.support.annotation.NonNull; import com.artemzin.qualitymatters.api.ApiModule; -import com.artemzin.qualitymatters.api.ChangeableBaseUrl; import com.artemzin.qualitymatters.api.QualityMattersRestApi; import com.artemzin.qualitymatters.developer_settings.DeveloperSettingsComponent; import com.artemzin.qualitymatters.developer_settings.DeveloperSettingsModule; import com.artemzin.qualitymatters.developer_settings.LeakCanaryProxy; import com.artemzin.qualitymatters.models.ModelsModule; +import com.artemzin.qualitymatters.network.HostSelectionInterceptor; import com.artemzin.qualitymatters.network.NetworkModule; import com.artemzin.qualitymatters.network.OkHttpInterceptorsModule; import com.artemzin.qualitymatters.performance.AsyncJobsModule; @@ -42,7 +42,7 @@ public interface ApplicationComponent { QualityMattersRestApi qualityMattersApi(); @NonNull - ChangeableBaseUrl changeableBaseUrl(); + HostSelectionInterceptor hostSelectionInterceptor(); // Provide AsyncJobObserver from the real app to the tests without need in injection to the test. @NonNull diff --git a/app/src/main/java/com/artemzin/qualitymatters/QualityMattersApp.java b/app/src/main/java/com/artemzin/qualitymatters/QualityMattersApp.java index 148163b..702b854 100644 --- a/app/src/main/java/com/artemzin/qualitymatters/QualityMattersApp.java +++ b/app/src/main/java/com/artemzin/qualitymatters/QualityMattersApp.java @@ -62,7 +62,7 @@ public void onCreate() { protected DaggerApplicationComponent.Builder prepareApplicationComponent() { return DaggerApplicationComponent.builder() .applicationModule(new ApplicationModule(this)) - // This url may be changed dynamically for tests! See ChangeableBaseUrl. + // This url may be changed dynamically for tests! See HostSelectionInterceptor. .apiModule(new ApiModule("https://raw.githubusercontent.com/artem-zinnatullin/qualitymatters/master/rest_api/")); } diff --git a/app/src/main/java/com/artemzin/qualitymatters/api/ApiModule.java b/app/src/main/java/com/artemzin/qualitymatters/api/ApiModule.java index 8bc324c..49fd13c 100644 --- a/app/src/main/java/com/artemzin/qualitymatters/api/ApiModule.java +++ b/app/src/main/java/com/artemzin/qualitymatters/api/ApiModule.java @@ -18,21 +18,16 @@ public class ApiModule { @NonNull - private final ChangeableBaseUrl changeableBaseUrl; + private final String baseUrl; public ApiModule(@NonNull String baseUrl) { - changeableBaseUrl = new ChangeableBaseUrl(baseUrl); + this.baseUrl = baseUrl; } @Provides @NonNull @Singleton - public ChangeableBaseUrl provideChangeableBaseUrl() { - return changeableBaseUrl; - } - - @Provides @NonNull @Singleton - public QualityMattersRestApi provideQualityMattersApi(@NonNull OkHttpClient okHttpClient, @NonNull ObjectMapper objectMapper, @NonNull ChangeableBaseUrl changeableBaseUrl) { + public QualityMattersRestApi provideQualityMattersApi(@NonNull OkHttpClient okHttpClient, @NonNull ObjectMapper objectMapper) { return new Retrofit.Builder() - .baseUrl(changeableBaseUrl) + .baseUrl(baseUrl) .client(okHttpClient) .addConverterFactory(JacksonConverterFactory.create(objectMapper)) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) diff --git a/app/src/main/java/com/artemzin/qualitymatters/api/ChangeableBaseUrl.java b/app/src/main/java/com/artemzin/qualitymatters/api/ChangeableBaseUrl.java deleted file mode 100644 index 891e205..0000000 --- a/app/src/main/java/com/artemzin/qualitymatters/api/ChangeableBaseUrl.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.artemzin.qualitymatters.api; - -import android.support.annotation.NonNull; - -import java.util.concurrent.atomic.AtomicReference; - -import okhttp3.HttpUrl; -import retrofit2.BaseUrl; - -/** - * Such implementation allows us easily change base url in the integration and functional tests! - */ -public class ChangeableBaseUrl implements BaseUrl { - - @NonNull - private final AtomicReference baseUrl; - - public ChangeableBaseUrl(@NonNull String baseUrl) { - this.baseUrl = new AtomicReference<>(HttpUrl.parse(baseUrl)); - } - - public void setBaseUrl(@NonNull String baseUrl) { - this.baseUrl.set(HttpUrl.parse(baseUrl)); - } - - @Override @NonNull - public HttpUrl url() { - return baseUrl.get(); - } -} diff --git a/app/src/main/java/com/artemzin/qualitymatters/network/HostSelectionInterceptor.java b/app/src/main/java/com/artemzin/qualitymatters/network/HostSelectionInterceptor.java new file mode 100644 index 0000000..0ab605a --- /dev/null +++ b/app/src/main/java/com/artemzin/qualitymatters/network/HostSelectionInterceptor.java @@ -0,0 +1,47 @@ +package com.artemzin.qualitymatters.network; + +import java.io.IOException; +import javax.inject.Inject; +import javax.inject.Singleton; +import okhttp3.HttpUrl; +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +/** + * Such implementation allows us easily change base url in the integration and functional tests! + */ +@Singleton +public class HostSelectionInterceptor implements Interceptor { + + private volatile String baseUrl; + + @Inject + public HostSelectionInterceptor() { + // Add a no-argument constructor with the @Inject annotation to indicate that Dagger may create instances. + } + + @Override + public Response intercept(Chain chain) throws IOException { + Request request = chain.request(); + final String host = baseUrl; + if (host != null) { + final HttpUrl newUrl = request.url() + .newBuilder() + .host(host) + .build(); + request = request.newBuilder() + .url(newUrl) + .build(); + } + return chain.proceed(request); + } + + public void setBaseUrl(String baseUrl) { + this.baseUrl = baseUrl; + } + + public String getBaseUrl() { + return baseUrl; + } +} diff --git a/app/src/unitTests/java/com/artemzin/qualitymatters/api/ChangeableBaseUrlTest.java b/app/src/unitTests/java/com/artemzin/qualitymatters/api/ChangeableBaseUrlTest.java deleted file mode 100644 index 6c9436e..0000000 --- a/app/src/unitTests/java/com/artemzin/qualitymatters/api/ChangeableBaseUrlTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.artemzin.qualitymatters.api; - -import org.junit.Test; - -import okhttp3.HttpUrl; - -import static org.assertj.core.api.Assertions.assertThat; - -public class ChangeableBaseUrlTest { - - @Test - public void constructor_shouldUsePassedBaseUrl() { - ChangeableBaseUrl changeableBaseUrl = new ChangeableBaseUrl("https://artemzin.com"); - assertThat(changeableBaseUrl.url()).isEqualTo(HttpUrl.parse("https://artemzin.com")); - } - - @Test - public void setBaseUrl() { - ChangeableBaseUrl changeableBaseUrl = new ChangeableBaseUrl("https://1"); - changeableBaseUrl.setBaseUrl("https://2"); - assertThat(changeableBaseUrl.url()).isEqualTo(HttpUrl.parse("https://2")); - } -} \ No newline at end of file diff --git a/app/src/unitTests/java/com/artemzin/qualitymatters/network/HostSelectionInterceptorTest.java b/app/src/unitTests/java/com/artemzin/qualitymatters/network/HostSelectionInterceptorTest.java new file mode 100644 index 0000000..aa901a3 --- /dev/null +++ b/app/src/unitTests/java/com/artemzin/qualitymatters/network/HostSelectionInterceptorTest.java @@ -0,0 +1,22 @@ +package com.artemzin.qualitymatters.network; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class HostSelectionInterceptorTest { + + private static final String BASE_URL = "http://www.example.com"; + private HostSelectionInterceptor interceptor = new HostSelectionInterceptor(); + + @Test + public void shouldNotHaveBaseUrlAfterCreation() { + assertThat(interceptor.getBaseUrl()).isNull(); + } + + @Test + public void shouldStoreBaseUrl() { + interceptor.setBaseUrl(BASE_URL); + assertThat(interceptor.getBaseUrl()).isEqualTo(BASE_URL); + } +} \ No newline at end of file diff --git a/dependencies.gradle b/dependencies.gradle index 003f2f1..384ad8b 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -21,7 +21,7 @@ ext.versions = [ rxJava : '1.1.2', supportLibs : '23.1.1', okHttp : '3.2.0', - retrofit : '2.0.0-beta4', + retrofit : '2.0.0', jackson : '2.6.3', autoValue : '1.2-rc1', butterKnife : '7.0.1',