/* * Copyright 2017 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; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import android.hardware.display.BrightnessConfiguration; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.util.AtomicFile; import android.util.Pair; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.io.FileInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; @SmallTest @RunWith(AndroidJUnit4.class) public class PersistentDataStoreTest { private PersistentDataStore mDataStore; private TestInjector mInjector; @Before public void setUp() { mInjector = new TestInjector(); mDataStore = new PersistentDataStore(mInjector); } @Test public void testLoadingBrightnessConfigurations() { String contents = "\n" + "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "\n"; InputStream is = new ByteArrayInputStream(contents.getBytes(StandardCharsets.UTF_8)); mInjector.setReadStream(is); mDataStore.loadIfNeeded(); BrightnessConfiguration config = mDataStore.getBrightnessConfiguration(1 /*userSerial*/); Pair curve = config.getCurve(); float[] expectedLux = { 0f, 25f }; float[] expectedNits = { 13.25f, 35.94f }; assertArrayEquals(expectedLux, curve.first, "lux"); assertArrayEquals(expectedNits, curve.second, "nits"); assertEquals("something", config.getDescription()); config = mDataStore.getBrightnessConfiguration(3 /*userSerial*/); curve = config.getCurve(); expectedLux = new float[] { 0f, 10.2f }; expectedNits = new float[] { 13.25f, 15f }; assertArrayEquals(expectedLux, curve.first, "lux"); assertArrayEquals(expectedNits, curve.second, "nits"); assertNull(config.getDescription()); } @Test public void testBrightnessConfigWithInvalidCurveIsIgnored() { String contents = "\n" + "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "\n"; InputStream is = new ByteArrayInputStream(contents.getBytes(StandardCharsets.UTF_8)); mInjector.setReadStream(is); mDataStore.loadIfNeeded(); assertNull(mDataStore.getBrightnessConfiguration(0 /*userSerial*/)); } @Test public void testBrightnessConfigWithInvalidFloatsIsIgnored() { String contents = "\n" + "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "\n"; InputStream is = new ByteArrayInputStream(contents.getBytes(StandardCharsets.UTF_8)); mInjector.setReadStream(is); mDataStore.loadIfNeeded(); assertNull(mDataStore.getBrightnessConfiguration(0 /*userSerial*/)); } @Test public void testEmptyBrightnessConfigurationsDoesntCrash() { String contents = "\n" + "\n" + " \n" + "\n"; InputStream is = new ByteArrayInputStream(contents.getBytes(StandardCharsets.UTF_8)); mInjector.setReadStream(is); mDataStore.loadIfNeeded(); assertNull(mDataStore.getBrightnessConfiguration(0 /*userSerial*/)); } @Test public void testStoreAndReloadOfBrightnessConfigurations() { final float[] lux = { 0f, 10f }; final float[] nits = {1f, 100f }; final BrightnessConfiguration config = new BrightnessConfiguration.Builder(lux, nits) .setDescription("a description") .build(); mDataStore.loadIfNeeded(); assertNull(mDataStore.getBrightnessConfiguration(0 /*userSerial*/)); mDataStore.setBrightnessConfigurationForUser(config, 0, "packagename"); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); mInjector.setWriteStream(baos); mDataStore.saveIfNeeded(); assertTrue(mInjector.wasWriteSuccessful()); TestInjector newInjector = new TestInjector(); PersistentDataStore newDataStore = new PersistentDataStore(newInjector); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); newInjector.setReadStream(bais); newDataStore.loadIfNeeded(); assertNotNull(newDataStore.getBrightnessConfiguration(0 /*userSerial*/)); assertEquals(mDataStore.getBrightnessConfiguration(0 /*userSerial*/), newDataStore.getBrightnessConfiguration(0 /*userSerial*/)); } @Test public void testNullBrightnessConfiguration() { final float[] lux = { 0f, 10f }; final float[] nits = {1f, 100f }; final BrightnessConfiguration config = new BrightnessConfiguration.Builder(lux, nits) .setDescription("a description") .build(); mDataStore.loadIfNeeded(); assertNull(mDataStore.getBrightnessConfiguration(0 /*userSerial*/)); mDataStore.setBrightnessConfigurationForUser(config, 0, "packagename"); assertNotNull(mDataStore.getBrightnessConfiguration(0 /*userSerial*/)); mDataStore.setBrightnessConfigurationForUser(null, 0, "packagename"); assertNull(mDataStore.getBrightnessConfiguration(0 /*userSerial*/)); } public class TestInjector extends PersistentDataStore.Injector { private InputStream mReadStream; private OutputStream mWriteStream; private boolean mWasSuccessful; @Override public InputStream openRead() throws FileNotFoundException { if (mReadStream != null) { return mReadStream; } else { throw new FileNotFoundException(); } } @Override public OutputStream startWrite() { return mWriteStream; } @Override public void finishWrite(OutputStream os, boolean success) { mWasSuccessful = success; try { os.close(); } catch (IOException e) { // This method can't throw IOException since the super implementation doesn't, so // we just wrap it in a RuntimeException so we end up crashing the test all the // same. throw new RuntimeException(e); } } public void setReadStream(InputStream is) { mReadStream = is; } public void setWriteStream(OutputStream os) { mWriteStream = os; } public boolean wasWriteSuccessful() { return mWasSuccessful; } } private static void assertArrayEquals(float[] expected, float[] actual, String name) { assertEquals("Expected " + name + " arrays to be the same length!", expected.length, actual.length); for (int i = 0; i < expected.length; i++) { assertEquals("Expected " + name + " arrays to be equivalent when value " + i + "differs", expected[i], actual[i], 0.01 /*tolerance*/); } } }