1c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee/*
2c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee * Copyright (C) 2011 The Android Open Source Project
3c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee *
4c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee * Licensed under the Apache License, Version 2.0 (the "License");
5c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee * you may not use this file except in compliance with the License.
6c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee * You may obtain a copy of the License at
7c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee *
8c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee *      http://www.apache.org/licenses/LICENSE-2.0
9c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee *
10c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee * Unless required by applicable law or agreed to in writing, software
11c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee * distributed under the License is distributed on an "AS IS" BASIS,
12c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee * See the License for the specific language governing permissions and
14c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee * limitations under the License
15c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee */
16c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
17c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjeepackage com.android.providers.contacts;
18c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
19c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjeeimport android.content.ContentProvider;
20aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerdaimport android.content.ContentValues;
21c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjeeimport android.content.Context;
22c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjeeimport android.content.ContextWrapper;
23c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjeeimport android.content.Intent;
24c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjeeimport android.content.pm.PackageManager;
25aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerdaimport android.provider.CallLog.Calls;
26c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjeeimport android.provider.VoicemailContract;
27c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
28c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjeeimport java.io.File;
29c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjeeimport java.util.ArrayList;
30c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjeeimport java.util.Collections;
31c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjeeimport java.util.List;
32c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
33c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee/**
34c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee * Base class for all tests that require interacting with the voicemail content provider.
35c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee */
360a54148a9a8313f78ecd3d112134f2dee4479bb8Makoto Onukipublic abstract class BaseVoicemailProviderTest extends BaseContactsProvider2Test {
37c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
38c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected boolean mUseSourceUri = false;
39c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    private File mTestDirectory;
40c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
41c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    @Override
42c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected void setUp() throws Exception {
43c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        super.setUp();
44c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        addProvider(TestVoicemailProvider.class, VoicemailContract.AUTHORITY);
45c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        TestVoicemailProvider.setVvmProviderCallDelegate(createMockProviderCalls());
46c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
47c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
48c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    @Override
49c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected void tearDown() throws Exception {
50c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        removeTestDirectory();
51c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        super.tearDown();
52c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
53c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
54c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    @Override
55c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected Class<? extends ContentProvider> getProviderClass() {
56c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee       return TestVoicemailProvider.class;
57c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
58c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
59c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    @Override
60c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected String getAuthority() {
61c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        return VoicemailContract.AUTHORITY;
62c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
63c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
64c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected void setUpForOwnPermission() {
652ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee        mActor.removePermissions(READ_VOICEMAIL_PERMISSION);
662ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee        mActor.removePermissions(WRITE_VOICEMAIL_PERMISSION);
670b442c4154c77f39aeb84216f433e5bd11cbf79eDebashish Chatterjee        mActor.addPermissions(ADD_VOICEMAIL_PERMISSION);
68c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        mUseSourceUri = true;
69c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
70c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
71c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected void setUpForFullPermission() {
720b442c4154c77f39aeb84216f433e5bd11cbf79eDebashish Chatterjee        mActor.addPermissions(ADD_VOICEMAIL_PERMISSION);
732ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee        mActor.addPermissions(READ_VOICEMAIL_PERMISSION);
742ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee        mActor.addPermissions(WRITE_VOICEMAIL_PERMISSION);
75c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        mUseSourceUri = false;
76c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
77c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
78c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected void setUpForNoPermission() {
790b442c4154c77f39aeb84216f433e5bd11cbf79eDebashish Chatterjee        mActor.removePermissions(ADD_VOICEMAIL_PERMISSION);
802ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee        mActor.removePermissions(READ_VOICEMAIL_PERMISSION);
812ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee        mActor.removePermissions(WRITE_VOICEMAIL_PERMISSION);
82c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        mUseSourceUri = true;
83c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
84c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
85c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected int countFilesInTestDirectory() {
86c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        return findAllFiles(mTestDirectory).size();
87c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
88c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
89c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    // TODO: Use a mocking framework to mock these calls.
90c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    private VvmProviderCalls createMockProviderCalls() {
91c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        return new VvmProviderCalls() {
92c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            @Override
93c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
94c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                // Do nothing for now.
95c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            }
96c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
97c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            @Override
98c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            public File getDir(String name, int mode) {
99c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                return getTestDirectory();
100c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            }
101c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        };
102c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
103c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
104c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    /** Lazily construct the test directory when required. */
105c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    private synchronized File getTestDirectory() {
106c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        if (mTestDirectory == null) {
107c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            File baseDirectory = getContext().getCacheDir();
108c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            mTestDirectory = new File(baseDirectory, Long.toString(System.currentTimeMillis()));
109c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            assertFalse(mTestDirectory.exists());
110c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            assertTrue(mTestDirectory.mkdirs());
111c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
112c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        return mTestDirectory;
113c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
114c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
115c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    private void removeTestDirectory() {
116c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        if (mTestDirectory != null) {
117c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            recursiveDeleteAll(mTestDirectory);
118c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
119c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
120c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
121c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    private static void recursiveDeleteAll(File input) {
122c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        if (input.isDirectory()) {
123c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            for (File file : input.listFiles()) {
124c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                recursiveDeleteAll(file);
125c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            }
126c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
127c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        assertTrue("error deleting " + input.getAbsolutePath(), input.delete());
128c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
129c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
130c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    private List<File> findAllFiles(File input) {
131c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        if (input == null) {
132c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            return Collections.emptyList();
133c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
134c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        if (!input.isDirectory()) {
135c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            return Collections.singletonList(input);
136c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
137c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        List<File> results = new ArrayList<File>();
138c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        for (File file : input.listFiles()) {
139c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            results.addAll(findAllFiles(file));
140c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
141c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        return results;
142c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
143c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
144c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    /** The calls that we need to mock out for our VvmProvider, used by TestVoicemailProvider. */
145c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    private interface VvmProviderCalls {
146c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        public void sendOrderedBroadcast(Intent intent, String receiverPermission);
147c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        public File getDir(String name, int mode);
148c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
149c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
150c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    public static class TestVoicemailProvider extends VoicemailContentProvider {
151c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        private static VvmProviderCalls mDelegate;
152c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        public static synchronized void setVvmProviderCallDelegate(VvmProviderCalls delegate) {
153c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            mDelegate = delegate;
154c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
155c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
156c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        @Override
157c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        protected ContactsDatabaseHelper getDatabaseHelper(Context context) {
1589b626252d91e451a822f48cd127aef5d609a6257Makoto Onuki            return ContactsDatabaseHelper.getNewInstanceForTest(context);
159c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
160c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
161c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        @Override
162c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        protected Context context() {
163c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            return new ContextWrapper(getContext()) {
164c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                @Override
165c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                public File getDir(String name, int mode) {
166c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                    return mDelegate.getDir(name, mode);
167c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                }
168c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                @Override
169c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                public void sendBroadcast(Intent intent, String receiverPermission) {
170c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                    mDelegate.sendOrderedBroadcast(intent, receiverPermission);
171c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                }
172c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                @Override
173c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                public PackageManager getPackageManager() {
174c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                    return new MockPackageManager("com.test.package1", "com.test.package2");
175c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                }
176c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            };
177c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
178c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
179c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        @Override
18066d989c439fbb82a5b40a7efffa2f28208cf11d8Jeff Sharkey        protected String getCallingPackage_() {
181c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            return getContext().getPackageName();
182c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
183aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda
184aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda        @Override
185aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda        CallLogInsertionHelper createCallLogInsertionHelper(Context context) {
186aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda            return new CallLogInsertionHelper() {
187aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                @Override
188aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                public String getGeocodedLocationFor(String number, String countryIso) {
189aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                    return "usa";
190aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                }
191aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda
192aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                @Override
193aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                public void addComputedValues(ContentValues values) {
194aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                    values.put(Calls.COUNTRY_ISO, "us");
195aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                    values.put(Calls.GEOCODED_LOCATION, "usa");
196aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                }
197aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda            };
198aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda        }
199c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
200c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee}
201