65 lines
2.3 KiB
Kotlin
65 lines
2.3 KiB
Kotlin
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
package org.mozilla.fenix.helpers
|
|
|
|
import android.os.Handler
|
|
import android.os.Looper
|
|
import androidx.test.platform.app.InstrumentationRegistry
|
|
import okhttp3.mockwebserver.Dispatcher
|
|
import okhttp3.mockwebserver.MockResponse
|
|
import okhttp3.mockwebserver.MockWebServer
|
|
import okhttp3.mockwebserver.RecordedRequest
|
|
import okio.Buffer
|
|
import okio.source
|
|
import java.io.IOException
|
|
import java.io.InputStream
|
|
|
|
/**
|
|
* A [MockWebServer] [Dispatcher] that will return a generic search results page in the body of
|
|
* requests and responds with status 200.
|
|
*
|
|
* If the dispatcher is unable to read a requested asset, it will fail the test by throwing an
|
|
* Exception on the main thread.
|
|
*
|
|
* @sample [org.mozilla.fenix.ui.SearchTest]
|
|
*/
|
|
class SearchDispatcher : Dispatcher() {
|
|
private val mainThreadHandler = Handler(Looper.getMainLooper())
|
|
|
|
override fun dispatch(request: RecordedRequest): MockResponse {
|
|
val assetManager = InstrumentationRegistry.getInstrumentation().context.assets
|
|
try {
|
|
// When we perform a search with the custom search engine, returns the generic4.html test page as search results
|
|
if (request.path!!.contains("searchResults.html?search=")) {
|
|
MockResponse().setResponseCode(HTTP_OK)
|
|
val path = "pages/generic4.html"
|
|
assetManager.open(path).use { inputStream ->
|
|
return fileToResponse(inputStream)
|
|
}
|
|
}
|
|
return MockResponse().setResponseCode(HTTP_NOT_FOUND)
|
|
} catch (e: IOException) {
|
|
// e.g. file not found.
|
|
// We're on a background thread so we need to forward the exception to the main thread.
|
|
mainThreadHandler.postAtFrontOfQueue { throw e }
|
|
return MockResponse().setResponseCode(HTTP_NOT_FOUND)
|
|
}
|
|
}
|
|
}
|
|
|
|
@Throws(IOException::class)
|
|
private fun fileToResponse(file: InputStream): MockResponse {
|
|
return MockResponse()
|
|
.setResponseCode(HTTP_OK)
|
|
.setBody(fileToBytes(file))
|
|
}
|
|
|
|
@Throws(IOException::class)
|
|
private fun fileToBytes(file: InputStream): Buffer {
|
|
val result = Buffer()
|
|
result.writeAll(file.source())
|
|
return result
|
|
}
|