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 android.accounts; 18 19import android.app.Notification; 20import android.content.Context; 21import android.content.pm.PackageManager; 22import android.content.pm.RegisteredServicesCache.ServiceInfo; 23import android.content.pm.RegisteredServicesCacheListener; 24import android.os.Bundle; 25import android.os.Handler; 26import android.os.UserHandle; 27import android.test.AndroidTestCase; 28import android.test.IsolatedContext; 29import android.test.RenamingDelegatingContext; 30import android.test.mock.MockContentResolver; 31import android.test.mock.MockContext; 32import android.test.mock.MockPackageManager; 33 34import java.io.FileDescriptor; 35import java.io.PrintWriter; 36import java.util.ArrayList; 37import java.util.Arrays; 38import java.util.Collection; 39import java.util.Comparator; 40 41public class AccountManagerServiceTest extends AndroidTestCase { 42 private AccountManagerService mAms; 43 44 @Override 45 protected void setUp() throws Exception { 46 final String filenamePrefix = "test."; 47 MockContentResolver resolver = new MockContentResolver(); 48 RenamingDelegatingContext targetContextWrapper = new RenamingDelegatingContext( 49 new MyMockContext(), // The context that most methods are delegated to 50 getContext(), // The context that file methods are delegated to 51 filenamePrefix); 52 Context context = new IsolatedContext(resolver, targetContextWrapper); 53 setContext(context); 54 mAms = new MyAccountManagerService(getContext(), 55 new MyMockPackageManager(), new MockAccountAuthenticatorCache()); 56 } 57 58 public class AccountSorter implements Comparator<Account> { 59 public int compare(Account object1, Account object2) { 60 if (object1 == object2) return 0; 61 if (object1 == null) return 1; 62 if (object2 == null) return -1; 63 int result = object1.type.compareTo(object2.type); 64 if (result != 0) return result; 65 return object1.name.compareTo(object2.name); 66 } 67 } 68 69 public void testCheckAddAccount() throws Exception { 70 Account a11 = new Account("account1", "type1"); 71 Account a21 = new Account("account2", "type1"); 72 Account a31 = new Account("account3", "type1"); 73 Account a12 = new Account("account1", "type2"); 74 Account a22 = new Account("account2", "type2"); 75 Account a32 = new Account("account3", "type2"); 76 mAms.addAccount(a11, "p11", null); 77 mAms.addAccount(a12, "p12", null); 78 mAms.addAccount(a21, "p21", null); 79 mAms.addAccount(a22, "p22", null); 80 mAms.addAccount(a31, "p31", null); 81 mAms.addAccount(a32, "p32", null); 82 83 Account[] accounts = mAms.getAccounts(null); 84 Arrays.sort(accounts, new AccountSorter()); 85 assertEquals(6, accounts.length); 86 assertEquals(a11, accounts[0]); 87 assertEquals(a21, accounts[1]); 88 assertEquals(a31, accounts[2]); 89 assertEquals(a12, accounts[3]); 90 assertEquals(a22, accounts[4]); 91 assertEquals(a32, accounts[5]); 92 93 accounts = mAms.getAccounts("type1" ); 94 Arrays.sort(accounts, new AccountSorter()); 95 assertEquals(3, accounts.length); 96 assertEquals(a11, accounts[0]); 97 assertEquals(a21, accounts[1]); 98 assertEquals(a31, accounts[2]); 99 100 mAms.removeAccountInternal(a21); 101 102 accounts = mAms.getAccounts("type1" ); 103 Arrays.sort(accounts, new AccountSorter()); 104 assertEquals(2, accounts.length); 105 assertEquals(a11, accounts[0]); 106 assertEquals(a31, accounts[1]); 107 } 108 109 public void testPasswords() throws Exception { 110 Account a11 = new Account("account1", "type1"); 111 Account a12 = new Account("account1", "type2"); 112 mAms.addAccount(a11, "p11", null); 113 mAms.addAccount(a12, "p12", null); 114 115 assertEquals("p11", mAms.getPassword(a11)); 116 assertEquals("p12", mAms.getPassword(a12)); 117 118 mAms.setPassword(a11, "p11b"); 119 120 assertEquals("p11b", mAms.getPassword(a11)); 121 assertEquals("p12", mAms.getPassword(a12)); 122 } 123 124 public void testUserdata() throws Exception { 125 Account a11 = new Account("account1", "type1"); 126 Bundle u11 = new Bundle(); 127 u11.putString("a", "a_a11"); 128 u11.putString("b", "b_a11"); 129 u11.putString("c", "c_a11"); 130 Account a12 = new Account("account1", "type2"); 131 Bundle u12 = new Bundle(); 132 u12.putString("a", "a_a12"); 133 u12.putString("b", "b_a12"); 134 u12.putString("c", "c_a12"); 135 mAms.addAccount(a11, "p11", u11); 136 mAms.addAccount(a12, "p12", u12); 137 138 assertEquals("a_a11", mAms.getUserData(a11, "a")); 139 assertEquals("b_a11", mAms.getUserData(a11, "b")); 140 assertEquals("c_a11", mAms.getUserData(a11, "c")); 141 assertEquals("a_a12", mAms.getUserData(a12, "a")); 142 assertEquals("b_a12", mAms.getUserData(a12, "b")); 143 assertEquals("c_a12", mAms.getUserData(a12, "c")); 144 145 mAms.setUserData(a11, "b", "b_a11b"); 146 mAms.setUserData(a12, "c", null); 147 148 assertEquals("a_a11", mAms.getUserData(a11, "a")); 149 assertEquals("b_a11b", mAms.getUserData(a11, "b")); 150 assertEquals("c_a11", mAms.getUserData(a11, "c")); 151 assertEquals("a_a12", mAms.getUserData(a12, "a")); 152 assertEquals("b_a12", mAms.getUserData(a12, "b")); 153 assertNull(mAms.getUserData(a12, "c")); 154 } 155 156 public void testAuthtokens() throws Exception { 157 Account a11 = new Account("account1", "type1"); 158 Account a12 = new Account("account1", "type2"); 159 mAms.addAccount(a11, "p11", null); 160 mAms.addAccount(a12, "p12", null); 161 162 mAms.setAuthToken(a11, "att1", "a11_att1"); 163 mAms.setAuthToken(a11, "att2", "a11_att2"); 164 mAms.setAuthToken(a11, "att3", "a11_att3"); 165 mAms.setAuthToken(a12, "att1", "a12_att1"); 166 mAms.setAuthToken(a12, "att2", "a12_att2"); 167 mAms.setAuthToken(a12, "att3", "a12_att3"); 168 169 assertEquals("a11_att1", mAms.peekAuthToken(a11, "att1")); 170 assertEquals("a11_att2", mAms.peekAuthToken(a11, "att2")); 171 assertEquals("a11_att3", mAms.peekAuthToken(a11, "att3")); 172 assertEquals("a12_att1", mAms.peekAuthToken(a12, "att1")); 173 assertEquals("a12_att2", mAms.peekAuthToken(a12, "att2")); 174 assertEquals("a12_att3", mAms.peekAuthToken(a12, "att3")); 175 176 mAms.setAuthToken(a11, "att3", "a11_att3b"); 177 mAms.invalidateAuthToken(a12.type, "a12_att2"); 178 179 assertEquals("a11_att1", mAms.peekAuthToken(a11, "att1")); 180 assertEquals("a11_att2", mAms.peekAuthToken(a11, "att2")); 181 assertEquals("a11_att3b", mAms.peekAuthToken(a11, "att3")); 182 assertEquals("a12_att1", mAms.peekAuthToken(a12, "att1")); 183 assertNull(mAms.peekAuthToken(a12, "att2")); 184 assertEquals("a12_att3", mAms.peekAuthToken(a12, "att3")); 185 186 assertNull(mAms.peekAuthToken(a12, "att2")); 187 } 188 189 static public class MockAccountAuthenticatorCache implements IAccountAuthenticatorCache { 190 private ArrayList<ServiceInfo<AuthenticatorDescription>> mServices; 191 192 public MockAccountAuthenticatorCache() { 193 mServices = new ArrayList<ServiceInfo<AuthenticatorDescription>>(); 194 AuthenticatorDescription d1 = new AuthenticatorDescription("type1", "p1", 0, 0, 0, 0); 195 AuthenticatorDescription d2 = new AuthenticatorDescription("type2", "p2", 0, 0, 0, 0); 196 mServices.add(new ServiceInfo<AuthenticatorDescription>(d1, null, 0)); 197 mServices.add(new ServiceInfo<AuthenticatorDescription>(d2, null, 0)); 198 } 199 200 @Override 201 public ServiceInfo<AuthenticatorDescription> getServiceInfo( 202 AuthenticatorDescription type, int userId) { 203 for (ServiceInfo<AuthenticatorDescription> service : mServices) { 204 if (service.type.equals(type)) { 205 return service; 206 } 207 } 208 return null; 209 } 210 211 @Override 212 public Collection<ServiceInfo<AuthenticatorDescription>> getAllServices(int userId) { 213 return mServices; 214 } 215 216 @Override 217 public void dump( 218 final FileDescriptor fd, final PrintWriter fout, final String[] args, int userId) { 219 } 220 221 @Override 222 public void setListener( 223 final RegisteredServicesCacheListener<AuthenticatorDescription> listener, 224 final Handler handler) { 225 } 226 227 @Override 228 public void invalidateCache(int userId) { 229 } 230 } 231 232 static public class MyMockContext extends MockContext { 233 @Override 234 public int checkCallingOrSelfPermission(final String permission) { 235 return PackageManager.PERMISSION_GRANTED; 236 } 237 } 238 239 static public class MyMockPackageManager extends MockPackageManager { 240 @Override 241 public int checkSignatures(final int uid1, final int uid2) { 242 return PackageManager.SIGNATURE_MATCH; 243 } 244 } 245 246 static public class MyAccountManagerService extends AccountManagerService { 247 public MyAccountManagerService(Context context, PackageManager packageManager, 248 IAccountAuthenticatorCache authenticatorCache) { 249 super(context, packageManager, authenticatorCache); 250 } 251 252 @Override 253 protected void installNotification(final int notificationId, final Notification n, UserHandle user) { 254 } 255 256 @Override 257 protected void cancelNotification(final int id, UserHandle user) { 258 } 259 } 260} 261