1/*
2 * Copyright (C) 2011 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.providers.contacts;
18
19import android.content.ContentProvider;
20import android.content.ContentValues;
21import android.content.Context;
22import android.content.ContextWrapper;
23import android.content.Intent;
24import android.content.pm.PackageManager;
25import android.os.Process;
26import android.provider.CallLog.Calls;
27import android.provider.VoicemailContract;
28
29import java.io.File;
30import java.util.ArrayList;
31import java.util.Collections;
32import java.util.List;
33
34/**
35 * Base class for all tests that require interacting with the voicemail content provider.
36 */
37public abstract class BaseVoicemailProviderTest extends BaseContactsProvider2Test {
38
39    protected boolean mUseSourceUri = false;
40    private File mTestDirectory;
41    ContactsMockPackageManager mPackageManager;
42
43    @Override
44    protected void setUp() throws Exception {
45        super.setUp();
46        addProvider(TestVoicemailProvider.class, VoicemailContract.AUTHORITY);
47        TestVoicemailProvider.setVvmProviderCallDelegate(createMockProviderCalls());
48
49        mPackageManager = (ContactsMockPackageManager) getProvider()
50                .getContext().getPackageManager();
51        mPackageManager.addPackage(Process.myUid(), mActor.packageName);
52    }
53
54    @Override
55    protected void tearDown() throws Exception {
56        removeTestDirectory();
57        super.tearDown();
58    }
59
60    @Override
61    protected Class<? extends ContentProvider> getProviderClass() {
62       return TestVoicemailProvider.class;
63    }
64
65    @Override
66    protected String getAuthority() {
67        return VoicemailContract.AUTHORITY;
68    }
69
70    protected void setUpForOwnPermission() {
71        mActor.removePermissions(READ_VOICEMAIL_PERMISSION);
72        mActor.removePermissions(WRITE_VOICEMAIL_PERMISSION);
73        mActor.addPermissions(ADD_VOICEMAIL_PERMISSION);
74        mUseSourceUri = true;
75    }
76
77    protected void setUpForFullPermission() {
78        mActor.addPermissions(ADD_VOICEMAIL_PERMISSION);
79        mActor.addPermissions(READ_VOICEMAIL_PERMISSION);
80        mActor.addPermissions(WRITE_VOICEMAIL_PERMISSION);
81        mUseSourceUri = false;
82    }
83
84    protected void setUpForNoPermission() {
85        mActor.removePermissions(ADD_VOICEMAIL_PERMISSION);
86        mActor.removePermissions(READ_VOICEMAIL_PERMISSION);
87        mActor.removePermissions(WRITE_VOICEMAIL_PERMISSION);
88        mUseSourceUri = true;
89    }
90
91    protected int countFilesInTestDirectory() {
92        return findAllFiles(mTestDirectory).size();
93    }
94
95    // TODO: Use a mocking framework to mock these calls.
96    private VvmProviderCalls createMockProviderCalls() {
97        return new VvmProviderCalls() {
98            @Override
99            public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
100                // Do nothing for now.
101            }
102
103            @Override
104            public File getDir(String name, int mode) {
105                return getTestDirectory();
106            }
107
108            @Override
109            public PackageManager getPackageManager() {
110                return mActor.getProviderContext().getPackageManager();
111            }
112        };
113    }
114
115    /** Lazily construct the test directory when required. */
116    private synchronized File getTestDirectory() {
117        if (mTestDirectory == null) {
118            File baseDirectory = getContext().getCacheDir();
119            mTestDirectory = new File(baseDirectory, Long.toString(System.currentTimeMillis()));
120            assertFalse(mTestDirectory.exists());
121            assertTrue(mTestDirectory.mkdirs());
122        }
123        return mTestDirectory;
124    }
125
126    private void removeTestDirectory() {
127        if (mTestDirectory != null) {
128            recursiveDeleteAll(mTestDirectory);
129        }
130    }
131
132    private static void recursiveDeleteAll(File input) {
133        if (input.isDirectory()) {
134            for (File file : input.listFiles()) {
135                recursiveDeleteAll(file);
136            }
137        }
138        assertTrue("error deleting " + input.getAbsolutePath(), input.delete());
139    }
140
141    private List<File> findAllFiles(File input) {
142        if (input == null) {
143            return Collections.emptyList();
144        }
145        if (!input.isDirectory()) {
146            return Collections.singletonList(input);
147        }
148        List<File> results = new ArrayList<File>();
149        for (File file : input.listFiles()) {
150            results.addAll(findAllFiles(file));
151        }
152        return results;
153    }
154
155    /** The calls that we need to mock out for our VvmProvider, used by TestVoicemailProvider. */
156    private interface VvmProviderCalls {
157        public void sendOrderedBroadcast(Intent intent, String receiverPermission);
158        public File getDir(String name, int mode);
159        public PackageManager getPackageManager();
160    }
161
162    public static class TestVoicemailProvider extends VoicemailContentProvider {
163        private static VvmProviderCalls mDelegate;
164        public static synchronized void setVvmProviderCallDelegate(VvmProviderCalls delegate) {
165            mDelegate = delegate;
166        }
167
168        @Override
169        protected ContactsDatabaseHelper getDatabaseHelper(Context context) {
170            return ContactsDatabaseHelper.getNewInstanceForTest(context);
171        }
172
173        @Override
174        protected Context context() {
175            return new ContextWrapper(getContext()) {
176                @Override
177                public File getDir(String name, int mode) {
178                    return mDelegate.getDir(name, mode);
179                }
180                @Override
181                public void sendBroadcast(Intent intent, String receiverPermission) {
182                    mDelegate.sendOrderedBroadcast(intent, receiverPermission);
183                }
184                @Override
185                public PackageManager getPackageManager() {
186                    return mDelegate.getPackageManager();
187                }
188            };
189        }
190
191        @Override
192        protected String getCallingPackage_() {
193            return getContext().getPackageName();
194        }
195
196        @Override
197        CallLogInsertionHelper createCallLogInsertionHelper(Context context) {
198            return new CallLogInsertionHelper() {
199                @Override
200                public String getGeocodedLocationFor(String number, String countryIso) {
201                    return "usa";
202                }
203
204                @Override
205                public void addComputedValues(ContentValues values) {
206                    values.put(Calls.COUNTRY_ISO, "us");
207                    values.put(Calls.GEOCODED_LOCATION, "usa");
208                }
209            };
210        }
211    }
212}
213