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