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.test.AndroidTestCase;
27import android.test.IsolatedContext;
28import android.test.RenamingDelegatingContext;
29import android.test.mock.MockContentResolver;
30import android.test.mock.MockContext;
31import android.test.mock.MockPackageManager;
32
33import java.io.FileDescriptor;
34import java.io.PrintWriter;
35import java.util.ArrayList;
36import java.util.Arrays;
37import java.util.Collection;
38import java.util.Comparator;
39
40public 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
221    static public class MyMockContext extends MockContext {
222        @Override
223        public int checkCallingOrSelfPermission(final String permission) {
224            return PackageManager.PERMISSION_GRANTED;
225        }
226    }
227
228    static public class MyMockPackageManager extends MockPackageManager {
229        @Override
230        public int checkSignatures(final int uid1, final int uid2) {
231            return PackageManager.SIGNATURE_MATCH;
232        }
233    }
234
235    static public class MyAccountManagerService extends AccountManagerService {
236        public MyAccountManagerService(Context context, PackageManager packageManager,
237                IAccountAuthenticatorCache authenticatorCache) {
238            super(context, packageManager, authenticatorCache);
239        }
240
241        @Override
242        protected void installNotification(final int notificationId, final Notification n) {
243        }
244
245        @Override
246        protected void cancelNotification(final int id) {
247        }
248    }
249}
250