blob: ea320a7947f31526d388ebff1733805b3055bd81 [file] [log] [blame]
/*
* Copyright (C) 2014 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.ex.camera2.utils;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import android.graphics.Rect;
import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureRequest.Key;
import android.view.Surface;
import org.junit.Test;
public class Camera2UtilsTest extends Camera2DeviceTester {
private void captureListenerSplitterAllCallbacksReceived(CaptureCallback splitter,
CaptureCallback... terminals) {
splitter.onCaptureCompleted(null, null, null);
for (CaptureCallback each : terminals) {
verify(each).onCaptureCompleted(null, null, null);
}
splitter.onCaptureFailed(null, null, null);
for (CaptureCallback each : terminals) {
verify(each).onCaptureFailed(null, null, null);
}
splitter.onCaptureProgressed(null, null, null);
for (CaptureCallback each : terminals) {
verify(each).onCaptureProgressed(null, null, null);
}
splitter.onCaptureSequenceAborted(null, 0);
for (CaptureCallback each : terminals) {
verify(each).onCaptureSequenceAborted(null, 0);
}
splitter.onCaptureSequenceCompleted(null, 0, 0L);
for (CaptureCallback each : terminals) {
verify(each).onCaptureSequenceCompleted(null, 0, 0L);
}
splitter.onCaptureStarted(null, null, 0L, 1L);
for (CaptureCallback each : terminals) {
verify(each).onCaptureStarted(null, null, 0L, 1L);
}
}
@Test
public void captureListenerSplitter() {
CaptureCallback firstBackingListener = mock(CaptureCallback.class);
CaptureCallback secondBackingListener = mock(CaptureCallback.class);
captureListenerSplitterAllCallbacksReceived(
new Camera2CaptureCallbackSplitter(firstBackingListener, secondBackingListener),
firstBackingListener, secondBackingListener);
}
@Test
public void captureListenerSplitterEmpty() {
captureListenerSplitterAllCallbacksReceived(new Camera2CaptureCallbackSplitter());
}
@Test
public void captureListenerSplitterNoNpe() {
captureListenerSplitterAllCallbacksReceived(
new Camera2CaptureCallbackSplitter((CaptureCallback) null));
}
@Test
public void captureListenerSplitterMultipleNulls() {
captureListenerSplitterAllCallbacksReceived(
new Camera2CaptureCallbackSplitter(null, null, null));
}
@Test
public void captureListenerSplitterValidAndNull() {
CaptureCallback onlyRealBackingListener = mock(CaptureCallback.class);
captureListenerSplitterAllCallbacksReceived(
new Camera2CaptureCallbackSplitter(null, onlyRealBackingListener),
onlyRealBackingListener);
}
private <T> void requestSettingsSetAndForget(Camera2RequestSettingsSet s, Key<T> k, T v) {
s.set(k, v);
assertEquals(v, s.get(k));
}
@Test
public void requestSettingsSet() {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
// Try a boolean
requestSettingsSetAndForget(setUp, CaptureRequest.CONTROL_AE_LOCK, false);
requestSettingsSetAndForget(setUp, CaptureRequest.CONTROL_AE_LOCK, true);
// Try an int
requestSettingsSetAndForget(setUp, CaptureRequest.CONTROL_AE_MODE, 1);
requestSettingsSetAndForget(setUp, CaptureRequest.CONTROL_AE_MODE, -1);
requestSettingsSetAndForget(setUp, CaptureRequest.CONTROL_AE_MODE, 0);
// Try an int[]
requestSettingsSetAndForget(setUp, CaptureRequest.SENSOR_TEST_PATTERN_DATA, new int[] {1});
requestSettingsSetAndForget(setUp, CaptureRequest.SENSOR_TEST_PATTERN_DATA,
new int[] {2, 2});
}
@Test
public void requestSettingsSetNullValue() {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
requestSettingsSetAndForget(setUp, CaptureRequest.SENSOR_TEST_PATTERN_DATA, new int[] {1});
requestSettingsSetAndForget(setUp, CaptureRequest.SENSOR_TEST_PATTERN_DATA, null);
requestSettingsSetAndForget(setUp, CaptureRequest.SENSOR_TEST_PATTERN_DATA,
new int[] {2, 2});
}
@Test
public void requestSettingsSetUnsetAndContains() {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
assertFalse(setUp.contains(CaptureRequest.CONTROL_AE_LOCK));
setUp.set(CaptureRequest.CONTROL_AE_LOCK, false);
assertTrue(setUp.contains(CaptureRequest.CONTROL_AE_LOCK));
setUp.set(CaptureRequest.CONTROL_AE_LOCK, null);
assertTrue(setUp.contains(CaptureRequest.CONTROL_AE_LOCK));
setUp.unset(CaptureRequest.CONTROL_AE_LOCK);
assertFalse(setUp.contains(CaptureRequest.CONTROL_AE_LOCK));
setUp.set(CaptureRequest.CONTROL_AE_LOCK, null);
assertTrue(setUp.contains(CaptureRequest.CONTROL_AE_LOCK));
setUp.set(CaptureRequest.CONTROL_AE_LOCK, false);
assertTrue(setUp.contains(CaptureRequest.CONTROL_AE_LOCK));
setUp.unset(CaptureRequest.CONTROL_AE_LOCK);
assertFalse(setUp.contains(CaptureRequest.CONTROL_AE_LOCK));
}
@Test
public void requestSettingsSetStartsWithoutChanges() {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
assertEquals(0, setUp.getRevision());
}
private <T> void requestSettingsSetAndAssertChanged(Camera2RequestSettingsSet settings,
Key<T> key, T value,
boolean shouldHaveChanged) {
long revision = settings.getRevision();
assertEquals(shouldHaveChanged, settings.set(key, value));
assertEquals(shouldHaveChanged ? revision + 1 : revision, settings.getRevision());
}
@Test
public void requestSettingsSetChangesReportedCorrectly() {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false, true);
requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false, false);
requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, true, true);
}
@Test
public void requestSettingsSetDetectsNoopChanges() {
Camera2RequestSettingsSet s = new Camera2RequestSettingsSet();
int[] one = {1}, two = {2};
requestSettingsSetAndAssertChanged(s, CaptureRequest.SENSOR_TEST_PATTERN_DATA, one, true);
requestSettingsSetAndAssertChanged(s, CaptureRequest.SENSOR_TEST_PATTERN_DATA, one, false);
requestSettingsSetAndAssertChanged(s, CaptureRequest.SENSOR_TEST_PATTERN_DATA, null, true);
requestSettingsSetAndAssertChanged(s, CaptureRequest.SENSOR_TEST_PATTERN_DATA, null, false);
requestSettingsSetAndAssertChanged(s, CaptureRequest.SENSOR_TEST_PATTERN_DATA, two, true);
requestSettingsSetAndAssertChanged(s, CaptureRequest.SENSOR_TEST_PATTERN_DATA, two, false);
}
private <T> void requestSettingsUnsetAndAssertChanged(Camera2RequestSettingsSet settings,
Key<T> key, boolean shouldHaveChanged) {
long revision = settings.getRevision();
assertEquals(shouldHaveChanged, settings.unset(key));
assertEquals(shouldHaveChanged ? revision + 1 : revision, settings.getRevision());
}
@Test
public void requestSettingsSetUnsetMakesChangesAndDetectsNoops() {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
requestSettingsUnsetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false);
requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false, true);
requestSettingsUnsetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, true);
requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false, true);
requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false, false);
requestSettingsUnsetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, true);
requestSettingsUnsetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false);
requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false, true);
requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, true, true);
requestSettingsUnsetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, true);
}
@Test(expected=NullPointerException.class)
public void requestSettingsSetNullArgToCopyConstructor() {
Camera2RequestSettingsSet flop = new Camera2RequestSettingsSet(null);
}
@Test(expected=NullPointerException.class)
public void requestSettingsSetNullArgToSetKey() {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
setUp.set(null, null);
}
@Test(expected=NullPointerException.class)
public void requestSettingsSetNullArgToUnset() {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
setUp.unset(null);
}
@Test(expected=NullPointerException.class)
public void requestSettingsSetNullArgToContains() {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
setUp.contains(null);
}
@Test(expected=NullPointerException.class)
public void requestSettingsSetNullArgToGet() {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
setUp.get(null);
}
@Test
public void requestSettingsSetMatchesPrimitives() {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
assertTrue(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, null));
assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, false));
assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, true));
setUp.set(CaptureRequest.CONTROL_AE_LOCK, null);
assertTrue(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, null));
assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, false));
assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, true));
setUp.set(CaptureRequest.CONTROL_AE_LOCK, false);
assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, null));
assertTrue(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, false));
assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, true));
setUp.set(CaptureRequest.CONTROL_AE_LOCK, true);
assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, null));
assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, false));
assertTrue(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, true));
}
@Test
public void requestSettingsSetMatchesReferences() {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
assertTrue(setUp.matches(CaptureRequest.SCALER_CROP_REGION, null));
assertFalse(setUp.matches(CaptureRequest.SCALER_CROP_REGION, new Rect(0, 0, 0, 0)));
setUp.set(CaptureRequest.SCALER_CROP_REGION, null);
assertTrue(setUp.matches(CaptureRequest.SCALER_CROP_REGION, null));
assertFalse(setUp.matches(CaptureRequest.SCALER_CROP_REGION, new Rect(0, 0, 0, 0)));
setUp.set(CaptureRequest.SCALER_CROP_REGION, new Rect(0, 0, 0, 0));
assertFalse(setUp.matches(CaptureRequest.SCALER_CROP_REGION, null));
assertTrue(setUp.matches(CaptureRequest.SCALER_CROP_REGION, new Rect(0, 0, 0, 0)));
assertFalse(setUp.matches(CaptureRequest.SCALER_CROP_REGION, new Rect(0, 0, 1, 1)));
}
@Test(expected=NullPointerException.class)
public void requestSettingsSetNullArgToCreateRequest0() throws Exception {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
setUp.createRequest(null, CameraDevice.TEMPLATE_PREVIEW);
}
@Test(expected=NullPointerException.class)
public void requestSettingsSetNullArgToCreateRequest2() throws Exception {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
setUp.createRequest(mCamera, CameraDevice.TEMPLATE_PREVIEW, (Surface) null);
}
@Test(expected=NullPointerException.class)
public void requestSettingsSetNullArgToCreateRequest02() throws Exception {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
setUp.createRequest(null, CameraDevice.TEMPLATE_PREVIEW, (Surface) null);
}
@Test
public void requestSettingsSetNullArgToUnion() {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
assertFalse(setUp.union(null));
assertEquals(0, setUp.getRevision());
}
@Test
public void requestSettingsSetSelfArgToUnion() {
Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
assertFalse(setUp.union(setUp));
assertEquals(0, setUp.getRevision());
}
@Test
public void requestSettingsSetCopyConstructor() {
Camera2RequestSettingsSet original = new Camera2RequestSettingsSet();
Camera2RequestSettingsSet unchanged = new Camera2RequestSettingsSet(original);
requestSettingsSetAndForget(original, CaptureRequest.CONTROL_AE_LOCK, true);
Camera2RequestSettingsSet changed = new Camera2RequestSettingsSet(original);
assertEquals(true, changed.get(CaptureRequest.CONTROL_AE_LOCK));
}
@Test
public void requestSettingsSetCopyConstructorPreservesChangedStatus() {
Camera2RequestSettingsSet original = new Camera2RequestSettingsSet();
Camera2RequestSettingsSet unchanged = new Camera2RequestSettingsSet(original);
assertEquals(original.getRevision(), unchanged.getRevision());
requestSettingsSetAndAssertChanged(original, CaptureRequest.CONTROL_AE_LOCK, true, true);
Camera2RequestSettingsSet changed = new Camera2RequestSettingsSet(original);
assertEquals(original.getRevision(), changed.getRevision());
assertNotSame(original.getRevision(), unchanged.getRevision());
}
@Test
public void requestSettingsSetCopyConstructorPerformsDeepCopy() {
Camera2RequestSettingsSet original = new Camera2RequestSettingsSet();
requestSettingsSetAndForget(original, CaptureRequest.CONTROL_AE_LOCK, true);
Camera2RequestSettingsSet changed = new Camera2RequestSettingsSet(original);
requestSettingsSetAndForget(changed, CaptureRequest.CONTROL_AE_LOCK, false);
assertEquals(true, original.get(CaptureRequest.CONTROL_AE_LOCK));
}
@Test
public void requestSettingsSetNullMeansDefault() throws Exception {
Camera2RequestSettingsSet s = new Camera2RequestSettingsSet();
CaptureRequest r1 = s.createRequest(mCamera, CameraDevice.TEMPLATE_PREVIEW);
assertEquals((Object) CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW,
r1.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
requestSettingsSetAndForget(s, CaptureRequest.CONTROL_CAPTURE_INTENT,
CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
CaptureRequest r2 = s.createRequest(mCamera, CameraDevice.TEMPLATE_PREVIEW);
assertEquals((Object) CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE,
r2.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
requestSettingsSetAndForget(s, CaptureRequest.CONTROL_CAPTURE_INTENT, null);
CaptureRequest r3 = s.createRequest(mCamera, CameraDevice.TEMPLATE_PREVIEW);
assertEquals((Object) CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW,
r3.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
s.unset(CaptureRequest.CONTROL_CAPTURE_INTENT);
CaptureRequest r4 = s.createRequest(mCamera, CameraDevice.TEMPLATE_PREVIEW);
assertEquals((Object) CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW,
r4.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
}
@Test
public void requestSettingsSetNullPreservedByUnions() {
Camera2RequestSettingsSet master = new Camera2RequestSettingsSet();
requestSettingsSetAndForget(master, CaptureRequest.CONTROL_CAPTURE_INTENT,
CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW);
Camera2RequestSettingsSet slave = new Camera2RequestSettingsSet();
master.union(slave);
assertEquals((Object) CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW,
master.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
requestSettingsSetAndForget(slave, CaptureRequest.CONTROL_CAPTURE_INTENT, null);
master.union(slave);
assertEquals(null, master.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
requestSettingsSetAndForget(slave, CaptureRequest.CONTROL_CAPTURE_INTENT,
CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
master.union(slave);
assertEquals((Object) CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE,
master.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
slave.unset(CaptureRequest.CONTROL_CAPTURE_INTENT);
master.union(slave);
assertEquals((Object) CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE,
master.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
}
@Test
public void requestSettingsSetNullChangesRecorded() throws Exception {
Camera2RequestSettingsSet s = new Camera2RequestSettingsSet();
requestSettingsSetAndAssertChanged(s, CaptureRequest.CONTROL_CAPTURE_INTENT, null, true);
requestSettingsSetAndAssertChanged(s, CaptureRequest.CONTROL_CAPTURE_INTENT,
CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW, true);
requestSettingsSetAndAssertChanged(s, CaptureRequest.CONTROL_CAPTURE_INTENT, null, true);
requestSettingsSetAndAssertChanged(s, CaptureRequest.CONTROL_CAPTURE_INTENT, null, false);
}
@Test
public void requestSettingsSetUnionChangesRecorded() {
Camera2RequestSettingsSet[] sets = { new Camera2RequestSettingsSet(),
new Camera2RequestSettingsSet() };
sets[0].union(sets[1]);
assertEquals(1, sets[0].getRevision());
assertEquals(0, sets[1].getRevision());
}
private <T> void requestSettingsSetsCheckPairOfProperties(Camera2RequestSettingsSet firstSet,
Camera2RequestSettingsSet secondSet,
Key<T> firstKey,
Key<T> secondKey,
T expectedFirstSetFirstValue,
T expectedFirstSetSecondValue,
T expectedSecondSetFirstValue,
T expectedSecondSetSecondValue) {
assertEquals(expectedFirstSetFirstValue, firstSet.get(firstKey));
assertEquals(expectedFirstSetSecondValue, firstSet.get(secondKey));
assertEquals(expectedSecondSetFirstValue, secondSet.get(firstKey));
assertEquals(expectedSecondSetSecondValue, secondSet.get(secondKey));
}
@Test
public void requestSettingsSetUnionChangesReflected() {
Camera2RequestSettingsSet[] sets = { new Camera2RequestSettingsSet(),
new Camera2RequestSettingsSet() };
sets[0].set(CaptureRequest.CONTROL_AE_LOCK, true);
sets[1].set(CaptureRequest.CONTROL_AWB_LOCK, true);
sets[0].union(sets[1]);
sets[1].set(CaptureRequest.CONTROL_AE_LOCK, false);
requestSettingsSetsCheckPairOfProperties(sets[0], sets[1],
CaptureRequest.CONTROL_AE_LOCK, CaptureRequest.CONTROL_AWB_LOCK,
true, true, false, true);
sets[0].union(sets[1]);
requestSettingsSetsCheckPairOfProperties(sets[0], sets[1],
CaptureRequest.CONTROL_AE_LOCK, CaptureRequest.CONTROL_AWB_LOCK,
false, true, false, true);
sets[1].set(CaptureRequest.CONTROL_AE_LOCK, false);
sets[1].set(CaptureRequest.CONTROL_AWB_LOCK, false);
sets[0].union(sets[1]);
requestSettingsSetsCheckPairOfProperties(sets[0], sets[1],
CaptureRequest.CONTROL_AE_LOCK, CaptureRequest.CONTROL_AWB_LOCK,
false, false, false, false);
}
}