AccountManagerServiceTest.java revision eeca6584cff3858e6993dd4b88f1b55418f07ad2
1/*
2 * Copyright (C) 2009 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.server.accounts;
18
19import static org.mockito.Matchers.eq;
20import static org.mockito.Mockito.mock;
21import static org.mockito.Mockito.when;
22
23import android.accounts.Account;
24import android.accounts.AuthenticatorDescription;
25import android.app.AppOpsManager;
26import android.app.Notification;
27import android.content.BroadcastReceiver;
28import android.content.Context;
29import android.content.Intent;
30import android.content.IntentFilter;
31import android.content.pm.PackageManager;
32import android.content.pm.RegisteredServicesCache.ServiceInfo;
33import android.content.pm.RegisteredServicesCacheListener;
34import android.content.pm.UserInfo;
35import android.database.DatabaseErrorHandler;
36import android.database.sqlite.SQLiteDatabase;
37import android.os.Bundle;
38import android.os.Handler;
39import android.os.UserHandle;
40import android.os.UserManager;
41import android.test.AndroidTestCase;
42import android.test.mock.MockContext;
43import android.test.mock.MockPackageManager;
44import android.util.Log;
45
46import java.io.File;
47import java.io.FileDescriptor;
48import java.io.PrintWriter;
49import java.util.ArrayList;
50import java.util.Arrays;
51import java.util.Collection;
52import java.util.Comparator;
53
54public class AccountManagerServiceTest extends AndroidTestCase {
55    private static final String TAG = AccountManagerServiceTest.class.getSimpleName();
56
57    static final String PREN_DB = "pren.db";
58    static final String DE_DB = "de.db";
59    static final String CE_DB = "ce.db";
60    private AccountManagerService mAms;
61
62    @Override
63    protected void setUp() throws Exception {
64        Context realTestContext = getContext();
65        Context mockContext = new MyMockContext(realTestContext);
66        setContext(mockContext);
67        mAms = new MyAccountManagerService(getContext(),
68                new MyMockPackageManager(), new MockAccountAuthenticatorCache(), realTestContext);
69    }
70
71    @Override
72    protected void tearDown() throws Exception {
73        new File(mAms.getCeDatabaseName(UserHandle.USER_SYSTEM)).delete();
74        new File(mAms.getDeDatabaseName(UserHandle.USER_SYSTEM)).delete();
75        new File(mAms.getPreNDatabaseName(UserHandle.USER_SYSTEM)).delete();
76        super.tearDown();
77    }
78
79    public class AccountSorter implements Comparator<Account> {
80        public int compare(Account object1, Account object2) {
81            if (object1 == object2) return 0;
82            if (object1 == null) return 1;
83            if (object2 == null) return -1;
84            int result = object1.type.compareTo(object2.type);
85            if (result != 0) return result;
86            return object1.name.compareTo(object2.name);
87        }
88    }
89
90    public void testCheckAddAccount() throws Exception {
91        unlockUser(UserHandle.USER_SYSTEM);
92        Account a11 = new Account("account1", "type1");
93        Account a21 = new Account("account2", "type1");
94        Account a31 = new Account("account3", "type1");
95        Account a12 = new Account("account1", "type2");
96        Account a22 = new Account("account2", "type2");
97        Account a32 = new Account("account3", "type2");
98        mAms.addAccountExplicitly(a11, "p11", null);
99        mAms.addAccountExplicitly(a12, "p12", null);
100        mAms.addAccountExplicitly(a21, "p21", null);
101        mAms.addAccountExplicitly(a22, "p22", null);
102        mAms.addAccountExplicitly(a31, "p31", null);
103        mAms.addAccountExplicitly(a32, "p32", null);
104
105        Account[] accounts = mAms.getAccounts(null, mContext.getOpPackageName());
106        Arrays.sort(accounts, new AccountSorter());
107        assertEquals(6, accounts.length);
108        assertEquals(a11, accounts[0]);
109        assertEquals(a21, accounts[1]);
110        assertEquals(a31, accounts[2]);
111        assertEquals(a12, accounts[3]);
112        assertEquals(a22, accounts[4]);
113        assertEquals(a32, accounts[5]);
114
115        accounts = mAms.getAccounts("type1", mContext.getOpPackageName());
116        Arrays.sort(accounts, new AccountSorter());
117        assertEquals(3, accounts.length);
118        assertEquals(a11, accounts[0]);
119        assertEquals(a21, accounts[1]);
120        assertEquals(a31, accounts[2]);
121
122        mAms.removeAccountInternal(a21);
123
124        accounts = mAms.getAccounts("type1", mContext.getOpPackageName());
125        Arrays.sort(accounts, new AccountSorter());
126        assertEquals(2, accounts.length);
127        assertEquals(a11, accounts[0]);
128        assertEquals(a31, accounts[1]);
129    }
130
131    public void testPasswords() throws Exception {
132        unlockUser(UserHandle.USER_SYSTEM);
133        Account a11 = new Account("account1", "type1");
134        Account a12 = new Account("account1", "type2");
135        mAms.addAccountExplicitly(a11, "p11", null);
136        mAms.addAccountExplicitly(a12, "p12", null);
137
138        assertEquals("p11", mAms.getPassword(a11));
139        assertEquals("p12", mAms.getPassword(a12));
140
141        mAms.setPassword(a11, "p11b");
142
143        assertEquals("p11b", mAms.getPassword(a11));
144        assertEquals("p12", mAms.getPassword(a12));
145    }
146
147    public void testUserdata() throws Exception {
148        unlockUser(UserHandle.USER_SYSTEM);
149        Account a11 = new Account("account1", "type1");
150        Bundle u11 = new Bundle();
151        u11.putString("a", "a_a11");
152        u11.putString("b", "b_a11");
153        u11.putString("c", "c_a11");
154        Account a12 = new Account("account1", "type2");
155        Bundle u12 = new Bundle();
156        u12.putString("a", "a_a12");
157        u12.putString("b", "b_a12");
158        u12.putString("c", "c_a12");
159        mAms.addAccountExplicitly(a11, "p11", u11);
160        mAms.addAccountExplicitly(a12, "p12", u12);
161
162        assertEquals("a_a11", mAms.getUserData(a11, "a"));
163        assertEquals("b_a11", mAms.getUserData(a11, "b"));
164        assertEquals("c_a11", mAms.getUserData(a11, "c"));
165        assertEquals("a_a12", mAms.getUserData(a12, "a"));
166        assertEquals("b_a12", mAms.getUserData(a12, "b"));
167        assertEquals("c_a12", mAms.getUserData(a12, "c"));
168
169        mAms.setUserData(a11, "b", "b_a11b");
170        mAms.setUserData(a12, "c", null);
171
172        assertEquals("a_a11", mAms.getUserData(a11, "a"));
173        assertEquals("b_a11b", mAms.getUserData(a11, "b"));
174        assertEquals("c_a11", mAms.getUserData(a11, "c"));
175        assertEquals("a_a12", mAms.getUserData(a12, "a"));
176        assertEquals("b_a12", mAms.getUserData(a12, "b"));
177        assertNull(mAms.getUserData(a12, "c"));
178    }
179
180    public void testAuthtokens() throws Exception {
181        unlockUser(UserHandle.USER_SYSTEM);
182        Account a11 = new Account("account1", "type1");
183        Account a12 = new Account("account1", "type2");
184        mAms.addAccountExplicitly(a11, "p11", null);
185        mAms.addAccountExplicitly(a12, "p12", null);
186
187        mAms.setAuthToken(a11, "att1", "a11_att1");
188        mAms.setAuthToken(a11, "att2", "a11_att2");
189        mAms.setAuthToken(a11, "att3", "a11_att3");
190        mAms.setAuthToken(a12, "att1", "a12_att1");
191        mAms.setAuthToken(a12, "att2", "a12_att2");
192        mAms.setAuthToken(a12, "att3", "a12_att3");
193
194        assertEquals("a11_att1", mAms.peekAuthToken(a11, "att1"));
195        assertEquals("a11_att2", mAms.peekAuthToken(a11, "att2"));
196        assertEquals("a11_att3", mAms.peekAuthToken(a11, "att3"));
197        assertEquals("a12_att1", mAms.peekAuthToken(a12, "att1"));
198        assertEquals("a12_att2", mAms.peekAuthToken(a12, "att2"));
199        assertEquals("a12_att3", mAms.peekAuthToken(a12, "att3"));
200
201        mAms.setAuthToken(a11, "att3", "a11_att3b");
202        mAms.invalidateAuthToken(a12.type, "a12_att2");
203
204        assertEquals("a11_att1", mAms.peekAuthToken(a11, "att1"));
205        assertEquals("a11_att2", mAms.peekAuthToken(a11, "att2"));
206        assertEquals("a11_att3b", mAms.peekAuthToken(a11, "att3"));
207        assertEquals("a12_att1", mAms.peekAuthToken(a12, "att1"));
208        assertNull(mAms.peekAuthToken(a12, "att2"));
209        assertEquals("a12_att3", mAms.peekAuthToken(a12, "att3"));
210
211        assertNull(mAms.peekAuthToken(a12, "att2"));
212    }
213
214    private void unlockUser(int userId) {
215        Intent intent = new Intent();
216        intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
217        mAms.onUserUnlocked(intent);
218    }
219
220    static public class MockAccountAuthenticatorCache implements IAccountAuthenticatorCache {
221        private ArrayList<ServiceInfo<AuthenticatorDescription>> mServices;
222
223        public MockAccountAuthenticatorCache() {
224            mServices = new ArrayList<>();
225            AuthenticatorDescription d1 = new AuthenticatorDescription("type1", "p1", 0, 0, 0, 0);
226            AuthenticatorDescription d2 = new AuthenticatorDescription("type2", "p2", 0, 0, 0, 0);
227            mServices.add(new ServiceInfo<>(d1, null, null));
228            mServices.add(new ServiceInfo<>(d2, null, null));
229        }
230
231        @Override
232        public ServiceInfo<AuthenticatorDescription> getServiceInfo(
233                AuthenticatorDescription type, int userId) {
234            for (ServiceInfo<AuthenticatorDescription> service : mServices) {
235                if (service.type.equals(type)) {
236                    return service;
237                }
238            }
239            return null;
240        }
241
242        @Override
243        public Collection<ServiceInfo<AuthenticatorDescription>> getAllServices(int userId) {
244            return mServices;
245        }
246
247        @Override
248        public void dump(
249                final FileDescriptor fd, final PrintWriter fout, final String[] args, int userId) {
250        }
251
252        @Override
253        public void setListener(
254                final RegisteredServicesCacheListener<AuthenticatorDescription> listener,
255                final Handler handler) {
256        }
257
258        @Override
259        public void invalidateCache(int userId) {
260        }
261    }
262
263    static public class MyMockContext extends MockContext {
264        private Context mTestContext;
265        private AppOpsManager mAppOpsManager;
266        private UserManager mUserManager;
267
268        public MyMockContext(Context testContext) {
269            this.mTestContext = testContext;
270            this.mAppOpsManager = mock(AppOpsManager.class);
271            this.mUserManager = mock(UserManager.class);
272            final UserInfo ui = new UserInfo(UserHandle.USER_SYSTEM, "user0", 0);
273            when(mUserManager.getUserInfo(eq(ui.id))).thenReturn(ui);
274        }
275
276        @Override
277        public int checkCallingOrSelfPermission(final String permission) {
278            return PackageManager.PERMISSION_GRANTED;
279        }
280
281        @Override
282        public Object getSystemService(String name) {
283            if (Context.APP_OPS_SERVICE.equals(name)) {
284                return mAppOpsManager;
285            } else if( Context.USER_SERVICE.equals(name)) {
286                return mUserManager;
287            }
288            return null;
289        }
290
291        @Override
292        public String getSystemServiceName(Class<?> serviceClass) {
293            if (AppOpsManager.class.equals(serviceClass)) {
294                return Context.APP_OPS_SERVICE;
295            }
296            return null;
297        }
298
299        @Override
300        public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
301            return null;
302        }
303
304        @Override
305        public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
306                IntentFilter filter, String broadcastPermission, Handler scheduler) {
307            return null;
308        }
309
310        @Override
311        public SQLiteDatabase openOrCreateDatabase(String file, int mode,
312                SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
313            Log.i(TAG, "openOrCreateDatabase " + file + " mode " + mode);
314            return mTestContext.openOrCreateDatabase(file, mode, factory,errorHandler);
315        }
316
317        @Override
318        public void sendBroadcastAsUser(Intent intent, UserHandle user) {
319            Log.i(TAG, "sendBroadcastAsUser " + intent + " " + user);
320        }
321
322        @Override
323        public String getOpPackageName() {
324            return null;
325        }
326    }
327
328    static public class MyMockPackageManager extends MockPackageManager {
329        @Override
330        public int checkSignatures(final int uid1, final int uid2) {
331            return PackageManager.SIGNATURE_MATCH;
332        }
333    }
334
335    static public class MyAccountManagerService extends AccountManagerService {
336        private Context mRealTestContext;
337        public MyAccountManagerService(Context context, PackageManager packageManager,
338                IAccountAuthenticatorCache authenticatorCache, Context realTestContext) {
339            super(context, packageManager, authenticatorCache);
340            this.mRealTestContext = realTestContext;
341        }
342
343        @Override
344        protected void installNotification(final int notificationId, final Notification n, UserHandle user) {
345        }
346
347        @Override
348        protected void cancelNotification(final int id, UserHandle user) {
349        }
350
351        @Override
352        protected String getCeDatabaseName(int userId) {
353            return new File(mRealTestContext.getCacheDir(), CE_DB).getPath();
354        }
355
356        @Override
357        protected String getDeDatabaseName(int userId) {
358            return new File(mRealTestContext.getCacheDir(), DE_DB).getPath();
359        }
360
361        @Override
362        String getPreNDatabaseName(int userId) {
363            return new File(mRealTestContext.getCacheDir(), PREN_DB).getPath();
364        }
365    }
366}
367