Skip to content

Commit 843a14e

Browse files
authored
Merge pull request #254 from ndtp/206-UnexpectedDeviceException-context-fix
206: Fix UnexpectedDeviceException caused by incorrect Context usage
2 parents a5a12c8 + d538105 commit 843a14e

File tree

11 files changed

+81
-37
lines changed

11 files changed

+81
-37
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
## 3.2.2
44

55
- https://github.com/ndtp/android-testify/pull/251 - A collection of updates to allow the tests to run on modern Apple hardware.
6-
- https://github.com/ndtp/android-testify/pull/249 - Fix for #243, `expected to be of type static` errors related to TestStorage API changes
6+
- https://github.com/ndtp/android-testify/pull/249 - Fix for #243: `expected to be of type static` errors related to TestStorage API changes
77
- https://github.com/ndtp/android-testify/pull/252 - Fix for #250: Correct error in GMD documentation
8+
- https://github.com/ndtp/android-testify/pull/253 - Fix for #206: UnexpectedDeviceException thrown because wrong Context being used to determine device orientation
89
- Minor changes to Flix Sample documentation to improve clarity of the requirements
910

1011
## 3.2.1

Library/src/androidTest/java/dev/testify/BitmapCompareTest.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@
2727
package dev.testify
2828

2929
import android.app.Activity
30+
import android.content.Context
3031
import android.graphics.Bitmap
3132
import android.view.View
3233
import androidx.test.ext.junit.runners.AndroidJUnit4
34+
import androidx.test.platform.app.InstrumentationRegistry
3335
import androidx.test.rule.ActivityTestRule
3436
import dev.testify.core.TestifyConfiguration
3537
import dev.testify.core.processor.capture.createBitmapFromDrawingCache
@@ -51,11 +53,17 @@ class BitmapCompareTest {
5153

5254
private lateinit var baselineBitmap: Bitmap
5355
private lateinit var activity: Activity
56+
private lateinit var testContext: Context
5457

5558
@Before
5659
fun setUp() {
5760
activity = testActivityRule.activity
58-
baselineBitmap = loadBaselineBitmapForComparison(activity, "test")!!
61+
testContext = InstrumentationRegistry.getInstrumentation().context
62+
baselineBitmap = loadBaselineBitmapForComparison(
63+
testContext = testContext,
64+
targetContext = activity,
65+
testName = "test"
66+
)!!
5967
}
6068

6169
@Test

Library/src/androidTest/java/dev/testify/FuzzyCompareBitmapTest.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ package dev.testify
2828

2929
import android.graphics.Bitmap
3030
import androidx.test.ext.junit.runners.AndroidJUnit4
31+
import androidx.test.platform.app.InstrumentationRegistry
3132
import androidx.test.rule.ActivityTestRule
3233
import dev.testify.core.TestifyConfiguration
3334
import dev.testify.core.processor.compare.FuzzyCompare
@@ -44,7 +45,11 @@ class FuzzyCompareBitmapTest {
4445
var testActivityRule = ActivityTestRule(TestActivity::class.java)
4546

4647
private fun loadBitmap(name: String): Bitmap {
47-
return loadBaselineBitmapForComparison(testActivityRule.activity, name)!!
48+
return loadBaselineBitmapForComparison(
49+
testContext = InstrumentationRegistry.getInstrumentation().context,
50+
targetContext = testActivityRule.activity,
51+
testName = name
52+
)!!
4853
}
4954

5055
@Test

Library/src/androidTest/java/dev/testify/ScreenshotUtilityTest.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ package dev.testify
2828

2929
import android.view.View
3030
import androidx.test.ext.junit.runners.AndroidJUnit4
31+
import androidx.test.platform.app.InstrumentationRegistry
3132
import androidx.test.rule.ActivityTestRule
3233
import dev.testify.core.processor.capture.createBitmapFromDrawingCache
3334
import dev.testify.output.getDestination
@@ -46,9 +47,14 @@ class ScreenshotUtilityTest {
4647

4748
@Test
4849
fun loadBaselineBitmapForComparison() {
49-
val context = testActivityRule.activity
50+
val targetContext = testActivityRule.activity
51+
val testContext = InstrumentationRegistry.getInstrumentation().context
5052

51-
val baselineBitmap = loadBaselineBitmapForComparison(context, "test")
53+
val baselineBitmap = loadBaselineBitmapForComparison(
54+
testContext = testContext,
55+
targetContext = targetContext,
56+
testName = "test"
57+
)
5258
assertNotNull(baselineBitmap)
5359
}
5460

Library/src/main/java/dev/testify/ScreenshotUtility.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,17 @@ private fun loadBitmapFromAsset(context: Context, filePath: String): Bitmap? {
111111
*
112112
* @return The decoded asset as a Bitmap.
113113
*/
114-
fun loadBaselineBitmapForComparison(context: Context, testName: String): Bitmap? {
114+
fun loadBaselineBitmapForComparison(
115+
testContext: Context,
116+
targetContext: Context,
117+
testName: String
118+
): Bitmap? {
115119
val filePath = getFileRelativeToRoot(
116-
subpath = getDeviceDescription(context),
120+
subpath = getDeviceDescription(targetContext),
117121
fileName = testName,
118122
extension = PNG_EXTENSION
119123
)
120-
return loadBitmapFromAsset(context, filePath)
124+
return loadBitmapFromAsset(testContext, filePath)
121125
}
122126

123127
/**

Library/src/main/java/dev/testify/core/AssertExpectedDevice.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,15 @@ import dev.testify.internal.extensions.TestInstrumentationRegistry.isRecordMode
4444
* @param testName - The name of the currently running test
4545
*/
4646
@ExcludeFromJacocoGeneratedReport
47-
fun assertExpectedDevice(context: Context, testName: String, isRecordMode: Boolean) {
47+
fun assertExpectedDevice(
48+
targetContext: Context,
49+
assetManager: AssetManager,
50+
testName: String,
51+
isRecordMode: Boolean
52+
) {
4853
if (isRecordMode || recordMode) return
4954

50-
val currentDeviceDescription = getDeviceDescription(context)
51-
val assetManager: AssetManager = context.assets
55+
val currentDeviceDescription = getDeviceDescription(targetContext)
5256
val root: String = SCREENSHOT_DIR
5357

5458
var expectedDevice: String? = null

Library/src/main/java/dev/testify/core/DeviceIdentifier.kt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,14 @@ const val DEFAULT_NAME_FORMAT = "c_n"
4545

4646
/**
4747
* Returns the device dimensions in pixels.
48+
*
49+
* @param targetContext - A [Context] for the target application being instrumented.
50+
*
4851
* @return Pair<Int, Int> - width and height in pixels
4952
*/
5053
@Suppress("DEPRECATION")
51-
fun getDeviceDimensions(context: Context): Pair<Int, Int> {
52-
val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
54+
fun getDeviceDimensions(targetContext: Context): Pair<Int, Int> {
55+
val windowManager = targetContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager
5356
val metrics = DisplayMetrics()
5457
val display = windowManager.defaultDisplay
5558

@@ -62,9 +65,11 @@ fun getDeviceDimensions(context: Context): Pair<Int, Int> {
6265

6366
/**
6467
* Returns a string representing the device description.
68+
*
69+
* @param targetContext - A [Context] for the target application being instrumented.
6570
*/
66-
fun getDeviceDescription(context: Context): String {
67-
return formatDeviceString(DeviceStringFormatter(context, null), DEFAULT_FOLDER_FORMAT)
71+
fun getDeviceDescription(targetContext: Context): String {
72+
return formatDeviceString(DeviceStringFormatter(targetContext, null), DEFAULT_FOLDER_FORMAT)
6873
}
6974

7075
/**
@@ -114,11 +119,13 @@ fun formatDeviceString(formatter: DeviceStringFormatter, format: String): String
114119

115120
/**
116121
* Utility class for formatting device description strings.
122+
*
123+
* @param targetContext - A [Context] for the target application being instrumented.
117124
*/
118-
open class DeviceStringFormatter(private val context: Context, private val testName: TestName?) {
125+
open class DeviceStringFormatter(private val targetContext: Context, private val testName: TestName?) {
119126

120127
internal open val dimensions: Pair<Int, Int>
121-
get() = getDeviceDimensions(context)
128+
get() = getDeviceDimensions(targetContext)
122129

123130
internal open val androidVersion: String
124131
get() = buildVersionSdkInt().toString()
@@ -130,7 +137,7 @@ open class DeviceStringFormatter(private val context: Context, private val testN
130137
get() = dimensions.second.toString()
131138

132139
internal open val deviceDensity: String
133-
get() = context.resources.displayMetrics.densityDpi.toString() + "dp"
140+
get() = targetContext.resources.displayMetrics.densityDpi.toString() + "dp"
134141

135142
internal open val locale: String
136143
get() = Locale.getDefault().languageTag

Library/src/main/java/dev/testify/core/logic/AssertSame.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,20 @@ internal fun <TActivity : Activity> assertSame(
138138

139139
val isRecordMode = isRecordMode()
140140

141-
assertExpectedDevice(testContext, description.name, isRecordMode)
141+
assertExpectedDevice(
142+
targetContext = activity,
143+
assetManager = testContext.assets,
144+
testName = description.name,
145+
isRecordMode = isRecordMode
146+
)
142147

143148
val destination = getDestination(activity, outputFileName)
144149

145-
baselineBitmap = loadBaselineBitmapForComparison(testContext, description.name)
150+
baselineBitmap = loadBaselineBitmapForComparison(
151+
testContext = testContext,
152+
targetContext = activity,
153+
testName = description.name
154+
)
146155
?: if (isRecordMode) {
147156
TestInstrumentationRegistry.instrumentationPrintln(
148157
"\n\t" + "Recording baseline for ${description.name}".cyan()

Library/src/main/java/dev/testify/internal/helpers/OutputFileName.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ fun Context.outputFileName(
4646
format: String = DEFAULT_NAME_FORMAT
4747
) = formatDeviceString(
4848
formatter = DeviceStringFormatter(
49-
context = this,
49+
targetContext = this,
5050
testName = description.nameComponents
5151
),
5252
format = format

Library/src/test/java/dev/testify/ScreenshotRuleTest.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ class ScreenshotRuleTest {
171171
every { BitmapFactory.decodeFile(any(), any()) } returns mockCapturedBitmap
172172
every { createBitmapFromDrawingCache(any(), any()) } returns mockCapturedBitmap
173173
every { deleteBitmap(any()) } returns true
174-
every { loadBaselineBitmapForComparison(any(), any()) } returns mockBaselineBitmap
174+
every { loadBaselineBitmapForComparison(any(), any(), any()) } returns mockBaselineBitmap
175175
every { loadBitmapFromFile(any(), any()) } returns mockCurrentBitmap
176176
every { sameAsCompare(any(), any()) } returns true
177177
every { isRunningOnUiThread() } returns false
@@ -257,8 +257,8 @@ class ScreenshotRuleTest {
257257

258258
verify { subject.launchActivity(any()) }
259259
verify { takeScreenshot(any(), any(), any(), any()) }
260-
verify { assertExpectedDevice(any(), any(), any()) }
261-
verify { loadBaselineBitmapForComparison(any(), any()) }
260+
verify { assertExpectedDevice(any(), any(), any(), any()) }
261+
verify { loadBaselineBitmapForComparison(any(), any(), any()) }
262262
verify { compareBitmaps(any(), any(), any()) }
263263
verify(exactly = 0) { mockDestination.finalize() }
264264
verifyReporter()
@@ -284,7 +284,7 @@ class ScreenshotRuleTest {
284284

285285
@Test(expected = ScreenshotBaselineNotDefinedException::class)
286286
fun `WHEN no baseline bitmap THEN throw ScreenshotBaselineNotDefinedException`() {
287-
every { loadBaselineBitmapForComparison(any(), any()) } returns null
287+
every { loadBaselineBitmapForComparison(any(), any(), any()) } returns null
288288
subject.test()
289289
verify { mockDestination.finalize() }
290290
verifyReporter()
@@ -293,7 +293,7 @@ class ScreenshotRuleTest {
293293
@Test(expected = DataDirectoryDestinationNotFoundException::class)
294294
fun `WHEN invalid destination THEN throw DataDirectoryDestinationNotFoundException`() {
295295
every { mockDestination.assureDestination(any()) } returns false
296-
every { loadBaselineBitmapForComparison(any(), any()) } returns null
296+
every { loadBaselineBitmapForComparison(any(), any(), any()) } returns null
297297
subject.test()
298298
verifyReporter()
299299
}
@@ -320,8 +320,8 @@ class ScreenshotRuleTest {
320320
verify { subject.launchActivity(any()) }
321321

322322
verify { takeScreenshot(any(), any(), any(), any()) }
323-
verify { assertExpectedDevice(any(), any(), any()) }
324-
verify { loadBaselineBitmapForComparison(any(), any()) }
323+
verify { assertExpectedDevice(any(), any(), any(), any()) }
324+
verify { loadBaselineBitmapForComparison(any(), any(), any()) }
325325
verify { compareBitmaps(any(), any(), any()) }
326326
verify(exactly = 0) { mockDestination.finalize() }
327327

@@ -386,7 +386,7 @@ class ScreenshotRuleTest {
386386
@Test(expected = FinalizeDestinationException::class)
387387
fun `WHEN finalize fails THEN throw FinalizeDestinationException`() {
388388
every { mockDestination.finalize() } returns false
389-
every { loadBaselineBitmapForComparison(any(), any()) } returns null
389+
every { loadBaselineBitmapForComparison(any(), any(), any()) } returns null
390390

391391
subject
392392
.configure {
@@ -440,7 +440,7 @@ class ScreenshotRuleTest {
440440

441441
@Test
442442
fun `WHEN isRecordMode THEN is always successful`() {
443-
every { loadBaselineBitmapForComparison(any(), any()) } returns null
443+
every { loadBaselineBitmapForComparison(any(), any(), any()) } returns null
444444

445445
subject
446446
.configure {

Library/src/test/java/dev/testify/scenario/ScreenshotScenarioRuleTest.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ class ScreenshotScenarioRuleTest {
180180
every { BitmapFactory.decodeFile(any(), any()) } returns mockCapturedBitmap
181181
every { createBitmapFromDrawingCache(any(), any()) } returns mockCapturedBitmap
182182
every { deleteBitmap(any()) } returns true
183-
every { loadBaselineBitmapForComparison(any(), any()) } returns mockBaselineBitmap
183+
every { loadBaselineBitmapForComparison(any(), any(), any()) } returns mockBaselineBitmap
184184
every { loadBitmapFromFile(any(), any()) } returns mockCurrentBitmap
185185
every { sameAsCompare(any(), any()) } returns true
186186
every { isRunningOnUiThread() } returns false
@@ -267,7 +267,7 @@ class ScreenshotScenarioRuleTest {
267267

268268
@Test(expected = ScreenshotBaselineNotDefinedException::class)
269269
fun `WHEN no baseline bitmap THEN throw ScreenshotBaselineNotDefinedException`() {
270-
every { loadBaselineBitmapForComparison(any(), any()) } returns null
270+
every { loadBaselineBitmapForComparison(any(), any(), any()) } returns null
271271
subject.test()
272272
verify { mockDestination.finalize() }
273273
verifyReporter()
@@ -276,7 +276,7 @@ class ScreenshotScenarioRuleTest {
276276
@Test(expected = DataDirectoryDestinationNotFoundException::class)
277277
fun `WHEN invalid destination THEN throw DataDirectoryDestinationNotFoundException`() {
278278
every { mockDestination.assureDestination(any()) } returns false
279-
every { loadBaselineBitmapForComparison(any(), any()) } returns null
279+
every { loadBaselineBitmapForComparison(any(), any(), any()) } returns null
280280
subject.test()
281281
verifyReporter()
282282
}
@@ -301,8 +301,8 @@ class ScreenshotScenarioRuleTest {
301301
subject.test()
302302

303303
verify { takeScreenshot(any(), any(), any(), any()) }
304-
verify { assertExpectedDevice(any(), any(), any()) }
305-
verify { loadBaselineBitmapForComparison(any(), any()) }
304+
verify { assertExpectedDevice(any(), any(), any(), any()) }
305+
verify { loadBaselineBitmapForComparison(any(), any(), any()) }
306306
verify { compareBitmaps(any(), any(), any()) }
307307
verify(exactly = 0) { mockDestination.finalize() }
308308

@@ -367,7 +367,7 @@ class ScreenshotScenarioRuleTest {
367367
@Test(expected = FinalizeDestinationException::class)
368368
fun `WHEN finalize fails THEN throw FinalizeDestinationException`() {
369369
every { mockDestination.finalize() } returns false
370-
every { loadBaselineBitmapForComparison(any(), any()) } returns null
370+
every { loadBaselineBitmapForComparison(any(), any(), any()) } returns null
371371

372372
subject
373373
.withScenario(mockScenario)
@@ -423,7 +423,7 @@ class ScreenshotScenarioRuleTest {
423423

424424
@Test
425425
fun `WHEN isRecordMode THEN is always successful`() {
426-
every { loadBaselineBitmapForComparison(any(), any()) } returns null
426+
every { loadBaselineBitmapForComparison(any(), any(), any()) } returns null
427427

428428
subject
429429
.withScenario(mockScenario)

0 commit comments

Comments
 (0)