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