Without this addition, code that is being tested using an isolated context can cause an exception if it unregisters a previously registered broadcast receiver. This is because the isolated context never actually registered the receiver in the first place. The fix is to make sure the isolated context is consistent in ignoring both recevier registration and unregistration calls. Change-Id: Ie0ba6f4bb10f5248704327a0ffc8e37ee8b71ae2
195 lines
6.0 KiB
Java
195 lines
6.0 KiB
Java
/*
|
|
* Copyright (C) 2008 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package android.test;
|
|
|
|
import com.google.android.collect.Lists;
|
|
|
|
import android.accounts.AccountManager;
|
|
import android.accounts.AccountManagerCallback;
|
|
import android.accounts.AccountManagerFuture;
|
|
import android.accounts.AuthenticatorException;
|
|
import android.accounts.OnAccountsUpdateListener;
|
|
import android.accounts.OperationCanceledException;
|
|
import android.accounts.Account;
|
|
import android.content.ContextWrapper;
|
|
import android.content.ContentResolver;
|
|
import android.content.Intent;
|
|
import android.content.Context;
|
|
import android.content.ServiceConnection;
|
|
import android.content.BroadcastReceiver;
|
|
import android.content.IntentFilter;
|
|
import android.content.pm.PackageManager;
|
|
import android.net.Uri;
|
|
import android.os.Handler;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.ExecutionException;
|
|
import java.util.concurrent.TimeoutException;
|
|
import java.util.List;
|
|
|
|
|
|
/**
|
|
* A mock context which prevents its users from talking to the rest of the device while
|
|
* stubbing enough methods to satify code that tries to talk to other packages.
|
|
*/
|
|
public class IsolatedContext extends ContextWrapper {
|
|
|
|
private ContentResolver mResolver;
|
|
private final MockAccountManager mMockAccountManager;
|
|
|
|
private List<Intent> mBroadcastIntents = Lists.newArrayList();
|
|
|
|
public IsolatedContext(
|
|
ContentResolver resolver, Context targetContext) {
|
|
super(targetContext);
|
|
mResolver = resolver;
|
|
mMockAccountManager = new MockAccountManager();
|
|
}
|
|
|
|
/** Returns the list of intents that were broadcast since the last call to this method. */
|
|
public List<Intent> getAndClearBroadcastIntents() {
|
|
List<Intent> intents = mBroadcastIntents;
|
|
mBroadcastIntents = Lists.newArrayList();
|
|
return intents;
|
|
}
|
|
|
|
@Override
|
|
public ContentResolver getContentResolver() {
|
|
// We need to return the real resolver so that MailEngine.makeRight can get to the
|
|
// subscribed feeds provider. TODO: mock out subscribed feeds too.
|
|
return mResolver;
|
|
}
|
|
|
|
@Override
|
|
public boolean bindService(Intent service, ServiceConnection conn, int flags) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public void unregisterReceiver(BroadcastReceiver receiver) {
|
|
// Ignore
|
|
}
|
|
|
|
@Override
|
|
public void sendBroadcast(Intent intent) {
|
|
mBroadcastIntents.add(intent);
|
|
}
|
|
|
|
@Override
|
|
public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
|
|
mBroadcastIntents.add(intent);
|
|
}
|
|
|
|
@Override
|
|
public int checkUriPermission(
|
|
Uri uri, String readPermission, String writePermission, int pid,
|
|
int uid, int modeFlags) {
|
|
return PackageManager.PERMISSION_GRANTED;
|
|
}
|
|
|
|
@Override
|
|
public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) {
|
|
return PackageManager.PERMISSION_GRANTED;
|
|
}
|
|
|
|
@Override
|
|
public Object getSystemService(String name) {
|
|
if (Context.ACCOUNT_SERVICE.equals(name)) {
|
|
return mMockAccountManager;
|
|
}
|
|
// No other services exist in this context.
|
|
return null;
|
|
}
|
|
|
|
private class MockAccountManager extends AccountManager {
|
|
public MockAccountManager() {
|
|
super(IsolatedContext.this, null /* IAccountManager */, null /* handler */);
|
|
}
|
|
|
|
public void addOnAccountsUpdatedListener(OnAccountsUpdateListener listener,
|
|
Handler handler, boolean updateImmediately) {
|
|
// do nothing
|
|
}
|
|
|
|
public Account[] getAccounts() {
|
|
return new Account[]{};
|
|
}
|
|
|
|
public AccountManagerFuture<Account[]> getAccountsByTypeAndFeatures(
|
|
final String type, final String[] features,
|
|
AccountManagerCallback<Account[]> callback, Handler handler) {
|
|
return new MockAccountManagerFuture<Account[]>(new Account[0]);
|
|
}
|
|
|
|
public String blockingGetAuthToken(Account account, String authTokenType,
|
|
boolean notifyAuthFailure)
|
|
throws OperationCanceledException, IOException, AuthenticatorException {
|
|
return null;
|
|
}
|
|
|
|
|
|
/**
|
|
* A very simple AccountManagerFuture class
|
|
* that returns what ever was passed in
|
|
*/
|
|
private class MockAccountManagerFuture<T>
|
|
implements AccountManagerFuture<T> {
|
|
|
|
T mResult;
|
|
|
|
public MockAccountManagerFuture(T result) {
|
|
mResult = result;
|
|
}
|
|
|
|
public boolean cancel(boolean mayInterruptIfRunning) {
|
|
return false;
|
|
}
|
|
|
|
public boolean isCancelled() {
|
|
return false;
|
|
}
|
|
|
|
public boolean isDone() {
|
|
return true;
|
|
}
|
|
|
|
public T getResult()
|
|
throws OperationCanceledException, IOException, AuthenticatorException {
|
|
return mResult;
|
|
}
|
|
|
|
public T getResult(long timeout, TimeUnit unit)
|
|
throws OperationCanceledException, IOException, AuthenticatorException {
|
|
return getResult();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
@Override
|
|
public File getFilesDir() {
|
|
return new File("/dev/null");
|
|
}
|
|
}
|