159f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee/* 259f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee * Copyright (C) 2011 The Android Open Source Project 359f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee * 459f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee * Licensed under the Apache License, Version 2.0 (the "License"); 559f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee * you may not use this file except in compliance with the License. 659f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee * You may obtain a copy of the License at 759f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee * 859f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee * http://www.apache.org/licenses/LICENSE-2.0 959f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee * 1059f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee * Unless required by applicable law or agreed to in writing, software 1159f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee * distributed under the License is distributed on an "AS IS" BASIS, 1259f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1359f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee * See the License for the specific language governing permissions and 1459f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee * limitations under the License. 1559f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee */ 1659f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee 1759f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjeepackage com.android.providers.contacts; 1859f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee 1987426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onukiimport android.content.Context; 20c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onukiimport android.graphics.BitmapFactory; 21c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki 2238210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.google.android.collect.Sets; 2338210445730ee04c351c7cc1b3800cfe23e34325Makoto Onuki 2438210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport junit.framework.Assert; 2538210445730ee04c351c7cc1b3800cfe23e34325Makoto Onuki 26c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onukiimport java.io.ByteArrayOutputStream; 27c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onukiimport java.io.IOException; 28c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onukiimport java.io.InputStream; 29c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onukiimport java.util.Arrays; 3063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onukiimport java.util.Set; 31c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki 3259f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee/** 3359f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee * Contains additional assertion methods not found in Junit or MoreAsserts. 3459f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee */ 3559f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjeepublic final class EvenMoreAsserts { 3659f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee // Non instantiable. 3759f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee private EvenMoreAsserts() { } 3859f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee 3959f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee public static <T extends Exception> void assertThrows(Class<T> exception, Runnable r) { 4059f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee assertThrows(null, exception, r); 4159f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee } 4259f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee 4359f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee public static <T extends Exception> void assertThrows(String message, Class<T> exception, 4459f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Runnable r) { 4559f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee try { 4659f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee r.run(); 4759f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee // Cannot invoke Assert.fail() here because it will be caught by the try/catch below 4859f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee // and, if we are expecting an AssertionError or AssertionFailedError (depending on 4959f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee // the platform), we might incorrectly identify that as a success. 5000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } catch (Exception caught) { 5100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee if (!exception.isInstance(caught)) { 5259f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Assert.fail(appendUserMessage("Exception " + exception + " expected but " + 5300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee caught +" thrown.", message)); 5459f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee } 5559f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee return; 5659f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee } 5759f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Assert.fail(appendUserMessage( 5859f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee "Exception " + exception + " expected but no exception was thrown.", 5959f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee message)); 6059f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee } 6159f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee 6259f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee private static String appendUserMessage(String errorMsg, String userMsg) { 6359f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee return userMsg == null ? errorMsg : errorMsg + userMsg; 6459f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee } 65c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki 6687426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki public static void assertImageRawData(Context context, byte[] expected, 6787426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki InputStream actualStream) 68c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki throws IOException { 69c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki ByteArrayOutputStream baos = new ByteArrayOutputStream(); 70c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki 71c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki final byte[] buffer = new byte[4096]; 72c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki int count; 73c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki while ((count = actualStream.read(buffer)) != -1) { 74c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki baos.write(buffer, 0, count); 75c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki } 7687426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki actualStream.close(); 77c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki 7887426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki assertImageRawData(context, expected, baos.toByteArray()); 79c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki } 80c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki 8187426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki public static void assertImageRawData(Context context, byte[] expected, byte[] actual) { 82c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki String failReason = null; 83c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki if (expected.length != actual.length) { 84c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki failReason = "Different data lengths:" + 85c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki " expected=" + expected.length + " actual=" + actual.length; 86c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki } else if (!Arrays.equals(expected, actual)) { 87c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki failReason = "Different data:"; 88c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki } 89c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki if (failReason == null) { 90c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki return; 91c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki } 9287426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki String expectedFile = TestUtils.dumpToCacheDir(context, "expected", ".jpg", expected); 9387426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki String actualFile = TestUtils.dumpToCacheDir(context, "actual", ".jpg", actual); 9487426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki 95c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki // Length or hashCode is different. We'll fail, but put the dimensions in the message. 96c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki Assert.fail(failReason + ", expected dimentions=" + getImageDimensions(expected) + 9787426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki " actual dimentions=" + getImageDimensions(actual) + 9887426833d4c2c626e032f5d0b84a08b58024daf6Makoto Onuki " Data written to " + expectedFile + " and " + actualFile); 99c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki } 100c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki 101c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki private static final String getImageDimensions(byte[] imageData) { 102c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki BitmapFactory.Options o = new BitmapFactory.Options(); 103c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki o.inJustDecodeBounds = true; 104c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki BitmapFactory.decodeByteArray(imageData, 0, imageData.length, o); 105c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki 106c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki return "[" + o.outWidth + " x " + o.outHeight + "]"; 107c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki } 10863630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki 10963630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki public static void assertUnique(Object... values) { 11063630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Set<Object> set = Sets.newHashSet(); 11163630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki for (Object o : values) { 11263630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki Assert.assertFalse("Duplicate found: " + o, set.contains(o)); 11363630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki set.add(o); 11463630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki } 11563630bc7f962fd2b6f2c1bc41cbed45a8bc354baMakoto Onuki } 11659f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee} 117