Merge "Move display mocking tests to DisplayServiceTests" into udc-qpr-dev-plus-aosp
This commit is contained in:
committed by
Android (Google) Code Review
commit
db6b2d2961
@@ -28,14 +28,15 @@ android_test {
|
|||||||
|
|
||||||
static_libs: [
|
static_libs: [
|
||||||
"androidx.test.ext.junit",
|
"androidx.test.ext.junit",
|
||||||
"display-core-libs",
|
|
||||||
"frameworks-base-testutils",
|
"frameworks-base-testutils",
|
||||||
"junit",
|
"junit",
|
||||||
"junit-params",
|
"junit-params",
|
||||||
|
"mockingservicestests-utils-mockito",
|
||||||
"platform-compat-test-rules",
|
"platform-compat-test-rules",
|
||||||
"platform-test-annotations",
|
"platform-test-annotations",
|
||||||
"services.core",
|
"services.core",
|
||||||
"servicestests-utils",
|
"servicestests-utils",
|
||||||
|
"testables",
|
||||||
],
|
],
|
||||||
|
|
||||||
defaults: [
|
defaults: [
|
||||||
@@ -56,10 +57,3 @@ android_test {
|
|||||||
enabled: false,
|
enabled: false,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
java_library {
|
|
||||||
name: "display-core-libs",
|
|
||||||
srcs: [
|
|
||||||
"src/com/android/server/display/TestUtils.java",
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -17,10 +17,7 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.android.frameworks.displayservicetests">
|
package="com.android.frameworks.displayservicetests">
|
||||||
|
|
||||||
<!--
|
<!-- Permissions -->
|
||||||
Insert permissions here. eg:
|
|
||||||
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
|
|
||||||
-->
|
|
||||||
<uses-permission android:name="android.permission.CONTROL_DISPLAY_BRIGHTNESS" />
|
<uses-permission android:name="android.permission.CONTROL_DISPLAY_BRIGHTNESS" />
|
||||||
<uses-permission android:name="android.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS" />
|
<uses-permission android:name="android.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS" />
|
||||||
<uses-permission android:name="android.permission.DEVICE_POWER" />
|
<uses-permission android:name="android.permission.DEVICE_POWER" />
|
||||||
@@ -32,6 +29,10 @@
|
|||||||
<uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
|
<uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
|
||||||
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
|
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
|
||||||
|
|
||||||
|
<!-- Permissions needed for DisplayTransformManagerTest -->
|
||||||
|
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
|
||||||
|
<uses-permission android:name="android.permission.HARDWARE_TEST"/>
|
||||||
|
|
||||||
<application android:debuggable="true"
|
<application android:debuggable="true"
|
||||||
android:testOnly="true">
|
android:testOnly="true">
|
||||||
<uses-library android:name="android.test.mock" android:required="true" />
|
<uses-library android:name="android.test.mock" android:required="true" />
|
||||||
|
|||||||
@@ -16,22 +16,49 @@
|
|||||||
|
|
||||||
package com.android.server.display.color;
|
package com.android.server.display.color;
|
||||||
|
|
||||||
|
import static android.view.Display.DEFAULT_DISPLAY;
|
||||||
|
|
||||||
|
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertWithMessage;
|
import static com.google.common.truth.Truth.assertWithMessage;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.Resources;
|
||||||
import android.hardware.display.DisplayManagerInternal;
|
import android.hardware.display.DisplayManagerInternal;
|
||||||
|
import android.os.Binder;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.view.SurfaceControl;
|
||||||
|
|
||||||
import androidx.test.InstrumentationRegistry;
|
import androidx.test.InstrumentationRegistry;
|
||||||
|
|
||||||
|
import com.android.dx.mockito.inline.extended.ExtendedMockito;
|
||||||
|
import com.android.internal.R;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.MockitoSession;
|
||||||
|
import org.mockito.quality.Strictness;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
public class DisplayWhiteBalanceTintControllerTest {
|
public class DisplayWhiteBalanceTintControllerTest {
|
||||||
|
@Mock
|
||||||
|
private Context mMockedContext;
|
||||||
|
@Mock
|
||||||
|
private Resources mMockedResources;
|
||||||
|
@Mock
|
||||||
|
private DisplayManagerInternal mDisplayManagerInternal;
|
||||||
|
|
||||||
private DisplayWhiteBalanceTintController mDisplayWhiteBalanceTintController;
|
private MockitoSession mSession;
|
||||||
|
private Resources mResources;
|
||||||
|
IBinder mDisplayToken;
|
||||||
|
DisplayWhiteBalanceTintController mDisplayWhiteBalanceTintController;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
@@ -40,6 +67,47 @@ public class DisplayWhiteBalanceTintControllerTest {
|
|||||||
new DisplayWhiteBalanceTintController(displayManagerInternal);
|
new DisplayWhiteBalanceTintController(displayManagerInternal);
|
||||||
mDisplayWhiteBalanceTintController.setUp(InstrumentationRegistry.getContext(), true);
|
mDisplayWhiteBalanceTintController.setUp(InstrumentationRegistry.getContext(), true);
|
||||||
mDisplayWhiteBalanceTintController.setActivated(true);
|
mDisplayWhiteBalanceTintController.setActivated(true);
|
||||||
|
|
||||||
|
mSession = ExtendedMockito.mockitoSession()
|
||||||
|
.initMocks(this)
|
||||||
|
.mockStatic(SurfaceControl.class)
|
||||||
|
.strictness(Strictness.LENIENT)
|
||||||
|
.startMocking();
|
||||||
|
|
||||||
|
mResources = InstrumentationRegistry.getContext().getResources();
|
||||||
|
// These Resources are common to all tests.
|
||||||
|
doReturn(4000)
|
||||||
|
.when(mMockedResources)
|
||||||
|
.getInteger(R.integer.config_displayWhiteBalanceColorTemperatureMin);
|
||||||
|
doReturn(8000)
|
||||||
|
.when(mMockedResources)
|
||||||
|
.getInteger(R.integer.config_displayWhiteBalanceColorTemperatureMax);
|
||||||
|
doReturn(6500)
|
||||||
|
.when(mMockedResources)
|
||||||
|
.getInteger(R.integer.config_displayWhiteBalanceColorTemperatureDefault);
|
||||||
|
doReturn(new String[] {"0.950456", "1.000000", "1.089058"})
|
||||||
|
.when(mMockedResources)
|
||||||
|
.getStringArray(R.array.config_displayWhiteBalanceDisplayNominalWhite);
|
||||||
|
doReturn(6500)
|
||||||
|
.when(mMockedResources)
|
||||||
|
.getInteger(R.integer.config_displayWhiteBalanceDisplayNominalWhiteCct);
|
||||||
|
doReturn(new int[] {0})
|
||||||
|
.when(mMockedResources)
|
||||||
|
.getIntArray(R.array.config_displayWhiteBalanceDisplaySteps);
|
||||||
|
doReturn(new int[] {20})
|
||||||
|
.when(mMockedResources)
|
||||||
|
.getIntArray(R.array.config_displayWhiteBalanceDisplayRangeMinimums);
|
||||||
|
|
||||||
|
doReturn(mMockedResources).when(mMockedContext).getResources();
|
||||||
|
|
||||||
|
mDisplayToken = new Binder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() throws Exception {
|
||||||
|
if (mSession != null) {
|
||||||
|
mSession.finishMocking();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -98,4 +166,204 @@ public class DisplayWhiteBalanceTintControllerTest {
|
|||||||
})
|
})
|
||||||
).isTrue();
|
).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup should succeed when SurfaceControl setup results in a valid color transform.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void displayWhiteBalance_setupWithSurfaceControl() {
|
||||||
|
// Make SurfaceControl return sRGB primaries
|
||||||
|
SurfaceControl.DisplayPrimaries displayPrimaries = new SurfaceControl.DisplayPrimaries();
|
||||||
|
displayPrimaries.red = new SurfaceControl.CieXyz();
|
||||||
|
displayPrimaries.red.X = 0.412315f;
|
||||||
|
displayPrimaries.red.Y = 0.212600f;
|
||||||
|
displayPrimaries.red.Z = 0.019327f;
|
||||||
|
displayPrimaries.green = new SurfaceControl.CieXyz();
|
||||||
|
displayPrimaries.green.X = 0.357600f;
|
||||||
|
displayPrimaries.green.Y = 0.715200f;
|
||||||
|
displayPrimaries.green.Z = 0.119200f;
|
||||||
|
displayPrimaries.blue = new SurfaceControl.CieXyz();
|
||||||
|
displayPrimaries.blue.X = 0.180500f;
|
||||||
|
displayPrimaries.blue.Y = 0.072200f;
|
||||||
|
displayPrimaries.blue.Z = 0.950633f;
|
||||||
|
displayPrimaries.white = new SurfaceControl.CieXyz();
|
||||||
|
displayPrimaries.white.X = 0.950456f;
|
||||||
|
displayPrimaries.white.Y = 1.000000f;
|
||||||
|
displayPrimaries.white.Z = 1.089058f;
|
||||||
|
when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY))
|
||||||
|
.thenReturn(displayPrimaries);
|
||||||
|
|
||||||
|
setUpTintController();
|
||||||
|
assertWithMessage("Setup with valid SurfaceControl failed")
|
||||||
|
.that(mDisplayWhiteBalanceTintController.mSetUp)
|
||||||
|
.isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup should fail when SurfaceControl setup results in an invalid color transform.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void displayWhiteBalance_setupWithInvalidSurfaceControlData() {
|
||||||
|
// Make SurfaceControl return invalid display primaries
|
||||||
|
SurfaceControl.DisplayPrimaries displayPrimaries = new SurfaceControl.DisplayPrimaries();
|
||||||
|
displayPrimaries.red = new SurfaceControl.CieXyz();
|
||||||
|
displayPrimaries.green = new SurfaceControl.CieXyz();
|
||||||
|
displayPrimaries.blue = new SurfaceControl.CieXyz();
|
||||||
|
displayPrimaries.white = new SurfaceControl.CieXyz();
|
||||||
|
when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY))
|
||||||
|
.thenReturn(displayPrimaries);
|
||||||
|
|
||||||
|
setUpTintController();
|
||||||
|
assertWithMessage("Setup with invalid SurfaceControl succeeded")
|
||||||
|
.that(mDisplayWhiteBalanceTintController.mSetUp)
|
||||||
|
.isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup should succeed when SurfaceControl setup fails and Resources result in a valid color
|
||||||
|
* transform.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void displayWhiteBalance_setupWithResources() {
|
||||||
|
// Use default (valid) Resources
|
||||||
|
doReturn(mResources.getStringArray(R.array.config_displayWhiteBalanceDisplayPrimaries))
|
||||||
|
.when(mMockedResources)
|
||||||
|
.getStringArray(R.array.config_displayWhiteBalanceDisplayPrimaries);
|
||||||
|
// Make SurfaceControl setup fail
|
||||||
|
when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY)).thenReturn(null);
|
||||||
|
|
||||||
|
setUpTintController();
|
||||||
|
assertWithMessage("Setup with valid Resources failed")
|
||||||
|
.that(mDisplayWhiteBalanceTintController.mSetUp)
|
||||||
|
.isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup should fail when SurfaceControl setup fails and Resources result in an invalid color
|
||||||
|
* transform.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void displayWhiteBalance_setupWithInvalidResources() {
|
||||||
|
// Use Resources with invalid color data
|
||||||
|
doReturn(new String[] {
|
||||||
|
"0", "0", "0", // Red X, Y, Z
|
||||||
|
"0", "0", "0", // Green X, Y, Z
|
||||||
|
"0", "0", "0", // Blue X, Y, Z
|
||||||
|
"0", "0", "0", // White X, Y, Z
|
||||||
|
})
|
||||||
|
.when(mMockedResources)
|
||||||
|
.getStringArray(R.array.config_displayWhiteBalanceDisplayPrimaries);
|
||||||
|
// Make SurfaceControl setup fail
|
||||||
|
when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY)).thenReturn(null);
|
||||||
|
|
||||||
|
setUpTintController();
|
||||||
|
assertWithMessage("Setup with invalid Resources succeeded")
|
||||||
|
.that(mDisplayWhiteBalanceTintController.mSetUp)
|
||||||
|
.isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Matrix should match the precalculated one for given cct and display primaries.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void displayWhiteBalance_getAndSetMatrix_validateTransformMatrix() {
|
||||||
|
SurfaceControl.DisplayPrimaries displayPrimaries = new SurfaceControl.DisplayPrimaries();
|
||||||
|
displayPrimaries.red = new SurfaceControl.CieXyz();
|
||||||
|
displayPrimaries.red.X = 0.412315f;
|
||||||
|
displayPrimaries.red.Y = 0.212600f;
|
||||||
|
displayPrimaries.red.Z = 0.019327f;
|
||||||
|
displayPrimaries.green = new SurfaceControl.CieXyz();
|
||||||
|
displayPrimaries.green.X = 0.357600f;
|
||||||
|
displayPrimaries.green.Y = 0.715200f;
|
||||||
|
displayPrimaries.green.Z = 0.119200f;
|
||||||
|
displayPrimaries.blue = new SurfaceControl.CieXyz();
|
||||||
|
displayPrimaries.blue.X = 0.180500f;
|
||||||
|
displayPrimaries.blue.Y = 0.072200f;
|
||||||
|
displayPrimaries.blue.Z = 0.950633f;
|
||||||
|
displayPrimaries.white = new SurfaceControl.CieXyz();
|
||||||
|
displayPrimaries.white.X = 0.950456f;
|
||||||
|
displayPrimaries.white.Y = 1.000000f;
|
||||||
|
displayPrimaries.white.Z = 1.089058f;
|
||||||
|
when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY))
|
||||||
|
.thenReturn(displayPrimaries);
|
||||||
|
|
||||||
|
setUpTintController();
|
||||||
|
assertWithMessage("Setup with valid SurfaceControl failed")
|
||||||
|
.that(mDisplayWhiteBalanceTintController.mSetUp)
|
||||||
|
.isTrue();
|
||||||
|
|
||||||
|
final int cct = 6500;
|
||||||
|
mDisplayWhiteBalanceTintController.setMatrix(cct);
|
||||||
|
mDisplayWhiteBalanceTintController.setAppliedCct(
|
||||||
|
mDisplayWhiteBalanceTintController.getTargetCct());
|
||||||
|
|
||||||
|
assertWithMessage("Failed to set temperature")
|
||||||
|
.that(mDisplayWhiteBalanceTintController.mCurrentColorTemperature)
|
||||||
|
.isEqualTo(cct);
|
||||||
|
float[] matrixDwb = mDisplayWhiteBalanceTintController.getMatrix();
|
||||||
|
final float[] expectedMatrixDwb = {
|
||||||
|
0.971848f, -0.001421f, 0.000491f, 0.0f,
|
||||||
|
0.028193f, 0.945798f, 0.003207f, 0.0f,
|
||||||
|
-0.000042f, -0.000989f, 0.988659f, 0.0f,
|
||||||
|
0.0f, 0.0f, 0.0f, 1.0f
|
||||||
|
};
|
||||||
|
assertArrayEquals("Unexpected DWB matrix", expectedMatrixDwb, matrixDwb,
|
||||||
|
1e-6f /* tolerance */);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Matrix should match the precalculated one for given cct and display primaries.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void displayWhiteBalance_targetApplied_validateTransformMatrix() {
|
||||||
|
SurfaceControl.DisplayPrimaries displayPrimaries = new SurfaceControl.DisplayPrimaries();
|
||||||
|
displayPrimaries.red = new SurfaceControl.CieXyz();
|
||||||
|
displayPrimaries.red.X = 0.412315f;
|
||||||
|
displayPrimaries.red.Y = 0.212600f;
|
||||||
|
displayPrimaries.red.Z = 0.019327f;
|
||||||
|
displayPrimaries.green = new SurfaceControl.CieXyz();
|
||||||
|
displayPrimaries.green.X = 0.357600f;
|
||||||
|
displayPrimaries.green.Y = 0.715200f;
|
||||||
|
displayPrimaries.green.Z = 0.119200f;
|
||||||
|
displayPrimaries.blue = new SurfaceControl.CieXyz();
|
||||||
|
displayPrimaries.blue.X = 0.180500f;
|
||||||
|
displayPrimaries.blue.Y = 0.072200f;
|
||||||
|
displayPrimaries.blue.Z = 0.950633f;
|
||||||
|
displayPrimaries.white = new SurfaceControl.CieXyz();
|
||||||
|
displayPrimaries.white.X = 0.950456f;
|
||||||
|
displayPrimaries.white.Y = 1.000000f;
|
||||||
|
displayPrimaries.white.Z = 1.089058f;
|
||||||
|
when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY))
|
||||||
|
.thenReturn(displayPrimaries);
|
||||||
|
|
||||||
|
setUpTintController();
|
||||||
|
assertWithMessage("Setup with valid SurfaceControl failed")
|
||||||
|
.that(mDisplayWhiteBalanceTintController.mSetUp)
|
||||||
|
.isTrue();
|
||||||
|
|
||||||
|
final int cct = 6500;
|
||||||
|
mDisplayWhiteBalanceTintController.setTargetCct(cct);
|
||||||
|
final float[] matrixDwb = mDisplayWhiteBalanceTintController.computeMatrixForCct(cct);
|
||||||
|
mDisplayWhiteBalanceTintController.setAppliedCct(cct);
|
||||||
|
|
||||||
|
assertWithMessage("Failed to set temperature")
|
||||||
|
.that(mDisplayWhiteBalanceTintController.mCurrentColorTemperature)
|
||||||
|
.isEqualTo(cct);
|
||||||
|
final float[] expectedMatrixDwb = {
|
||||||
|
0.971848f, -0.001421f, 0.000491f, 0.0f,
|
||||||
|
0.028193f, 0.945798f, 0.003207f, 0.0f,
|
||||||
|
-0.000042f, -0.000989f, 0.988659f, 0.0f,
|
||||||
|
0.0f, 0.0f, 0.0f, 1.0f
|
||||||
|
};
|
||||||
|
assertArrayEquals("Unexpected DWB matrix", expectedMatrixDwb, matrixDwb,
|
||||||
|
1e-6f /* tolerance */);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpTintController() {
|
||||||
|
mDisplayWhiteBalanceTintController = new DisplayWhiteBalanceTintController(
|
||||||
|
mDisplayManagerInternal);
|
||||||
|
mDisplayWhiteBalanceTintController.setUp(mMockedContext, true);
|
||||||
|
mDisplayWhiteBalanceTintController.setActivated(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
include /services/core/java/com/android/server/display/OWNERS
|
|
||||||
@@ -1,307 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.server.display.color;
|
|
||||||
|
|
||||||
import static android.view.Display.DEFAULT_DISPLAY;
|
|
||||||
|
|
||||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
|
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertWithMessage;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertArrayEquals;
|
|
||||||
import static org.mockito.Mockito.when;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.hardware.display.DisplayManagerInternal;
|
|
||||||
import android.os.Binder;
|
|
||||||
import android.os.IBinder;
|
|
||||||
import android.view.SurfaceControl;
|
|
||||||
import android.view.SurfaceControl.CieXyz;
|
|
||||||
import android.view.SurfaceControl.DisplayPrimaries;
|
|
||||||
|
|
||||||
import androidx.test.InstrumentationRegistry;
|
|
||||||
import androidx.test.runner.AndroidJUnit4;
|
|
||||||
|
|
||||||
import com.android.dx.mockito.inline.extended.ExtendedMockito;
|
|
||||||
import com.android.internal.R;
|
|
||||||
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.mockito.Mock;
|
|
||||||
import org.mockito.MockitoSession;
|
|
||||||
import org.mockito.quality.Strictness;
|
|
||||||
|
|
||||||
@RunWith(AndroidJUnit4.class)
|
|
||||||
public class DisplayWhiteBalanceTintControllerTest {
|
|
||||||
@Mock
|
|
||||||
private Context mMockedContext;
|
|
||||||
@Mock
|
|
||||||
private Resources mMockedResources;
|
|
||||||
@Mock
|
|
||||||
private DisplayManagerInternal mDisplayManagerInternal;
|
|
||||||
|
|
||||||
private MockitoSession mSession;
|
|
||||||
private Resources mResources;
|
|
||||||
IBinder mDisplayToken;
|
|
||||||
DisplayWhiteBalanceTintController mDisplayWhiteBalanceTintController;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() {
|
|
||||||
mSession = ExtendedMockito.mockitoSession()
|
|
||||||
.initMocks(this)
|
|
||||||
.mockStatic(SurfaceControl.class)
|
|
||||||
.strictness(Strictness.LENIENT)
|
|
||||||
.startMocking();
|
|
||||||
|
|
||||||
mResources = InstrumentationRegistry.getContext().getResources();
|
|
||||||
// These Resources are common to all tests.
|
|
||||||
doReturn(4000)
|
|
||||||
.when(mMockedResources)
|
|
||||||
.getInteger(R.integer.config_displayWhiteBalanceColorTemperatureMin);
|
|
||||||
doReturn(8000)
|
|
||||||
.when(mMockedResources)
|
|
||||||
.getInteger(R.integer.config_displayWhiteBalanceColorTemperatureMax);
|
|
||||||
doReturn(6500)
|
|
||||||
.when(mMockedResources)
|
|
||||||
.getInteger(R.integer.config_displayWhiteBalanceColorTemperatureDefault);
|
|
||||||
doReturn(new String[] {"0.950456", "1.000000", "1.089058"})
|
|
||||||
.when(mMockedResources)
|
|
||||||
.getStringArray(R.array.config_displayWhiteBalanceDisplayNominalWhite);
|
|
||||||
doReturn(6500)
|
|
||||||
.when(mMockedResources)
|
|
||||||
.getInteger(R.integer.config_displayWhiteBalanceDisplayNominalWhiteCct);
|
|
||||||
doReturn(new int[] {0})
|
|
||||||
.when(mMockedResources)
|
|
||||||
.getIntArray(R.array.config_displayWhiteBalanceDisplaySteps);
|
|
||||||
doReturn(new int[] {20})
|
|
||||||
.when(mMockedResources)
|
|
||||||
.getIntArray(R.array.config_displayWhiteBalanceDisplayRangeMinimums);
|
|
||||||
|
|
||||||
doReturn(mMockedResources).when(mMockedContext).getResources();
|
|
||||||
|
|
||||||
mDisplayToken = new Binder();
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
|
||||||
public void tearDown() throws Exception {
|
|
||||||
if (mSession != null) {
|
|
||||||
mSession.finishMocking();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Setup should succeed when SurfaceControl setup results in a valid color transform.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void displayWhiteBalance_setupWithSurfaceControl() {
|
|
||||||
// Make SurfaceControl return sRGB primaries
|
|
||||||
DisplayPrimaries displayPrimaries = new DisplayPrimaries();
|
|
||||||
displayPrimaries.red = new CieXyz();
|
|
||||||
displayPrimaries.red.X = 0.412315f;
|
|
||||||
displayPrimaries.red.Y = 0.212600f;
|
|
||||||
displayPrimaries.red.Z = 0.019327f;
|
|
||||||
displayPrimaries.green = new CieXyz();
|
|
||||||
displayPrimaries.green.X = 0.357600f;
|
|
||||||
displayPrimaries.green.Y = 0.715200f;
|
|
||||||
displayPrimaries.green.Z = 0.119200f;
|
|
||||||
displayPrimaries.blue = new CieXyz();
|
|
||||||
displayPrimaries.blue.X = 0.180500f;
|
|
||||||
displayPrimaries.blue.Y = 0.072200f;
|
|
||||||
displayPrimaries.blue.Z = 0.950633f;
|
|
||||||
displayPrimaries.white = new CieXyz();
|
|
||||||
displayPrimaries.white.X = 0.950456f;
|
|
||||||
displayPrimaries.white.Y = 1.000000f;
|
|
||||||
displayPrimaries.white.Z = 1.089058f;
|
|
||||||
when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY))
|
|
||||||
.thenReturn(displayPrimaries);
|
|
||||||
|
|
||||||
setUpTintController();
|
|
||||||
assertWithMessage("Setup with valid SurfaceControl failed")
|
|
||||||
.that(mDisplayWhiteBalanceTintController.mSetUp)
|
|
||||||
.isTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Setup should fail when SurfaceControl setup results in an invalid color transform.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void displayWhiteBalance_setupWithInvalidSurfaceControlData() {
|
|
||||||
// Make SurfaceControl return invalid display primaries
|
|
||||||
DisplayPrimaries displayPrimaries = new DisplayPrimaries();
|
|
||||||
displayPrimaries.red = new CieXyz();
|
|
||||||
displayPrimaries.green = new CieXyz();
|
|
||||||
displayPrimaries.blue = new CieXyz();
|
|
||||||
displayPrimaries.white = new CieXyz();
|
|
||||||
when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY))
|
|
||||||
.thenReturn(displayPrimaries);
|
|
||||||
|
|
||||||
setUpTintController();
|
|
||||||
assertWithMessage("Setup with invalid SurfaceControl succeeded")
|
|
||||||
.that(mDisplayWhiteBalanceTintController.mSetUp)
|
|
||||||
.isFalse();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Setup should succeed when SurfaceControl setup fails and Resources result in a valid color
|
|
||||||
* transform.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void displayWhiteBalance_setupWithResources() {
|
|
||||||
// Use default (valid) Resources
|
|
||||||
doReturn(mResources.getStringArray(R.array.config_displayWhiteBalanceDisplayPrimaries))
|
|
||||||
.when(mMockedResources)
|
|
||||||
.getStringArray(R.array.config_displayWhiteBalanceDisplayPrimaries);
|
|
||||||
// Make SurfaceControl setup fail
|
|
||||||
when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY)).thenReturn(null);
|
|
||||||
|
|
||||||
setUpTintController();
|
|
||||||
assertWithMessage("Setup with valid Resources failed")
|
|
||||||
.that(mDisplayWhiteBalanceTintController.mSetUp)
|
|
||||||
.isTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Setup should fail when SurfaceControl setup fails and Resources result in an invalid color
|
|
||||||
* transform.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void displayWhiteBalance_setupWithInvalidResources() {
|
|
||||||
// Use Resources with invalid color data
|
|
||||||
doReturn(new String[] {
|
|
||||||
"0", "0", "0", // Red X, Y, Z
|
|
||||||
"0", "0", "0", // Green X, Y, Z
|
|
||||||
"0", "0", "0", // Blue X, Y, Z
|
|
||||||
"0", "0", "0", // White X, Y, Z
|
|
||||||
})
|
|
||||||
.when(mMockedResources)
|
|
||||||
.getStringArray(R.array.config_displayWhiteBalanceDisplayPrimaries);
|
|
||||||
// Make SurfaceControl setup fail
|
|
||||||
when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY)).thenReturn(null);
|
|
||||||
|
|
||||||
setUpTintController();
|
|
||||||
assertWithMessage("Setup with invalid Resources succeeded")
|
|
||||||
.that(mDisplayWhiteBalanceTintController.mSetUp)
|
|
||||||
.isFalse();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Matrix should match the precalculated one for given cct and display primaries.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void displayWhiteBalance_getAndSetMatrix_validateTransformMatrix() {
|
|
||||||
DisplayPrimaries displayPrimaries = new DisplayPrimaries();
|
|
||||||
displayPrimaries.red = new CieXyz();
|
|
||||||
displayPrimaries.red.X = 0.412315f;
|
|
||||||
displayPrimaries.red.Y = 0.212600f;
|
|
||||||
displayPrimaries.red.Z = 0.019327f;
|
|
||||||
displayPrimaries.green = new CieXyz();
|
|
||||||
displayPrimaries.green.X = 0.357600f;
|
|
||||||
displayPrimaries.green.Y = 0.715200f;
|
|
||||||
displayPrimaries.green.Z = 0.119200f;
|
|
||||||
displayPrimaries.blue = new CieXyz();
|
|
||||||
displayPrimaries.blue.X = 0.180500f;
|
|
||||||
displayPrimaries.blue.Y = 0.072200f;
|
|
||||||
displayPrimaries.blue.Z = 0.950633f;
|
|
||||||
displayPrimaries.white = new CieXyz();
|
|
||||||
displayPrimaries.white.X = 0.950456f;
|
|
||||||
displayPrimaries.white.Y = 1.000000f;
|
|
||||||
displayPrimaries.white.Z = 1.089058f;
|
|
||||||
when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY))
|
|
||||||
.thenReturn(displayPrimaries);
|
|
||||||
|
|
||||||
setUpTintController();
|
|
||||||
assertWithMessage("Setup with valid SurfaceControl failed")
|
|
||||||
.that(mDisplayWhiteBalanceTintController.mSetUp)
|
|
||||||
.isTrue();
|
|
||||||
|
|
||||||
final int cct = 6500;
|
|
||||||
mDisplayWhiteBalanceTintController.setMatrix(cct);
|
|
||||||
mDisplayWhiteBalanceTintController.setAppliedCct(
|
|
||||||
mDisplayWhiteBalanceTintController.getTargetCct());
|
|
||||||
|
|
||||||
assertWithMessage("Failed to set temperature")
|
|
||||||
.that(mDisplayWhiteBalanceTintController.mCurrentColorTemperature)
|
|
||||||
.isEqualTo(cct);
|
|
||||||
float[] matrixDwb = mDisplayWhiteBalanceTintController.getMatrix();
|
|
||||||
final float[] expectedMatrixDwb = {
|
|
||||||
0.971848f, -0.001421f, 0.000491f, 0.0f,
|
|
||||||
0.028193f, 0.945798f, 0.003207f, 0.0f,
|
|
||||||
-0.000042f, -0.000989f, 0.988659f, 0.0f,
|
|
||||||
0.0f, 0.0f, 0.0f, 1.0f
|
|
||||||
};
|
|
||||||
assertArrayEquals("Unexpected DWB matrix", expectedMatrixDwb, matrixDwb,
|
|
||||||
1e-6f /* tolerance */);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Matrix should match the precalculated one for given cct and display primaries.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void displayWhiteBalance_targetApplied_validateTransformMatrix() {
|
|
||||||
DisplayPrimaries displayPrimaries = new DisplayPrimaries();
|
|
||||||
displayPrimaries.red = new CieXyz();
|
|
||||||
displayPrimaries.red.X = 0.412315f;
|
|
||||||
displayPrimaries.red.Y = 0.212600f;
|
|
||||||
displayPrimaries.red.Z = 0.019327f;
|
|
||||||
displayPrimaries.green = new CieXyz();
|
|
||||||
displayPrimaries.green.X = 0.357600f;
|
|
||||||
displayPrimaries.green.Y = 0.715200f;
|
|
||||||
displayPrimaries.green.Z = 0.119200f;
|
|
||||||
displayPrimaries.blue = new CieXyz();
|
|
||||||
displayPrimaries.blue.X = 0.180500f;
|
|
||||||
displayPrimaries.blue.Y = 0.072200f;
|
|
||||||
displayPrimaries.blue.Z = 0.950633f;
|
|
||||||
displayPrimaries.white = new CieXyz();
|
|
||||||
displayPrimaries.white.X = 0.950456f;
|
|
||||||
displayPrimaries.white.Y = 1.000000f;
|
|
||||||
displayPrimaries.white.Z = 1.089058f;
|
|
||||||
when(mDisplayManagerInternal.getDisplayNativePrimaries(DEFAULT_DISPLAY))
|
|
||||||
.thenReturn(displayPrimaries);
|
|
||||||
|
|
||||||
setUpTintController();
|
|
||||||
assertWithMessage("Setup with valid SurfaceControl failed")
|
|
||||||
.that(mDisplayWhiteBalanceTintController.mSetUp)
|
|
||||||
.isTrue();
|
|
||||||
|
|
||||||
final int cct = 6500;
|
|
||||||
mDisplayWhiteBalanceTintController.setTargetCct(cct);
|
|
||||||
final float[] matrixDwb = mDisplayWhiteBalanceTintController.computeMatrixForCct(cct);
|
|
||||||
mDisplayWhiteBalanceTintController.setAppliedCct(cct);
|
|
||||||
|
|
||||||
assertWithMessage("Failed to set temperature")
|
|
||||||
.that(mDisplayWhiteBalanceTintController.mCurrentColorTemperature)
|
|
||||||
.isEqualTo(cct);
|
|
||||||
final float[] expectedMatrixDwb = {
|
|
||||||
0.971848f, -0.001421f, 0.000491f, 0.0f,
|
|
||||||
0.028193f, 0.945798f, 0.003207f, 0.0f,
|
|
||||||
-0.000042f, -0.000989f, 0.988659f, 0.0f,
|
|
||||||
0.0f, 0.0f, 0.0f, 1.0f
|
|
||||||
};
|
|
||||||
assertArrayEquals("Unexpected DWB matrix", expectedMatrixDwb, matrixDwb,
|
|
||||||
1e-6f /* tolerance */);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setUpTintController() {
|
|
||||||
mDisplayWhiteBalanceTintController = new DisplayWhiteBalanceTintController(
|
|
||||||
mDisplayManagerInternal);
|
|
||||||
mDisplayWhiteBalanceTintController.setUp(mMockedContext, true);
|
|
||||||
mDisplayWhiteBalanceTintController.setActivated(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user