Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ val emojiVersion = "1.7.0"
val fidoVersion = "4.1.0-patch2"
val lifecycleVersion = "2.11.0"
val maplibreComposeVersion = "0.20.0"
val okhttpVersion = "4.12.0"
val okhttpVersion = "5.5.0"
val markwonVersion = "4.6.2"
val materialDialogsVersion = "3.3.0"
val parcelerVersion = "1.1.13"
Expand Down Expand Up @@ -386,7 +386,7 @@ dependencies {
// no version: consistent resolution aligns it with the tink that org.unifiedpush.android:connector ships
testImplementation("com.google.crypto.tink:tink")
testImplementation("androidx.room:room-testing:$roomVersion")
testImplementation("com.squareup.okhttp3:mockwebserver:$okhttpVersion")
testImplementation("com.squareup.okhttp3:mockwebserver3:$okhttpVersion")
testImplementation("com.squareup.okhttp3:okhttp-tls:$okhttpVersion")
testImplementation("com.google.dagger:hilt-android-testing:2.60.1")
testImplementation("org.robolectric:robolectric:4.17")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ class NetworkLoginDataSource(val okHttpClient: OkHttpClient) {
if (!response.isSuccessful) {
throw IOException("Unexpected code $response")
}
return response.body?.string()
return response.body.string()
}
}

Expand Down Expand Up @@ -129,7 +129,7 @@ class NetworkLoginDataSource(val okHttpClient: OkHttpClient) {
if (!response.isSuccessful) {
throw IOException("Unexpected code $response")
}
return response.body?.string()
return response.body.string()
}
}

Expand Down Expand Up @@ -157,9 +157,9 @@ class NetworkLoginDataSource(val okHttpClient: OkHttpClient) {
client.newCall(request).execute()
.use { response ->
val status: Int = response.code
val responseBody = response.body?.string()
val responseBody = response.body.string()

result = if (response.isSuccessful && responseBody?.isNotEmpty() == true) {
result = if (response.isSuccessful && responseBody.isNotEmpty()) {
val jsonObject = JsonParser.parseString(responseBody).asJsonObject
val server: String = jsonObject.get("server").asString
val loginName: String = jsonObject.get("loginName").asString
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient
import okhttp3.Protocol
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import java.io.File
import java.io.IOException
Expand Down Expand Up @@ -125,7 +126,7 @@ class FileUploader(
private fun createRequestBody(sourceFileUri: Uri): RequestBody? =
try {
val bytes = context.contentResolver.openInputStream(sourceFileUri)!!.use { it.readBytes() }
RequestBody.create("application/octet-stream".toMediaTypeOrNull(), bytes)
bytes.toRequestBody("application/octet-stream".toMediaTypeOrNull())
} catch (e: Exception) {
Log.e(TAG, "failed to create RequestBody for $sourceFileUri", e)
null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import junit.framework.TestCase.assertNotNull
import junit.framework.TestCase.assertNull
import okhttp3.Credentials
import okhttp3.OkHttpClient
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
import mockwebserver3.MockResponse
import mockwebserver3.MockWebServer
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
Expand Down Expand Up @@ -51,7 +51,7 @@ class NetworkLoginDataSourceTest {
"login":"https:\/\/cloud.example.com\/login\/v2\/flow\/guyjGtcKPTKCi4epIRIupIexgJ8wNInMFSfHabACRPZUkmEaWZSM54bFkFuzWksbps7jmTFQjeskLpyJXyhpHlgK8sZBn9HXLXjohIx5iXgJKdOkkZTYCzUWHlsg3YFg"
}
""".trimIndent()
val mockResponse = MockResponse().setBody(validResponse)
val mockResponse = MockResponse(body = validResponse)
server.enqueue(mockResponse)

val loginResponse = network.anonymouslyPostLoginRequest(httpUrl.toString())
Expand All @@ -61,11 +61,12 @@ class NetworkLoginDataSourceTest {
@Test
fun `testing anonymouslyPostLoginRequest error path`() {
val server = MockWebServer()
val invalidResponse = MockResponse()
val invalidResponse = MockResponse.Builder()
.addHeader("Content-Type", "application/json; charset=utf-8")
.addHeader("Cache-Control", "no-cache")
.setResponseCode(404)
.setBody("{}")
.code(404)
.body("{}")
.build()

server.start()
server.enqueue(invalidResponse)
Expand All @@ -87,7 +88,7 @@ class NetworkLoginDataSourceTest {
}
""".trimIndent()

val mockResponse = MockResponse().setBody(validResponse)
val mockResponse = MockResponse(body = validResponse)
server.enqueue(mockResponse)
server.start()
val httpUrl = server.url("index.php/login/v2")
Expand All @@ -107,8 +108,9 @@ class NetworkLoginDataSourceTest {
}
""".trimIndent()

val validResponse = MockResponse()
.setBody(validBody)
val validResponse = MockResponse.Builder()
.body(validBody)
.build()

server.enqueue(validResponse)
server.start()
Expand All @@ -127,11 +129,12 @@ class NetworkLoginDataSourceTest {
fun `testing performLoginFlowV2 error path`() {
val server = MockWebServer()

val invalidResponse = MockResponse()
val invalidResponse = MockResponse.Builder()
.addHeader("Content-Type", "application/json; charset=utf-8")
.addHeader("Cache-Control", "no-cache")
.setResponseCode(404)
.setBody("{}")
.code(404)
.body("{}")
.build()

server.enqueue(invalidResponse)
server.start()
Expand All @@ -156,8 +159,9 @@ class NetworkLoginDataSourceTest {
}
""".trimIndent()

val validResponse = MockResponse()
.setBody(validBody)
val validResponse = MockResponse.Builder()
.body(validBody)
.build()

server.enqueue(validResponse)
server.start()
Expand All @@ -175,7 +179,7 @@ class NetworkLoginDataSourceTest {
@Test(expected = NetworkLoginDataSource.TooManyLoginAttemptsException::class)
fun `testing oneTimePasswordRequest refused because of too many failed logins`() {
val server = MockWebServer()
server.enqueue(MockResponse().setResponseCode(429))
server.enqueue(MockResponse(code = 429))
server.start()

network.oneTimePasswordRequest(server.url("").toString(), Credentials.basic("username", "oneTimePassword"))
Expand All @@ -184,7 +188,7 @@ class NetworkLoginDataSourceTest {
@Test
fun `testing oneTimePasswordRequest error path`() {
val server = MockWebServer()
server.enqueue(MockResponse().setResponseCode(401))
server.enqueue(MockResponse(code = 401))
server.start()

val appPassword =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import com.nextcloud.talk.api.NcApiCoroutines
import com.nextcloud.talk.data.user.model.User
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
import okhttp3.mockwebserver.SocketPolicy
import mockwebserver3.MockResponse
import mockwebserver3.MockWebServer
import mockwebserver3.SocketEffect
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Before
Expand Down Expand Up @@ -63,7 +63,7 @@ class ChunkedFileUploaderAbortTest {

@After
fun tearDown() {
server.shutdown()
server.close()
}

@Test
Expand All @@ -77,7 +77,7 @@ class ChunkedFileUploaderAbortTest {
@Test
fun `does not throw and does not report success when the connection drops`() {
val uploader = startedUploader()
server.enqueue(MockResponse().apply { socketPolicy = SocketPolicy.DISCONNECT_AFTER_REQUEST })
server.enqueue(MockResponse.Builder().onResponseStart(SocketEffect.CloseSocket()).build())

uploader.abortUpload { successCalls++ }

Expand All @@ -87,7 +87,7 @@ class ChunkedFileUploaderAbortTest {
@Test
fun `does not throw and does not report success on a server error`() {
val uploader = startedUploader()
server.enqueue(MockResponse().setResponseCode(SERVER_ERROR))
server.enqueue(MockResponse(code = SERVER_ERROR))

uploader.abortUpload { successCalls++ }

Expand All @@ -97,7 +97,7 @@ class ChunkedFileUploaderAbortTest {
@Test
fun `reports success when the upload folder is already gone`() {
val uploader = startedUploader()
server.enqueue(MockResponse().setResponseCode(NOT_FOUND))
server.enqueue(MockResponse(code = NOT_FOUND))

uploader.abortUpload { successCalls++ }

Expand All @@ -107,7 +107,7 @@ class ChunkedFileUploaderAbortTest {
@Test
fun `reports success when the upload folder is deleted`() {
val uploader = startedUploader()
server.enqueue(MockResponse().setResponseCode(NO_CONTENT))
server.enqueue(MockResponse(code = NO_CONTENT))

uploader.abortUpload { successCalls++ }

Expand All @@ -117,15 +117,15 @@ class ChunkedFileUploaderAbortTest {
@Test
fun `does not throw when the success callback throws`() {
val uploader = startedUploader()
server.enqueue(MockResponse().setResponseCode(NO_CONTENT))
server.enqueue(MockResponse(code = NO_CONTENT))

uploader.abortUpload { throw IllegalStateException("callback failed") }
}

@Test
fun `does not throw when the success callback throws for a folder that is already gone`() {
val uploader = startedUploader()
server.enqueue(MockResponse().setResponseCode(NOT_FOUND))
server.enqueue(MockResponse(code = NOT_FOUND))

uploader.abortUpload { throw IllegalStateException("callback failed") }
}
Expand All @@ -135,9 +135,9 @@ class ChunkedFileUploaderAbortTest {
/** Runs a rejected upload so the uploader knows its upload folder, then drops the recorded requests. */
private fun startedUploader(): ChunkedFileUploader {
val file = tempFolder.newFile("test.txt").apply { writeBytes(ByteArray(FILE_SIZE)) }
server.enqueue(MockResponse().setResponseCode(CREATED))
server.enqueue(MockResponse().setResponseCode(NOT_FOUND))
server.enqueue(MockResponse().setResponseCode(FORBIDDEN))
server.enqueue(MockResponse(code = CREATED))
server.enqueue(MockResponse(code = NOT_FOUND))
server.enqueue(MockResponse(code = FORBIDDEN))
val uploader = uploader()
uploader.upload(file, "text/plain".toMediaType(), "/Talk/test.txt")
repeat(server.requestCount) { server.takeRequest(1, TimeUnit.SECONDS) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import com.nextcloud.talk.api.NcApiCoroutines
import com.nextcloud.talk.data.user.model.User
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
import okhttp3.mockwebserver.SocketPolicy
import mockwebserver3.MockResponse
import mockwebserver3.MockWebServer
import mockwebserver3.SocketEffect
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
Expand Down Expand Up @@ -68,17 +68,17 @@ class ChunkedFileUploaderTest {

@After
fun tearDown() {
server.shutdown()
server.close()
}

@Test
fun `uploads the chunk and assembles the file on the happy path`() {
val file = localFile(SMALL_FILE_SIZE)
enqueueFolderCreated()
enqueueNoChunksOnServer()
server.enqueue(MockResponse().setResponseCode(CREATED))
server.enqueue(MockResponse().setResponseCode(CREATED))
server.enqueue(MockResponse().setResponseCode(CREATED))
server.enqueue(MockResponse(code = CREATED))
server.enqueue(MockResponse(code = CREATED))
server.enqueue(MockResponse(code = CREATED))

val result = uploader().upload(file, MIME_TYPE, TARGET_PATH)

Expand All @@ -91,7 +91,7 @@ class ChunkedFileUploaderTest {
val file = localFile(SMALL_FILE_SIZE)
enqueueFolderCreated()
enqueueNoChunksOnServer()
server.enqueue(MockResponse().apply { socketPolicy = SocketPolicy.DISCONNECT_AFTER_REQUEST })
server.enqueue(MockResponse.Builder().onResponseStart(SocketEffect.CloseSocket()).build())

assertThrows(IOException::class.java) {
uploader().upload(file, MIME_TYPE, TARGET_PATH)
Expand All @@ -105,7 +105,7 @@ class ChunkedFileUploaderTest {
val file = localFile(SMALL_FILE_SIZE)
enqueueFolderCreated()
enqueueNoChunksOnServer()
server.enqueue(MockResponse().setResponseCode(FORBIDDEN))
server.enqueue(MockResponse(code = FORBIDDEN))

val result = uploader().upload(file, MIME_TYPE, TARGET_PATH)

Expand All @@ -118,9 +118,9 @@ class ChunkedFileUploaderTest {
val file = localFile(SMALL_FILE_SIZE)
enqueueFolderCreated()
enqueueNoChunksOnServer()
server.enqueue(MockResponse().setResponseCode(CREATED))
server.enqueue(MockResponse().setResponseCode(CREATED))
server.enqueue(MockResponse().setResponseCode(FORBIDDEN))
server.enqueue(MockResponse(code = CREATED))
server.enqueue(MockResponse(code = CREATED))
server.enqueue(MockResponse(code = FORBIDDEN))

val result = uploader().upload(file, MIME_TYPE, TARGET_PATH)

Expand All @@ -133,11 +133,11 @@ class ChunkedFileUploaderTest {
private fun localFile(size: Int): File = tempFolder.newFile("test.txt").apply { writeBytes(ByteArray(size)) }

private fun enqueueFolderCreated() {
server.enqueue(MockResponse().setResponseCode(CREATED))
server.enqueue(MockResponse(code = CREATED))
}

private fun enqueueNoChunksOnServer() {
server.enqueue(MockResponse().setResponseCode(NOT_FOUND))
server.enqueue(MockResponse(code = NOT_FOUND))
}

private fun takeRequests() = (0 until server.requestCount).map { server.takeRequest(1, TimeUnit.SECONDS)!! }
Expand Down
Loading
Loading