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