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