110362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root/*
210362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * Copyright (C) 2008 The Android Open Source Project
310362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root *
410362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
510362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * you may not use this file except in compliance with the License.
610362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * You may obtain a copy of the License at
710362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root *
810362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
910362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root *
1010362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * Unless required by applicable law or agreed to in writing, software
1110362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
1210362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1310362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * See the License for the specific language governing permissions and
1410362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * limitations under the License.
1510362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root */
1610362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.test;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.google.android.collect.Lists;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
210eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintanaimport android.accounts.AccountManager;
2269120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrookimport android.accounts.AccountManagerCallback;
2369120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrookimport android.accounts.AccountManagerFuture;
2469120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrookimport android.accounts.AuthenticatorException;
25f7ae77cd67f1a3993b8e56c1af4720a7adf4e69dFred Quintanaimport android.accounts.OnAccountsUpdateListener;
2669120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrookimport android.accounts.OperationCanceledException;
27904de61465abff8dba6fcc768d6bf5586f86ed0fCynthia Wongimport android.accounts.Account;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContextWrapper;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ServiceConnection;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
370eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintanaimport android.os.Handler;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
393b95f5378957c4e985429dfefda3975416c1a039Ken Shirriffimport java.io.File;
4069120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrookimport java.io.IOException;
4169120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrookimport java.util.concurrent.TimeUnit;
4269120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrookimport java.util.concurrent.ExecutionException;
4369120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrookimport java.util.concurrent.TimeoutException;
4469120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrookimport java.util.List;
4569120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A mock context which prevents its users from talking to the rest of the device while
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stubbing enough methods to satify code that tries to talk to other packages.
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class IsolatedContext extends ContextWrapper {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ContentResolver mResolver;
540eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintana    private final MockAccountManager mMockAccountManager;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private List<Intent> mBroadcastIntents = Lists.newArrayList();
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IsolatedContext(
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentResolver resolver, Context targetContext) {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(targetContext);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResolver = resolver;
620eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintana        mMockAccountManager = new MockAccountManager();
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Returns the list of intents that were broadcast since the last call to this method. */
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public List<Intent> getAndClearBroadcastIntents() {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        List<Intent> intents = mBroadcastIntents;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBroadcastIntents = Lists.newArrayList();
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return intents;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ContentResolver getContentResolver() {
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We need to return the real resolver so that MailEngine.makeRight can get to the
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // subscribed feeds provider. TODO: mock out subscribed feeds too.
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResolver;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean bindService(Intent service, ServiceConnection conn, int flags) {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
90d672475753af1feff1c0f81bba72637ec0b536cdJonas Schwertfeger    public void unregisterReceiver(BroadcastReceiver receiver) {
91d672475753af1feff1c0f81bba72637ec0b536cdJonas Schwertfeger        // Ignore
92d672475753af1feff1c0f81bba72637ec0b536cdJonas Schwertfeger    }
93d672475753af1feff1c0f81bba72637ec0b536cdJonas Schwertfeger
94d672475753af1feff1c0f81bba72637ec0b536cdJonas Schwertfeger    @Override
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendBroadcast(Intent intent) {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBroadcastIntents.add(intent);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBroadcastIntents.add(intent);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri uri, String readPermission, String writePermission, int pid,
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid, int modeFlags) {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_GRANTED;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PackageManager.PERMISSION_GRANTED;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getSystemService(String name) {
1180eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintana        if (Context.ACCOUNT_SERVICE.equals(name)) {
1190eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintana            return mMockAccountManager;
1200eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintana        }
1210eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintana        // No other services exist in this context.
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1250eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintana    private class MockAccountManager extends AccountManager {
1260eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintana        public MockAccountManager() {
1270eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintana            super(IsolatedContext.this, null /* IAccountManager */, null /* handler */);
1280eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintana        }
1290eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintana
130f7ae77cd67f1a3993b8e56c1af4720a7adf4e69dFred Quintana        public void addOnAccountsUpdatedListener(OnAccountsUpdateListener listener,
1310eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintana                Handler handler, boolean updateImmediately) {
1320eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintana            // do nothing
1330eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintana        }
134904de61465abff8dba6fcc768d6bf5586f86ed0fCynthia Wong
135904de61465abff8dba6fcc768d6bf5586f86ed0fCynthia Wong        public Account[] getAccounts() {
136904de61465abff8dba6fcc768d6bf5586f86ed0fCynthia Wong            return new Account[]{};
137904de61465abff8dba6fcc768d6bf5586f86ed0fCynthia Wong        }
13869120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook
13969120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook        public AccountManagerFuture<Account[]> getAccountsByTypeAndFeatures(
14069120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook                final String type, final String[] features,
14169120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook                AccountManagerCallback<Account[]> callback, Handler handler) {
14269120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook            return new MockAccountManagerFuture<Account[]>(new Account[0]);
14369120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook        }
14469120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook
14569120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook        public String blockingGetAuthToken(Account account, String authTokenType,
14669120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook                boolean notifyAuthFailure)
14769120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook                throws OperationCanceledException, IOException, AuthenticatorException {
14869120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook            return null;
14969120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook        }
15069120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook
15169120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook
15269120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook        /**
15369120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook         * A very simple AccountManagerFuture class
15469120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook         * that returns what ever was passed in
15569120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook         */
15669120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook        private class MockAccountManagerFuture<T>
15769120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook                implements AccountManagerFuture<T> {
15869120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook
15969120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook            T mResult;
16069120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook
16169120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook            public MockAccountManagerFuture(T result) {
16269120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook                mResult = result;
16369120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook            }
16469120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook
16569120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook            public boolean cancel(boolean mayInterruptIfRunning) {
16669120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook                return false;
16769120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook            }
16869120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook
16969120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook            public boolean isCancelled() {
17069120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook                return false;
17169120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook            }
17269120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook
17369120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook            public boolean isDone() {
17469120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook                return true;
17569120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook            }
17669120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook
17769120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook            public T getResult()
17869120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook                    throws OperationCanceledException, IOException, AuthenticatorException {
17969120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook                return mResult;
18069120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook            }
18169120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook
18269120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook            public T getResult(long timeout, TimeUnit unit)
18369120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook                    throws OperationCanceledException, IOException, AuthenticatorException {
18469120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook                return getResult();
18569120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook            }
18669120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook        }
18769120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook
1880eabf0228a17e07ef831bc1ee1951c9697d2a079Fred Quintana    }
18969120a73d0f7a1862d51e0a95ebd5e507fee8cd2Paul Westbrook
1903b95f5378957c4e985429dfefda3975416c1a039Ken Shirriff    @Override
1913b95f5378957c4e985429dfefda3975416c1a039Ken Shirriff    public File getFilesDir() {
1923b95f5378957c4e985429dfefda3975416c1a039Ken Shirriff        return new File("/dev/null");
1933b95f5378957c4e985429dfefda3975416c1a039Ken Shirriff    }
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
195