1e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck/*
2e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Copyright (C) 2011 The Android Open Source Project
3e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck *
4e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Licensed under the Apache License, Version 2.0 (the "License");
5e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * you may not use this file except in compliance with the License.
6e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * You may obtain a copy of the License at
7e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck *
8e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck *      http://www.apache.org/licenses/LICENSE-2.0
9e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck *
10e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Unless required by applicable law or agreed to in writing, software
11e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * distributed under the License is distributed on an "AS IS" BASIS,
12e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * See the License for the specific language governing permissions and
14e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * limitations under the License.
15e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck */
16e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
17e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckpackage com.android.browser.tests.utils;
18e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
19e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.content.ContentProvider;
20e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.content.Context;
2157e39f9e46091750c8a07895531446a7f0efdb21John Reckimport android.content.SharedPreferences;
22e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.content.res.Resources;
23e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.database.ContentObserver;
24e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.net.Uri;
25e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.test.AndroidTestCase;
26e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.test.IsolatedContext;
27e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.test.RenamingDelegatingContext;
28e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.test.mock.MockContext;
29e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
30e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport java.io.File;
31e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
32e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck/**
33e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Replacement for ProviderTestCase2 that keeps calls to ContentResolver.notifyChanged
34e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * internal to observers registered with ProviderTestCase3.registerContentObserver
35e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck */
36e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckpublic abstract class ProviderTestCase3<T extends ContentProvider> extends AndroidTestCase {
37e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
38db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck    public static final String FILENAME_PREFIX = "test.";
39db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck
40e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    Class<T> mProviderClass;
41e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    String[] mProviderAuthority;
42e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
43e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    private IsolatedContext mProviderContext;
44e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    private MockContentResolver2 mResolver;
45e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
46e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    private class MockContext2 extends MockContext {
47e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
48e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        @Override
49e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        public Resources getResources() {
50e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck            return getContext().getResources();
51e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        }
52e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
53e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        @Override
54e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        public File getDir(String name, int mode) {
55e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck            // name the directory so the directory will be separated from
56e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck            // one created through the regular Context
57e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck            return getContext().getDir("mockcontext2_" + name, mode);
58e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        }
59e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
60e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        @Override
6157e39f9e46091750c8a07895531446a7f0efdb21John Reck        public String getPackageName() {
6257e39f9e46091750c8a07895531446a7f0efdb21John Reck            return getContext().getPackageName();
6357e39f9e46091750c8a07895531446a7f0efdb21John Reck        }
6457e39f9e46091750c8a07895531446a7f0efdb21John Reck
6557e39f9e46091750c8a07895531446a7f0efdb21John Reck        @Override
6657e39f9e46091750c8a07895531446a7f0efdb21John Reck        public SharedPreferences getSharedPreferences(String name, int mode) {
6757e39f9e46091750c8a07895531446a7f0efdb21John Reck            return getContext().getSharedPreferences("mockcontext2_" + name, mode);
6857e39f9e46091750c8a07895531446a7f0efdb21John Reck        }
6957e39f9e46091750c8a07895531446a7f0efdb21John Reck
7057e39f9e46091750c8a07895531446a7f0efdb21John Reck        @Override
71e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        public Context getApplicationContext() {
72e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck            return this;
73e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        }
74ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck
75ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck        @Override
76ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck        public Object getSystemService(String name) {
77ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck            return null;
78ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck        }
79e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    }
80e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    /**
81e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * Constructor.
82e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     *
83e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * @param providerClass The class name of the provider under test
84e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * @param providerAuthorities The provider's authority string
85e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     */
86e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    public ProviderTestCase3(Class<T> providerClass, String... providerAuthorities) {
87e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        mProviderClass = providerClass;
88e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        mProviderAuthority = providerAuthorities;
89e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    }
90e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
91e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    private T mProvider;
92e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
93e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    /**
94e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * Returns the content provider created by this class in the {@link #setUp()} method.
95e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * @return T An instance of the provider class given as a parameter to the test case class.
96e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     */
97e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    public T getProvider() {
98e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        return mProvider;
99e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    }
100e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
101e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    /**
102e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * Sets up the environment for the test fixture.
103e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * <p>
104e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * Creates a new
105e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * {@link com.android.browser.tests.utils.MockContentResolver2}, a new IsolatedContext
106e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * that isolates the provider's file operations, and a new instance of
107e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * the provider under test within the isolated environment.
108e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * </p>
109e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     *
110e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * @throws Exception
111e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     */
112e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    @Override
113e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    protected void setUp() throws Exception {
114e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        super.setUp();
115e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
116e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        mResolver = new MockContentResolver2();
117e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        RenamingDelegatingContext targetContextWrapper = new
118e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck                RenamingDelegatingContext(
119e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck                new MockContext2(), // The context that most methods are
120e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck                                    //delegated to
121e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck                getContext(), // The context that file methods are delegated to
122db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck                FILENAME_PREFIX);
123ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck        // The default IsolatedContext has a mock AccountManager that doesn't
124ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck        // work for us, so override getSystemService to always return null
125ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck        mProviderContext = new IsolatedContext(mResolver, targetContextWrapper) {
126ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck
127ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck            @Override
128ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck            public Object getSystemService(String name) {
129ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck                return null;
130ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck            }
131ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck        };
132e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
133e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        mProvider = mProviderClass.newInstance();
134e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        mProvider.attachInfo(mProviderContext, null);
135e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        assertNotNull(mProvider);
136e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        for (String auth : mProviderAuthority) {
137e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck            mResolver.addProvider(auth, getProvider());
138e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        }
139e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    }
140e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
141e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    /**
142e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * Tears down the environment for the test fixture.
143e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * <p>
144e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * Calls {@link android.content.ContentProvider#shutdown()} on the
145e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * {@link android.content.ContentProvider} represented by mProvider.
146e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     */
147e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    @Override
148e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    protected void tearDown() throws Exception {
149e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        mProvider.shutdown();
150e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        super.tearDown();
151e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    }
152e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
153e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    /**
154e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * Gets the {@link MockContentResolver2} created by this class during initialization. You
155e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * must use the methods of this resolver to access the provider under test.
156e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     *
157e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * @return A {@link MockContentResolver2} instance.
158e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     */
159e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    public MockContentResolver2 getMockContentResolver() {
160e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        return mResolver;
161e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    }
162e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
163e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    /**
164e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * Gets the {@link IsolatedContext} created by this class during initialization.
165e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     * @return The {@link IsolatedContext} instance
166e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck     */
167e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    public IsolatedContext getMockContext() {
168e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        return mProviderContext;
169e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    }
170e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
171e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    public void registerContentObserver(Uri uri, boolean notifyForDescendents,
172e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck            ContentObserver observer) {
173e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        mResolver.safeRegisterContentObserver(uri, notifyForDescendents, observer);
174e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    }
175e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
176e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    public void unregisterContentObserver(ContentObserver observer) {
177e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck        mResolver.safeUnregisterContentObserver(observer);
178e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck    }
179e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck
180e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck}
181