1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.contacts.common.database;
18
19import android.database.Cursor;
20import android.net.Uri;
21import android.test.InstrumentationTestCase;
22import android.test.mock.MockContentProvider;
23import android.test.mock.MockContentResolver;
24
25import java.util.concurrent.CountDownLatch;
26import java.util.concurrent.TimeUnit;
27
28/**
29 * Unit test for {@link NoNullCursorAsyncQueryHandler}
30 */
31public class NoNullCursorAsyncQueryHandlerTest extends InstrumentationTestCase {
32
33    private MockContentResolver mMockContentResolver;
34
35    private static final String AUTHORITY = "com.android.contacts.common.unittest";
36    private static final Uri URI = Uri.parse("content://" + AUTHORITY);
37    private static final String[] PROJECTION = new String[]{"column1", "column2"};
38
39    @Override
40    public void setUp() throws Exception {
41        super.setUp();
42        mMockContentResolver = new MockContentResolver();
43        final MockContentProvider mMockContentProvider = new MockContentProvider() {
44            @Override
45            public Cursor query(Uri uri, String[] projection, String selection,
46                    String[] selectionArgs,
47                    String sortOrder) {
48                return null;
49            }
50        };
51
52        mMockContentResolver.addProvider(AUTHORITY, mMockContentProvider);
53    }
54
55    public void testCursorIsNotNull() throws Throwable {
56
57        final CountDownLatch latch = new CountDownLatch(1);
58        final ObjectHolder<Cursor> cursorHolder = ObjectHolder.newInstance();
59        final ObjectHolder<Boolean> ranHolder = ObjectHolder.newInstance(false);
60
61        runTestOnUiThread(new Runnable() {
62
63            @Override
64            public void run() {
65
66                NoNullCursorAsyncQueryHandler handler = new NoNullCursorAsyncQueryHandler(
67                        mMockContentResolver) {
68                    @Override
69                    protected void onNotNullableQueryComplete(int token, Object cookie,
70                            Cursor cursor) {
71                        cursorHolder.obj = cursor;
72                        ranHolder.obj = true;
73                        latch.countDown();
74                    }
75                };
76                handler.startQuery(1, null, URI, PROJECTION, null, null, null);
77            }
78        });
79
80        latch.await(5, TimeUnit.SECONDS);
81        assertFalse(cursorHolder.obj == null);
82        assertTrue(ranHolder.obj);
83    }
84
85    public void testCursorContainsCorrectCookies() throws Throwable {
86        final ObjectHolder<Boolean> ranHolder = ObjectHolder.newInstance(false);
87        final CountDownLatch latch = new CountDownLatch(1);
88        final ObjectHolder<Object> cookieHolder = ObjectHolder.newInstance();
89        final String cookie = "TEST COOKIE";
90        runTestOnUiThread(new Runnable() {
91            @Override
92            public void run() {
93                final NoNullCursorAsyncQueryHandler handler = new NoNullCursorAsyncQueryHandler(
94                        mMockContentResolver) {
95                    @Override
96                    protected void onNotNullableQueryComplete(int token, Object cookie,
97                            Cursor cursor) {
98                        ranHolder.obj = true;
99                        cookieHolder.obj = cookie;
100                        latch.countDown();
101                    }
102                };
103                handler.startQuery(1, cookie, URI, PROJECTION, null, null, null);
104            }
105        });
106
107        latch.await(5, TimeUnit.SECONDS);
108        assertSame(cookie, cookieHolder.obj);
109        assertTrue(ranHolder.obj);
110    }
111
112    public void testCursorContainsCorrectColumns() throws Throwable {
113        final ObjectHolder<Boolean> ranHolder = ObjectHolder.newInstance(false);
114        final CountDownLatch latch = new CountDownLatch(1);
115        final ObjectHolder<Cursor> cursorHolder = ObjectHolder.newInstance();
116        final String cookie = "TEST COOKIE";
117        runTestOnUiThread(new Runnable() {
118            @Override
119            public void run() {
120                final NoNullCursorAsyncQueryHandler handler = new NoNullCursorAsyncQueryHandler(
121                        mMockContentResolver) {
122                    @Override
123                    protected void onNotNullableQueryComplete(int token, Object cookie,
124                            Cursor cursor) {
125                        ranHolder.obj = true;
126                        cursorHolder.obj = cursor;
127                        latch.countDown();
128                    }
129                };
130                handler.startQuery(1, cookie, URI, PROJECTION, null, null, null);
131            }
132        });
133
134        latch.await(5, TimeUnit.SECONDS);
135        assertSame(PROJECTION, cursorHolder.obj.getColumnNames());
136        assertTrue(ranHolder.obj);
137    }
138
139    private static class ObjectHolder<T> {
140        public T obj;
141
142        public static <E> ObjectHolder<E> newInstance() {
143            return new ObjectHolder<E>();
144        }
145
146        public static <E> ObjectHolder<E> newInstance(E value) {
147            ObjectHolder<E> holder = new ObjectHolder<E>();
148            holder.obj = value;
149            return holder;
150        }
151    }
152}
153