/* * Copyright (C) 2012 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 com.android.calendar; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Resources; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.test.mock.MockContentProvider; import android.test.mock.MockContentResolver; import android.test.mock.MockContext; import android.test.mock.MockCursor; import java.util.ArrayList; import java.util.List; /** * A helper class for creating and wiring fake implementations of db classes, like * Context, ContentResolver, ContentProvider, etc. Typical setup will look something like: * DbUtils dbUtils = new DbUtils(mockResources); * dbUtils.getContentResolver().addProvider("settings", dbUtils.getContentProvider()); * dbUtils.getContentResolver().addProvider(CalendarCache.URI.getAuthority(), * dbUtils.getContentProvider()); */ class DbTestUtils { private final MockContentResolver contentResolver; private final FakeContext context; private final FakeSharedPreferences sharedPreferences; private final FakeContentProvider contentProvider; class FakeContext extends MockContext { private ContentResolver contentResolver; private Resources resources; private SharedPreferences sharedPreferences; FakeContext(ContentResolver contentResolver, Resources resources) { this.contentResolver = contentResolver; this.resources = resources; } @Override public ContentResolver getContentResolver() { return contentResolver; } @Override public Resources getResources() { return resources; } public void setSharedPreferences(SharedPreferences sharedPreferences) { this.sharedPreferences = sharedPreferences; } @Override public SharedPreferences getSharedPreferences(String name, int mode) { if (sharedPreferences != null) { return sharedPreferences; } else { return super.getSharedPreferences(name, mode); } } } // TODO: finish fake implementation. static class FakeCursor extends MockCursor { private List queryResult; int mCurrentPosition = -1; FakeCursor(List queryResult) { this.queryResult = queryResult; } @Override public int getCount() { return queryResult.size(); } @Override public boolean moveToFirst() { mCurrentPosition = 0; return true; } @Override public boolean moveToNext() { if (queryResult.size() > 0 && mCurrentPosition < queryResult.size()) { mCurrentPosition++; return true; } else { return false; } } @Override public boolean isBeforeFirst() { return mCurrentPosition < 0; } @Override public String getString(int columnIndex) { return queryResult.get(columnIndex); } @Override public void close() { } } // TODO: finish implementation, perhaps using an in-memory table static class FakeContentProvider extends MockContentProvider { private ArrayList queryResult = null; public FakeContentProvider(Context context) { super(context); } @Override public Bundle call(String method, String request, Bundle args) { return null; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO: not currently implemented return 1; } /** * Set the mocked results to return from a query call. */ public void setQueryResult(ArrayList result) { this.queryResult = result; } @Override public final Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String orderBy) { ArrayList result = (queryResult == null) ? new ArrayList() : queryResult; return new FakeCursor(result); } @Override public String getType(Uri uri) { return null; } @Override public boolean onCreate() { return false; } } public DbTestUtils(Resources resources) { this.contentResolver = new MockContentResolver(); this.context = new FakeContext(contentResolver, resources); this.sharedPreferences = new FakeSharedPreferences(); this.contentProvider = new FakeContentProvider(context); context.setSharedPreferences(sharedPreferences); } public MockContentResolver getContentResolver() { return contentResolver; } public FakeContext getContext() { return context; } public FakeContentProvider getContentProvider() { return contentProvider; } public FakeSharedPreferences getMockSharedPreferences() { return sharedPreferences; } }