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
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.telefonica.androidsnaptesting

import android.os.Environment
import androidx.test.platform.app.InstrumentationRegistry
import java.io.File

internal class Directories {

internal val context = InstrumentationRegistry.getInstrumentation().context
private val downloadDir = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath
)
private val androidSnaptestingDir = File(downloadDir, "android-snaptesting/${context.packageName}")
internal val failuresDir = File(androidSnaptestingDir, "failures")
internal val recordedDir = File(androidSnaptestingDir, "recorded")
internal val goldenFilesDir = "android-snaptesting-golden-files"
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.telefonica.androidsnaptesting
package com.telefonica.androidsnaptesting.logs

import java.lang.StringBuilder

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.telefonica.androidsnaptesting
package com.telefonica.androidsnaptesting.logs

public interface LogsRecorder<LogType> {
public fun clear()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package com.telefonica.androidsnaptesting
package com.telefonica.androidsnaptesting.logs

import android.os.Environment
import androidx.test.platform.app.InstrumentationRegistry
import com.telefonica.androidsnaptesting.Directories
import com.telefonica.androidsnaptesting.IgnoreLogs
import org.junit.rules.TestWatcher
import org.junit.runner.Description
import java.io.File
Expand All @@ -24,24 +25,17 @@ public open class GenericLogsRule<LogType>(
private val comparator: LogComparator<LogType> = DefaultLogComparator(),
) : TestWatcher() {

private val context = InstrumentationRegistry.getInstrumentation().context

private val downloadDir = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath
)
private val androidSnaptestingDir = File(downloadDir, "android-snaptesting/${context.packageName}")
private val failuresDir = File(androidSnaptestingDir, "failures")
private val recordedDir = File(androidSnaptestingDir, "recorded")
private val directories = Directories()

override fun starting(description: Description?) {
super.starting(description)

recorder.clear()
if (!failuresDir.exists()) {
failuresDir.mkdirs()
if (!directories.failuresDir.exists()) {
directories.failuresDir.mkdirs()
}
if (!recordedDir.exists()) {
recordedDir.mkdirs()
if (!directories.recordedDir.exists()) {
directories.recordedDir.mkdirs()
}
}

Expand All @@ -55,23 +49,20 @@ public open class GenericLogsRule<LogType>(

val recordedLogs = recorder.getRecordedLogs()
val log = recordedLogs.joinToString("\n") { stringMapper.fromLog(it) }
val testFile = File(recordedDir, fileName)
val testFile = File(directories.recordedDir, fileName)
testFile.createNewFile()
testFile.writeText(log)

if (InstrumentationRegistry.getArguments().getString("record") != "true" && !isTestIgnored) {
val goldenFile =
InstrumentationRegistry.getInstrumentation().context.assets.open(
"android-snaptesting-golden-files/${testName}.txt"
)
val goldenFile = directories.context.assets.open("${directories.goldenFilesDir}/${testName}.txt")
val goldenStringLogs = String(goldenFile.readBytes()).takeIf { it.isNotEmpty() }?.split("\n") ?: emptyList()
val result = comparator.compare(recordedLogs, goldenStringLogs.map { stringMapper.toLog(it) })
if (result != null) {
val compareFile = File(failuresDir, fileName)
val compareFile = File(directories.failuresDir, fileName)
compareFile.createNewFile()
compareFile.writeText(result)
throw AssertionError("Logs do not match:\n$result")
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.telefonica.androidsnaptesting
package com.telefonica.androidsnaptesting.logs

public interface StringMapper<LogType> {
public fun fromLog(log: LogType): String
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.telefonica.androidsnaptesting
package com.telefonica.androidsnaptesting.screenshots

import android.graphics.Bitmap
import com.dropbox.differ.Color
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.telefonica.androidsnaptesting
package com.telefonica.androidsnaptesting.screenshots

import com.dropbox.differ.ImageComparator
import kotlin.math.roundToInt
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package com.telefonica.androidsnaptesting
package com.telefonica.androidsnaptesting.screenshots

import android.app.Activity
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.Build
import android.os.Environment
import androidx.annotation.RequiresApi
import androidx.compose.ui.graphics.asAndroidBitmap
import androidx.compose.ui.test.captureToImage
Expand All @@ -15,6 +14,8 @@ import androidx.test.runner.screenshot.Screenshot
import com.dropbox.differ.ImageComparator
import com.dropbox.differ.Mask
import com.dropbox.differ.SimpleImageComparator
import com.telefonica.androidsnaptesting.Directories
import com.telefonica.androidsnaptesting.IgnoreScreenshots
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement
Expand All @@ -31,24 +32,18 @@ public class ScreenshotsRule(
private var isTestIgnored: Boolean = false
private val writeDiffImage = WriteDiffImage()

private val context = InstrumentationRegistry.getInstrumentation().context
private val downloadDir = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath
)
private val androidSnaptestingDir = File(downloadDir, "android-snaptesting/${context.packageName}")
private val failuresDir = File(androidSnaptestingDir, "failures")
private val recordedDir = File(androidSnaptestingDir, "recorded")
private val directories = Directories()

override fun apply(base: Statement, description: Description): Statement {
className = description.className
testName = description.methodName
isTestIgnored = description.getAnnotation(IgnoreScreenshots::class.java) != null

if (!failuresDir.exists()) {
failuresDir.mkdirs()
if (!directories.failuresDir.exists()) {
directories.failuresDir.mkdirs()
}
if (!recordedDir.exists()) {
recordedDir.mkdirs()
if (!directories.recordedDir.exists()) {
directories.recordedDir.mkdirs()
}
return base
}
Expand Down Expand Up @@ -88,7 +83,7 @@ public class ScreenshotsRule(
}

private fun saveScreenshot(fileName: String, bitmap: Bitmap) {
val testFile = File(recordedDir, fileName)
val testFile = File(directories.recordedDir, fileName)
testFile.createNewFile()
testFile.outputStream().use {
bitmap.compress(Bitmap.CompressFormat.PNG, 100, it)
Expand All @@ -97,7 +92,7 @@ public class ScreenshotsRule(

private fun getGoldenBitmap(resourceName: String): Bitmap {
val goldenBitmap = try {
context.assets.open("android-snaptesting-golden-files/$resourceName").use {
directories.context.assets.open("${directories.goldenFilesDir}/$resourceName").use {
BitmapFactory.decodeStream(it)
}
} catch (e: FileNotFoundException) {
Expand All @@ -116,7 +111,7 @@ public class ScreenshotsRule(
name: String?
) {
if (bitmap.width != goldenBitmap.width || bitmap.height != goldenBitmap.height) {
writeDiffImage(failuresDir, fileName, bitmap, goldenBitmap, null)
writeDiffImage(directories.failuresDir, fileName, bitmap, goldenBitmap, null)
throw AssertionError(
"$name: Test image (w=${bitmap.width}, h=${bitmap.height}) differs in size" +
" from reference image (w=${goldenBitmap.width}, h=${goldenBitmap.height}).\n",
Expand All @@ -134,12 +129,12 @@ public class ScreenshotsRule(
val result = try {
imageComparator.compare(BitmapImage(goldenBitmap), BitmapImage(bitmap), mask)
} catch (e: IllegalArgumentException) {
writeDiffImage(failuresDir, fileName, bitmap, goldenBitmap, mask)
writeDiffImage(directories.failuresDir, fileName, bitmap, goldenBitmap, mask)
throw AssertionError("Failed to compare images", e)
}

if (!resultValidator(result)) {
writeDiffImage(failuresDir, fileName, bitmap, goldenBitmap, mask)
writeDiffImage(directories.failuresDir, fileName, bitmap, goldenBitmap, mask)
throw AssertionError(
"\"$resourceName\" failed to match reference image. ${result.pixelDifferences} pixels differ " +
"(${(result.pixelDifferences / result.pixelCount.toFloat()) * 100} %)"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.telefonica.androidsnaptesting
package com.telefonica.androidsnaptesting.screenshots

import android.graphics.Bitmap
import android.graphics.Canvas
Expand Down