@@ -8,23 +8,21 @@ import android.content.ContentResolver
88import android.content.Context
99import android.net.Uri
1010import androidx.test.platform.app.InstrumentationRegistry
11- import at.bitfire.icsdroid.HttpUtils.toAndroidUri
11+ import at.bitfire.icsdroid.MockEngineWrapper.engine
1212import at.bitfire.icsdroid.test.BuildConfig
1313import at.bitfire.icsdroid.test.R
14- import kotlinx.coroutines.Dispatchers
14+ import io.ktor.client.utils.buildHeaders
15+ import io.ktor.http.ContentType
16+ import io.ktor.http.HttpHeaders
17+ import io.ktor.http.HttpStatusCode
18+ import io.ktor.http.headers
1519import kotlinx.coroutines.runBlocking
16- import kotlinx.coroutines.withContext
17- import okhttp3.MediaType
18- import okhttp3.mockwebserver.MockResponse
19- import okhttp3.mockwebserver.MockWebServer
20- import org.junit.AfterClass
2120import org.junit.Assert.assertArrayEquals
2221import org.junit.Assert.assertEquals
23- import org.junit.BeforeClass
22+ import org.junit.Before
2423import org.junit.Test
2524import java.io.IOException
2625import java.io.InputStream
27- import java.net.HttpURLConnection
2826import java.util.LinkedList
2927
3028class CalendarFetcherTest {
@@ -34,29 +32,21 @@ class CalendarFetcherTest {
3432 val appContext: Context by lazy { InstrumentationRegistry .getInstrumentation().targetContext }
3533 val testContext: Context by lazy { InstrumentationRegistry .getInstrumentation().context }
3634
37- val server = MockWebServer ()
38-
39- @BeforeClass
40- @JvmStatic
41- fun setUp () {
42- server.start()
43- }
44-
45- @AfterClass
46- @JvmStatic
47- fun tearDown () {
48- server.shutdown()
49- }
35+ }
5036
37+ @Before
38+ fun setUp () {
39+ MockEngineWrapper .clear()
5140 }
5241
5342 @Test
5443 fun testFetchLocal_readsCorrectly () {
44+ val client = HttpClient (appContext, engine)
5545 val uri = Uri .parse(" ${ContentResolver .SCHEME_ANDROID_RESOURCE } ://${BuildConfig .APPLICATION_ID } /${R .raw.vienna_evolution} " )
5646
5747 var ical: String? = null
58- val fetcher = object : CalendarFetcher (appContext, uri) {
59- override suspend fun onSuccess (data : InputStream , contentType : MediaType ? , eTag : String? , lastModified : Long? , displayName : String? ) {
48+ val fetcher = object : CalendarFetcher (appContext, uri, client ) {
49+ override suspend fun onSuccess (data : InputStream , contentType : ContentType ? , eTag : String? , lastModified : Long? , displayName : String? ) {
6050 ical = data.bufferedReader().use { it.readText() }
6151 }
6252 }
@@ -72,25 +62,29 @@ class CalendarFetcherTest {
7262
7363 @Test
7464 fun testFetchNetwork_success () {
65+ val client = HttpClient (appContext, engine)
7566 val etagCorrect = " 33a64df551425fcc55e4d42a148795d9f25f89d4"
7667 val lastModifiedCorrect = " Wed, 21 Oct 2015 07:28:00 GMT" // UNIX timestamp 1445405280
7768 val icalCorrect = testContext.resources.openRawResource(R .raw.vienna_evolution).use { streamCorrect ->
7869 streamCorrect.bufferedReader().use { it.readText() }
7970 }
8071
8172 // create mock response
82- server.enqueue(MockResponse ()
83- .setResponseCode(HttpURLConnection .HTTP_OK )
84- .addHeader(" ETag" , etagCorrect)
85- .addHeader(" Last-Modified" , lastModifiedCorrect)
86- .setBody(icalCorrect))
73+ MockEngineWrapper .enqueue(
74+ content = icalCorrect,
75+ status = HttpStatusCode .OK ,
76+ headers = buildHeaders {
77+ append(HttpHeaders .ETag , etagCorrect)
78+ append(HttpHeaders .LastModified , lastModifiedCorrect)
79+ }
80+ )
8781
8882 // make request to local mock server
8983 var ical: String? = null
9084 var etag: String? = null
9185 var lastmod: Long? = null
92- val fetcher = object : CalendarFetcher (appContext, server.url( " / " ).toAndroidUri() ) {
93- override suspend fun onSuccess (data : InputStream , contentType : MediaType ? , eTag : String? , lastModified : Long? , displayName : String? ) {
86+ val fetcher = object : CalendarFetcher (appContext, MockEngineWrapper .uri(), client ) {
87+ override suspend fun onSuccess (data : InputStream , contentType : ContentType ? , eTag : String? , lastModified : Long? , displayName : String? ) {
9488 ical = data.bufferedReader().use { it.readText() }
9589 etag = eTag
9690 lastmod = lastModified
@@ -108,30 +102,41 @@ class CalendarFetcherTest {
108102
109103 @Test
110104 fun testFetchNetwork_onRedirectWithLocation () {
105+ val client = HttpClient (appContext, engine)
106+
111107 // create mock responses:
112108 // 1. redirect with absolute target URL
113- server.enqueue(MockResponse ()
114- .setResponseCode(HttpURLConnection .HTTP_MOVED_TEMP )
115- .addHeader(" Location" , server.url(" new-location/vienna-evolution.ics" )))
109+ MockEngineWrapper .enqueue(
110+ status = HttpStatusCode .TemporaryRedirect ,
111+ headers = headers {
112+ append(
113+ HttpHeaders .Location , MockEngineWrapper .uri(" new-location" , " vienna-evolution.ics" ).toString()
114+ )
115+ }
116+ )
116117 // 2. redirect with relative target URL
117- server.enqueue(MockResponse ()
118- .setResponseCode(HttpURLConnection .HTTP_MOVED_TEMP )
119- .addHeader(" Location" , " the-file-is-here" ))
118+ MockEngineWrapper .enqueue(
119+ status = HttpStatusCode .TemporaryRedirect ,
120+ headers = headers {
121+ append(HttpHeaders .Location , " the-file-is-here" )
122+ }
123+ )
120124 // 3. finally the real resource
121- server.enqueue(MockResponse ()
122- .setResponseCode(HttpURLConnection .HTTP_OK )
123- .setBody(" icalCorrect" ))
125+ MockEngineWrapper .enqueue(
126+ content = " icalCorrect" ,
127+ status = HttpStatusCode .OK
128+ )
124129
125130 // make initial request to local mock server
126- val baseUrl = server.url( " / " ).toAndroidUri ()
131+ val baseUrl = MockEngineWrapper .uri ()
127132 var ical: String? = null
128133 val redirects = LinkedList <Uri >()
129- val fetcher = object : CalendarFetcher (appContext, baseUrl) {
130- override suspend fun onRedirect (httpCode : Int , target : Uri ) {
134+ val fetcher = object : CalendarFetcher (appContext, baseUrl, client ) {
135+ override suspend fun onRedirect (httpCode : HttpStatusCode , target : Uri ) {
131136 redirects + = target
132137 super .onRedirect(httpCode, target)
133138 }
134- override suspend fun onSuccess (data : InputStream , contentType : MediaType ? , eTag : String? , lastModified : Long? , displayName : String? ) {
139+ override suspend fun onSuccess (data : InputStream , contentType : ContentType ? , eTag : String? , lastModified : Long? , displayName : String? ) {
135140 ical = data.bufferedReader().use { it.readText() }
136141 }
137142 }
@@ -157,12 +162,13 @@ class CalendarFetcherTest {
157162
158163 @Test
159164 fun testFetchNetwork_onRedirectWithoutLocation () {
160- server.enqueue(MockResponse ()
161- .setResponseCode(HttpURLConnection .HTTP_MOVED_TEMP ))
165+ val client = HttpClient (appContext, engine)
166+
167+ MockEngineWrapper .enqueue(status = HttpStatusCode .TemporaryRedirect )
162168
163169 var e: Exception ? = null
164170 runBlocking {
165- object : CalendarFetcher (appContext, server.url( " / " ).toAndroidUri() ) {
171+ object : CalendarFetcher (appContext, MockEngineWrapper .uri(), client ) {
166172 override suspend fun onError (error : Exception ) {
167173 e = error
168174 }
@@ -174,12 +180,12 @@ class CalendarFetcherTest {
174180
175181 @Test
176182 fun testFetchNetwork_onNotModified () {
177- server.enqueue( MockResponse ( )
178- .setResponseCode( HttpURLConnection . HTTP_NOT_MODIFIED ) )
183+ val client = HttpClient (appContext, engine )
184+ MockEngineWrapper .enqueue(status = HttpStatusCode . NotModified )
179185
180186 var notModified = false
181187 runBlocking {
182- object : CalendarFetcher (appContext, server.url( " / " ).toAndroidUri() ) {
188+ object : CalendarFetcher (appContext, MockEngineWrapper .uri(), client ) {
183189 override suspend fun onNotModified () {
184190 notModified = true
185191 }
@@ -191,12 +197,12 @@ class CalendarFetcherTest {
191197
192198 @Test
193199 fun testFetchNetwork_onError () {
194- server.enqueue( MockResponse ( )
195- .setResponseCode( HttpURLConnection . HTTP_NOT_FOUND ) )
200+ val client = HttpClient (appContext, engine )
201+ MockEngineWrapper .enqueue(status = HttpStatusCode . NotFound )
196202
197203 var e: Exception ? = null
198204 runBlocking {
199- object : CalendarFetcher (appContext, server.url( " / " ).toAndroidUri() ) {
205+ object : CalendarFetcher (appContext, MockEngineWrapper .uri(), client ) {
200206 override suspend fun onError (error : Exception ) {
201207 e = error
202208 }
0 commit comments