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