package com.android.overlaytest; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.test.AndroidTestCase; import android.util.AttributeSet; import android.util.Xml; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Locale; public abstract class OverlayBaseTest extends AndroidTestCase { private Resources mResources; protected int mMode; // will be set by subclasses static final protected int MODE_NO_OVERLAY = 0; static final protected int MODE_SINGLE_OVERLAY = 1; static final protected int MODE_MULTIPLE_OVERLAYS = 2; protected void setUp() { mResources = getContext().getResources(); } private int calculateRawResourceChecksum(int resId) throws Throwable { InputStream input = null; try { input = mResources.openRawResource(resId); int ch, checksum = 0; while ((ch = input.read()) != -1) { checksum = (checksum + ch) % 0xffddbb00; } return checksum; } finally { input.close(); } } private void setLocale(Locale locale) { Locale.setDefault(locale); Configuration config = new Configuration(); config.locale = locale; mResources.updateConfiguration(config, mResources.getDisplayMetrics()); } private boolean getExpected(boolean no, boolean so, boolean mo) { switch (mMode) { case MODE_NO_OVERLAY: return no; case MODE_SINGLE_OVERLAY: return so; case MODE_MULTIPLE_OVERLAYS: return mo; default: fail("Unknown mode!"); return no; } } private String getExpected(String no, String so, String mo) { switch (mMode) { case MODE_NO_OVERLAY: return no; case MODE_SINGLE_OVERLAY: return so; case MODE_MULTIPLE_OVERLAYS: return mo; default: fail("Unknown mode!"); return no; } } private int getExpected(int no, int so, int mo) { switch (mMode) { case MODE_NO_OVERLAY: return no; case MODE_SINGLE_OVERLAY: return so; case MODE_MULTIPLE_OVERLAYS: return mo; default: fail("Unknown mode!"); return no; } } private int[] getExpected(int[] no, int[] so, int[] mo) { switch (mMode) { case MODE_NO_OVERLAY: return no; case MODE_SINGLE_OVERLAY: return so; case MODE_MULTIPLE_OVERLAYS: return mo; default: fail("Unknown mode!"); return no; } } private void assertResource(int resId, boolean no, boolean so, boolean mo) throws Throwable { boolean expected = getExpected(no, so, mo); boolean actual = mResources.getBoolean(resId); assertEquals(expected, actual); } private void assertResource(int resId, int no, int so, int mo) throws Throwable { int expected = getExpected(no, so, mo); int actual = mResources.getInteger(resId); assertEquals(expected, actual); } private void assertResource(int resId, String no, String so, String mo) throws Throwable { String expected = getExpected(no, so, mo); String actual = mResources.getString(resId); assertEquals(expected, actual); } private void assertResource(int resId, int[] no, int[] so, int[] mo) throws Throwable { int[] expected = getExpected(no, so, mo); int[] actual = mResources.getIntArray(resId); assertEquals("length:", expected.length, actual.length); for (int i = 0; i < actual.length; ++i) { assertEquals("index " + i + ":", actual[i], expected[i]); } } public void testFrameworkBooleanOverlay() throws Throwable { // config_annoy_dianne has the value: // - true when no overlay exists (MODE_NO_OVERLAY) // - false when a single overlay exists (MODE_SINGLE_OVERLAY) // - false when multiple overlays exists (MODE_MULTIPLE_OVERLAYS) final int resId = com.android.internal.R.bool.config_annoy_dianne; assertResource(resId, true, false, false); } public void testBooleanOverlay() throws Throwable { // usually_false has the value: // - false when no overlay exists (MODE_NO_OVERLAY) // - true when a single overlay exists (MODE_SINGLE_OVERLAY) // - false when multiple overlays exists (MODE_MULTIPLE_OVERLAYS) final int resId = R.bool.usually_false; assertResource(resId, false, true, false); } public void testBoolean() throws Throwable { // always_true has no overlay final int resId = R.bool.always_true; assertResource(resId, true, true, true); } public void testIntegerArrayOverlay() throws Throwable { // fibonacci has values: // - eight first values of Fibonacci sequence, when no overlay exists (MODE_NO_OVERLAY) // - eight first values of Fibonacci sequence (reversed), for single and multiple overlays // (MODE_SINGLE_OVERLAY, MODE_MULTIPLE_OVERLAYS) final int resId = R.array.fibonacci; assertResource(resId, new int[]{1, 1, 2, 3, 5, 8, 13, 21}, new int[]{21, 13, 8, 5, 3, 2, 1, 1}, new int[]{21, 13, 8, 5, 3, 2, 1, 1}); } public void testIntegerArray() throws Throwable { // prime_numbers has no overlay final int resId = R.array.prime_numbers; final int[] expected = {2, 3, 5, 7, 11, 13, 17, 19}; assertResource(resId, expected, expected, expected); } public void testDrawable() throws Throwable { // drawable-nodpi/drawable has overlay (default config) final int resId = R.drawable.drawable; int actual = calculateRawResourceChecksum(resId); int expected = 0; switch (mMode) { case MODE_NO_OVERLAY: expected = 0x00005665; break; case MODE_SINGLE_OVERLAY: case MODE_MULTIPLE_OVERLAYS: expected = 0x000051da; break; default: fail("Unknown mode " + mMode); } assertEquals(expected, actual); } public void testAppString() throws Throwable { final int resId = R.string.str; assertResource(resId, "none", "single", "multiple"); } public void testApp2() throws Throwable { final int resId = R.string.str2; // only in base package and first app overlay assertResource(resId, "none", "single", "single"); } public void testAppXml() throws Throwable { int expected = getExpected(0, 1, 2); int actual = -1; XmlResourceParser parser = mResources.getXml(R.xml.integer); int type = parser.getEventType(); while (type != XmlResourceParser.END_DOCUMENT && actual == -1) { if (type == XmlResourceParser.START_TAG && "integer".equals(parser.getName())) { AttributeSet as = Xml.asAttributeSet(parser); actual = as.getAttributeIntValue(null, "value", -1); } type = parser.next(); } parser.close(); assertEquals(expected, actual); } public void testAppRaw() throws Throwable { final int resId = R.raw.lorem_ipsum; InputStream input = null; BufferedReader reader = null; String actual = ""; try { input = mResources.openRawResource(resId); reader = new BufferedReader(new InputStreamReader(input)); actual = reader.readLine(); } finally { if (reader != null) { reader.close(); } if (input != null) { input.close(); } } final String no = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, " + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " + "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip " + "ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit " + "esse cillum dolore eu fugiat nulla pariatur. " + "Excepteur sint occaecat cupidatat non proident, " + "sunt in culpa qui officia deserunt mollit anim id est laborum."; final String so = "Lorem ipsum: single overlay."; final String mo = "Lorem ipsum: multiple overlays."; assertEquals(getExpected(no, so, mo), actual); } /* * testMatrix* tests * * The naming convention textMatrixABCDEF refers to in which packages and * which configurations a resource is defined (1 if the resource is * defined). If defined, a slot is always given the same value. * * SLOT PACKAGE CONFIGURATION VALUE * A target package (default) 100 * B target package -sv 200 * C OverlayAppFirst (default) 300 * D OverlayAppFirst -sv 400 * E OverlayAppSecond (default) 500 * F OverlayAppSecond -sv 600 * * Example: in testMatrix101110, the base package defines the * R.integer.matrix101110 resource for the default configuration (value * 100), OverlayAppFirst defines it for both default and Swedish * configurations (values 300 and 400, respectively), and OverlayAppSecond * defines it for the default configuration (value 500). If both overlays * are loaded, the expected value after setting the language to Swedish is * 400. */ public void testMatrix100000() throws Throwable { final int resId = R.integer.matrix_100000; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 100, 100); } public void testMatrix100001() throws Throwable { final int resId = R.integer.matrix_100001; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 100, 600); } public void testMatrix100010() throws Throwable { final int resId = R.integer.matrix_100010; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 100, 500); } public void testMatrix100011() throws Throwable { final int resId = R.integer.matrix_100011; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 100, 600); } public void testMatrix100100() throws Throwable { final int resId = R.integer.matrix_100100; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 400); } public void testMatrix100101() throws Throwable { final int resId = R.integer.matrix_100101; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 600); } public void testMatrix100110() throws Throwable { final int resId = R.integer.matrix_100110; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 400); } public void testMatrix100111() throws Throwable { final int resId = R.integer.matrix_100111; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 600); } public void testMatrix101000() throws Throwable { final int resId = R.integer.matrix_101000; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 300, 300); } public void testMatrix101001() throws Throwable { final int resId = R.integer.matrix_101001; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 300, 600); } public void testMatrix101010() throws Throwable { final int resId = R.integer.matrix_101010; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 300, 500); } public void testMatrix101011() throws Throwable { final int resId = R.integer.matrix_101011; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 300, 600); } public void testMatrix101100() throws Throwable { final int resId = R.integer.matrix_101100; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 400); } public void testMatrix101101() throws Throwable { final int resId = R.integer.matrix_101101; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 600); } public void testMatrix101110() throws Throwable { final int resId = R.integer.matrix_101110; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 400); } public void testMatrix101111() throws Throwable { final int resId = R.integer.matrix_101111; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 600); } public void testMatrix110000() throws Throwable { final int resId = R.integer.matrix_110000; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 200); } public void testMatrix110001() throws Throwable { final int resId = R.integer.matrix_110001; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 600); } public void testMatrix110010() throws Throwable { final int resId = R.integer.matrix_110010; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 200); } public void testMatrix110011() throws Throwable { final int resId = R.integer.matrix_110011; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 600); } public void testMatrix110100() throws Throwable { final int resId = R.integer.matrix_110100; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 400); } public void testMatrix110101() throws Throwable { final int resId = R.integer.matrix_110101; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 600); } public void testMatrix110110() throws Throwable { final int resId = R.integer.matrix_110110; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 400); } public void testMatrix110111() throws Throwable { final int resId = R.integer.matrix_110111; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 600); } public void testMatrix111000() throws Throwable { final int resId = R.integer.matrix_111000; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 200); } public void testMatrix111001() throws Throwable { final int resId = R.integer.matrix_111001; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 600); } public void testMatrix111010() throws Throwable { final int resId = R.integer.matrix_111010; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 200); } public void testMatrix111011() throws Throwable { final int resId = R.integer.matrix_111011; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 600); } public void testMatrix111100() throws Throwable { final int resId = R.integer.matrix_111100; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 400); } public void testMatrix111101() throws Throwable { final int resId = R.integer.matrix_111101; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 600); } public void testMatrix111110() throws Throwable { final int resId = R.integer.matrix_111110; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 400); } public void testMatrix111111() throws Throwable { final int resId = R.integer.matrix_111111; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 600); } }