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 */
36c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjeepublic class BaseVoicemailProviderTest extends BaseContactsProvider2Test {
370b442c4154c77f39aeb84216f433e5bd11cbf79eDebashish Chatterjee    private static final String READ_WRITE_ALL_PERMISSION =
38c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            "com.android.voicemail.permission.READ_WRITE_ALL_VOICEMAIL";
390b442c4154c77f39aeb84216f433e5bd11cbf79eDebashish Chatterjee    private static final String ADD_VOICEMAIL_PERMISSION =
400b442c4154c77f39aeb84216f433e5bd11cbf79eDebashish Chatterjee            "com.android.voicemail.permission.ADD_VOICEMAIL";
41c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
42c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected boolean mUseSourceUri = false;
43c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    private File mTestDirectory;
44c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
45c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    @Override
46c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected void setUp() throws Exception {
47c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        super.setUp();
48c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        addProvider(TestVoicemailProvider.class, VoicemailContract.AUTHORITY);
49c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        TestVoicemailProvider.setVvmProviderCallDelegate(createMockProviderCalls());
50c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
51c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
52c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    @Override
53c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected void tearDown() throws Exception {
54c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        removeTestDirectory();
55c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        super.tearDown();
56c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
57c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
58c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    @Override
59c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected Class<? extends ContentProvider> getProviderClass() {
60c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee       return TestVoicemailProvider.class;
61c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
62c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
63c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    @Override
64c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected String getAuthority() {
65c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        return VoicemailContract.AUTHORITY;
66c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
67c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
68c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected void setUpForOwnPermission() {
69c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        // Give away full permission, in case it was granted previously.
700b442c4154c77f39aeb84216f433e5bd11cbf79eDebashish Chatterjee        mActor.removePermissions(READ_WRITE_ALL_PERMISSION);
710b442c4154c77f39aeb84216f433e5bd11cbf79eDebashish Chatterjee        mActor.addPermissions(ADD_VOICEMAIL_PERMISSION);
72c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        mUseSourceUri = true;
73c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
74c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
75c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected void setUpForFullPermission() {
760b442c4154c77f39aeb84216f433e5bd11cbf79eDebashish Chatterjee        mActor.addPermissions(ADD_VOICEMAIL_PERMISSION);
770b442c4154c77f39aeb84216f433e5bd11cbf79eDebashish Chatterjee        mActor.addPermissions(READ_WRITE_ALL_PERMISSION);
78c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        mUseSourceUri = false;
79c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
80c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
81c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected void setUpForNoPermission() {
820b442c4154c77f39aeb84216f433e5bd11cbf79eDebashish Chatterjee        mActor.removePermissions(ADD_VOICEMAIL_PERMISSION);
830b442c4154c77f39aeb84216f433e5bd11cbf79eDebashish Chatterjee        mActor.removePermissions(READ_WRITE_ALL_PERMISSION);
84c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        mUseSourceUri = true;
85c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
86c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
87c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    protected int countFilesInTestDirectory() {
88c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        return findAllFiles(mTestDirectory).size();
89c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
90c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
91c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    // TODO: Use a mocking framework to mock these calls.
92c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    private VvmProviderCalls createMockProviderCalls() {
93c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        return new VvmProviderCalls() {
94c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            @Override
95c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
96c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                // Do nothing for now.
97c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            }
98c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
99c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            @Override
100c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            public File getDir(String name, int mode) {
101c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                return getTestDirectory();
102c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            }
103c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        };
104c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
105c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
106c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    /** Lazily construct the test directory when required. */
107c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    private synchronized File getTestDirectory() {
108c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        if (mTestDirectory == null) {
109c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            File baseDirectory = getContext().getCacheDir();
110c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            mTestDirectory = new File(baseDirectory, Long.toString(System.currentTimeMillis()));
111c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            assertFalse(mTestDirectory.exists());
112c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            assertTrue(mTestDirectory.mkdirs());
113c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
114c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        return mTestDirectory;
115c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
116c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
117c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    private void removeTestDirectory() {
118c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        if (mTestDirectory != null) {
119c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            recursiveDeleteAll(mTestDirectory);
120c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
121c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
122c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
123c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    private static void recursiveDeleteAll(File input) {
124c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        if (input.isDirectory()) {
125c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            for (File file : input.listFiles()) {
126c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                recursiveDeleteAll(file);
127c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            }
128c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
129c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        assertTrue("error deleting " + input.getAbsolutePath(), input.delete());
130c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
131c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
132c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    private List<File> findAllFiles(File input) {
133c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        if (input == null) {
134c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            return Collections.emptyList();
135c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
136c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        if (!input.isDirectory()) {
137c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            return Collections.singletonList(input);
138c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
139c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        List<File> results = new ArrayList<File>();
140c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        for (File file : input.listFiles()) {
141c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            results.addAll(findAllFiles(file));
142c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
143c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        return results;
144c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
145c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
146c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    /** The calls that we need to mock out for our VvmProvider, used by TestVoicemailProvider. */
147c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    private interface VvmProviderCalls {
148c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        public void sendOrderedBroadcast(Intent intent, String receiverPermission);
149c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        public File getDir(String name, int mode);
150c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
151c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
152c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    public static class TestVoicemailProvider extends VoicemailContentProvider {
153c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        private static VvmProviderCalls mDelegate;
154c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        public static synchronized void setVvmProviderCallDelegate(VvmProviderCalls delegate) {
155c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            mDelegate = delegate;
156c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
157c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
158c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        @Override
159c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        protected ContactsDatabaseHelper getDatabaseHelper(Context context) {
1609b626252d91e451a822f48cd127aef5d609a6257Makoto Onuki            return ContactsDatabaseHelper.getNewInstanceForTest(context);
161c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
162c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
163c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        @Override
164c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        protected Context context() {
165c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            return new ContextWrapper(getContext()) {
166c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                @Override
167c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                public File getDir(String name, int mode) {
168c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                    return mDelegate.getDir(name, mode);
169c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                }
170c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                @Override
171c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                public void sendBroadcast(Intent intent, String receiverPermission) {
172c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                    mDelegate.sendOrderedBroadcast(intent, receiverPermission);
173c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                }
174c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                @Override
175c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                public PackageManager getPackageManager() {
176c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                    return new MockPackageManager("com.test.package1", "com.test.package2");
177c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                }
178c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            };
179c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
180c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee
181c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        @Override
182c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        protected String getCallingPackage() {
183c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee            return getContext().getPackageName();
184c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        }
185aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda
186aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda        @Override
187aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda        CallLogInsertionHelper createCallLogInsertionHelper(Context context) {
188aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda            return new CallLogInsertionHelper() {
189aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                @Override
190aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                public String getGeocodedLocationFor(String number, String countryIso) {
191aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                    return "usa";
192aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                }
193aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda
194aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                @Override
195aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                public void addComputedValues(ContentValues values) {
196aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                    values.put(Calls.COUNTRY_ISO, "us");
197aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                    values.put(Calls.GEOCODED_LOCATION, "usa");
198aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda                }
199aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda            };
200aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda        }
201c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
202c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee}
203