diff --git a/CHANGELOG.md b/CHANGELOG.md
index 630b8583..7093b89b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,7 @@
## Unreleased
+* Updating to latest version of OkHttp3 ([3.9.0](https://github.com/square/okhttp/blob/master/CHANGELOG.md#version-390))
+
## 2.14.1 (July 27, 2017)
* Switch to an internal implementation of `isEmptyString` instead of Android TextUtils.
diff --git a/pom.xml b/pom.xml
index 099a66b0..d4c90a1b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,12 +20,12 @@
com.squareup.okhttp3
okhttp
- 3.0.1
+ 3.9.0
com.squareup.okhttp3
mockwebserver
- 3.0.1
+ 3.9.0
test
diff --git a/test/com/amplitude/api/AmplitudeClientTest.java b/test/com/amplitude/api/AmplitudeClientTest.java
index 21ad5093..07a1c7e9 100644
--- a/test/com/amplitude/api/AmplitudeClientTest.java
+++ b/test/com/amplitude/api/AmplitudeClientTest.java
@@ -10,16 +10,23 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Matchers;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowLooper;
+import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
+import okhttp3.Call;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.RecordedRequest;
@@ -1519,4 +1526,33 @@ public void testSendNullEvents() throws JSONException {
assertEquals(events.length(), 1);
assertEquals(events.optJSONObject(0).optString("event_type"), "test event");
}
+
+ @Test
+ @PrepareForTest(OkHttpClient.class)
+ public void testHandleUploadExceptions() throws Exception {
+ ShadowLooper logLooper = Shadows.shadowOf(amplitude.logThread.getLooper());
+ ShadowLooper httpLooper = Shadows.shadowOf(amplitude.httpThread.getLooper());
+ IOException error = new IOException("test IO Exception");
+
+ // mock out client
+ OkHttpClient oldClient = amplitude.httpClient;
+ OkHttpClient mockClient = PowerMockito.mock(OkHttpClient.class);
+
+ // need to have mock client return mock call that throws exception
+ Call mockCall = PowerMockito.mock(Call.class);
+ PowerMockito.when(mockCall.execute()).thenThrow(error);
+ PowerMockito.when(mockClient.newCall(Matchers.any(Request.class))).thenReturn(mockCall);
+
+ // attach mock client to amplitude
+ amplitude.httpClient = mockClient;
+ amplitude.logEvent("test event");
+ logLooper.runToEndOfTasks();
+ logLooper.runToEndOfTasks();
+ httpLooper.runToEndOfTasks();
+
+ assertEquals(amplitude.lastError, error);
+
+ // restore old client
+ amplitude.httpClient = oldClient;
+ }
}