blob: b866375468495d4693fa9b107dffb6aface912fb [file] [log] [blame]
/*
* 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.content.cts;
import com.android.cts.stub.R;
import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetClass;
import dalvik.annotation.TestTargetNew;
import dalvik.annotation.TestTargets;
import dalvik.annotation.ToBeFixed;
import android.accounts.Account;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.test.AndroidTestCase;
import android.view.animation.cts.DelayedCheck;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@TestTargetClass(ContentResolver.class)
public class ContentResolverTest extends AndroidTestCase {
private final static String COLUMN_ID_NAME = "_id";
private final static String COLUMN_KEY_NAME = "key";
private final static String COLUMN_VALUE_NAME = "value";
private static final String AUTHORITY = "ctstest";
private static final Uri TABLE1_URI = Uri.parse("content://" + AUTHORITY + "/testtable1/");
private static final Uri TABLE2_URI = Uri.parse("content://" + AUTHORITY + "/testtable2/");
private static final Account ACCOUNT = new Account("cts", "cts");
private static final String KEY1 = "key1";
private static final String KEY2 = "key2";
private static final String KEY3 = "key3";
private static final int VALUE1 = 1;
private static final int VALUE2 = 2;
private static final int VALUE3 = 3;
private static final String TEST_PACKAGE_NAME = "com.android.cts.stub";
private Context mContext;
private ContentResolver mContentResolver;
private Cursor mCursor;
@Override
protected void setUp() throws Exception {
super.setUp();
mContext = getContext();
mContentResolver = mContext.getContentResolver();
// add three rows to database when every test case start.
ContentValues values = new ContentValues();
values.put(COLUMN_KEY_NAME, KEY1);
values.put(COLUMN_VALUE_NAME, VALUE1);
mContentResolver.insert(TABLE1_URI, values);
values.put(COLUMN_KEY_NAME, KEY2);
values.put(COLUMN_VALUE_NAME, VALUE2);
mContentResolver.insert(TABLE1_URI, values);
values.put(COLUMN_KEY_NAME, KEY3);
values.put(COLUMN_VALUE_NAME, VALUE3);
mContentResolver.insert(TABLE1_URI, values);
}
@Override
protected void tearDown() throws Exception {
mContentResolver.delete(TABLE1_URI, null, null);
if ( null != mCursor && !mCursor.isClosed() ) {
mCursor.close();
}
super.tearDown();
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "ContentResolver",
args = {android.content.Context.class}
)
@ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
public void testConstructor() {
assertNotNull(mContentResolver);
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "getType",
args = {android.net.Uri.class}
)
@ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
"ContentResolver#getType(Uri) when the input Uri is null")
public void testGetType() {
String type1 = mContentResolver.getType(TABLE1_URI);
assertTrue(type1.startsWith(ContentResolver.CURSOR_DIR_BASE_TYPE, 0));
String type2 = mContentResolver.getType(TABLE2_URI);
assertTrue(type2.startsWith(ContentResolver.CURSOR_DIR_BASE_TYPE, 0));
Uri invalidUri = Uri.parse("abc");
assertNull(mContentResolver.getType(invalidUri));
try {
mContentResolver.getType(null);
fail("did not throw NullPointerException when Uri is null.");
} catch (NullPointerException e) {
//expected.
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "query",
args = {android.net.Uri.class, java.lang.String[].class, java.lang.String.class,
java.lang.String[].class, java.lang.String.class}
)
@ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
"ContentResolver#query(Uri, String[], String, String[], String) when the input " +
"param Uri is null")
public void testQuery() {
mCursor = mContentResolver.query(TABLE1_URI, null, null, null, null);
assertNotNull(mCursor);
assertEquals(3, mCursor.getCount());
assertEquals(3, mCursor.getColumnCount());
mCursor.moveToLast();
assertEquals(3, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(KEY3, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(VALUE3, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.moveToPrevious();
assertEquals(2, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(KEY2, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(VALUE2, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.close();
String selection = COLUMN_ID_NAME + "=1";
mCursor = mContentResolver.query(TABLE1_URI, null, selection, null, null);
assertNotNull(mCursor);
assertEquals(1, mCursor.getCount());
assertEquals(3, mCursor.getColumnCount());
mCursor.moveToFirst();
assertEquals(1, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(KEY1, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(VALUE1, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.close();
selection = COLUMN_KEY_NAME + "=\"" + KEY3 + "\"";
mCursor = mContentResolver.query(TABLE1_URI, null, selection, null, null);
assertNotNull(mCursor);
assertEquals(1, mCursor.getCount());
assertEquals(3, mCursor.getColumnCount());
mCursor.moveToFirst();
assertEquals(3, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(KEY3, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(VALUE3, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.close();
try {
mContentResolver.query(null, null, null, null, null);
fail("did not throw NullPointerException when uri is null.");
} catch (NullPointerException e) {
//expected.
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "openInputStream",
args = {android.net.Uri.class}
)
public void testOpenInputStream() throws IOException {
final Uri uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE +
"://" + TEST_PACKAGE_NAME + "/" + R.drawable.pass);
InputStream is = mContentResolver.openInputStream(uri);
assertNotNull(is);
is.close();
final Uri invalidUri = Uri.parse("abc");
try {
mContentResolver.openInputStream(invalidUri);
fail("did not throw FileNotFoundException when uri is invalid.");
} catch (FileNotFoundException e) {
//expected.
}
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "openOutputStream",
args = {android.net.Uri.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "openOutputStream",
args = {android.net.Uri.class, java.lang.String.class}
)
})
public void testOpenOutputStream() throws IOException {
Uri uri = Uri.parse(ContentResolver.SCHEME_FILE + "://" +
getContext().getCacheDir().getAbsolutePath() +
"/temp.jpg");
OutputStream os = mContentResolver.openOutputStream(uri);
assertNotNull(os);
os.close();
os = mContentResolver.openOutputStream(uri, "wa");
assertNotNull(os);
os.close();
uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE +
"://" + TEST_PACKAGE_NAME + "/" + R.raw.testimage);
try {
mContentResolver.openOutputStream(uri);
fail("did not throw FileNotFoundException when scheme is not accepted.");
} catch (FileNotFoundException e) {
//expected.
}
try {
mContentResolver.openOutputStream(uri, "w");
fail("did not throw FileNotFoundException when scheme is not accepted.");
} catch (FileNotFoundException e) {
//expected.
}
Uri invalidUri = Uri.parse("abc");
try {
mContentResolver.openOutputStream(invalidUri);
fail("did not throw FileNotFoundException when uri is invalid.");
} catch (FileNotFoundException e) {
//expected.
}
try {
mContentResolver.openOutputStream(invalidUri, "w");
fail("did not throw FileNotFoundException when uri is invalid.");
} catch (FileNotFoundException e) {
//expected.
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "openAssetFileDescriptor",
args = {android.net.Uri.class, java.lang.String.class}
)
public void testOpenAssetFileDescriptor() throws IOException {
Uri uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE +
"://" + TEST_PACKAGE_NAME + "/" + R.raw.testimage);
AssetFileDescriptor afd = mContentResolver.openAssetFileDescriptor(uri, "r");
assertNotNull(afd);
afd.close();
try {
mContentResolver.openAssetFileDescriptor(uri, "d");
fail("did not throw FileNotFoundException when mode is unknown.");
} catch (FileNotFoundException e) {
//expected.
}
Uri invalidUri = Uri.parse("abc");
try {
mContentResolver.openAssetFileDescriptor(invalidUri, "r");
fail("did not throw FileNotFoundException when uri is invalid.");
} catch (FileNotFoundException e) {
//expected.
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "openFileDescriptor",
args = {android.net.Uri.class, java.lang.String.class}
)
public void testOpenFileDescriptor() throws IOException {
Uri uri = Uri.parse(ContentResolver.SCHEME_FILE + "://" +
getContext().getCacheDir().getAbsolutePath() +
"/temp.jpg");
ParcelFileDescriptor pfd = mContentResolver.openFileDescriptor(uri, "w");
assertNotNull(pfd);
pfd.close();
try {
mContentResolver.openFileDescriptor(uri, "d");
fail("did not throw FileNotFoundException when mode is unknown.");
} catch (FileNotFoundException e) {
//expected.
}
Uri invalidUri = Uri.parse("abc");
try {
mContentResolver.openFileDescriptor(invalidUri, "w");
fail("did not throw FileNotFoundException when uri is invalid.");
} catch (FileNotFoundException e) {
//expected.
}
uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE +
"://" + TEST_PACKAGE_NAME + "/" + R.raw.testimage);
try {
mContentResolver.openFileDescriptor(uri, "w");
fail("did not throw FileNotFoundException when scheme is not accepted.");
} catch (FileNotFoundException e) {
//expected.
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "insert",
args = {android.net.Uri.class, android.content.ContentValues.class}
)
@ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
"ContentResolver#insert(Uri, ContentValues) when the input Uri are null")
public void testInsert() {
String key4 = "key4";
String key5 = "key5";
int value4 = 4;
int value5 = 5;
String key4Selection = COLUMN_KEY_NAME + "=\"" + key4 + "\"";
mCursor = mContentResolver.query(TABLE1_URI, null, key4Selection, null, null);
assertEquals(0, mCursor.getCount());
mCursor.close();
ContentValues values = new ContentValues();
values.put(COLUMN_KEY_NAME, key4);
values.put(COLUMN_VALUE_NAME, value4);
Uri uri = mContentResolver.insert(TABLE1_URI, values);
assertNotNull(uri);
mCursor = mContentResolver.query(TABLE1_URI, null, key4Selection, null, null);
assertNotNull(mCursor);
assertEquals(1, mCursor.getCount());
mCursor.moveToFirst();
assertEquals(4, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(key4, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(value4, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.close();
values.put(COLUMN_KEY_NAME, key5);
values.put(COLUMN_VALUE_NAME, value5);
uri = mContentResolver.insert(TABLE1_URI, values);
assertNotNull(uri);
// check returned uri
mCursor = mContentResolver.query(uri, null, null, null, null);
assertNotNull(mCursor);
assertEquals(1, mCursor.getCount());
mCursor.moveToLast();
assertEquals(5, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(key5, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(value5, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.close();
try {
mContentResolver.insert(null, values);
fail("did not throw NullPointerException when uri is null.");
} catch (NullPointerException e) {
//expected.
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "bulkInsert",
args = {android.net.Uri.class, android.content.ContentValues[].class}
)
@ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
"ContentResolver#bulkInsert(Uri, ContentValues[]) when the input Uri are null")
public void testBulkInsert() {
String key4 = "key4";
String key5 = "key5";
int value4 = 4;
int value5 = 5;
mCursor = mContentResolver.query(TABLE1_URI, null, null, null, null);
assertNotNull(mCursor);
assertEquals(3, mCursor.getCount());
mCursor.close();
ContentValues[] cvs = new ContentValues[2];
cvs[0] = new ContentValues();
cvs[0].put(COLUMN_KEY_NAME, key4);
cvs[0].put(COLUMN_VALUE_NAME, value4);
cvs[1] = new ContentValues();
cvs[1].put(COLUMN_KEY_NAME, key5);
cvs[1].put(COLUMN_VALUE_NAME, value5);
assertEquals(2, mContentResolver.bulkInsert(TABLE1_URI, cvs));
mCursor = mContentResolver.query(TABLE1_URI, null, null, null, null);
assertNotNull(mCursor);
assertEquals(5, mCursor.getCount());
mCursor.moveToLast();
assertEquals(5, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(key5, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(value5, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.moveToPrevious();
assertEquals(4, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(key4, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(value4, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.close();
try {
mContentResolver.bulkInsert(null, cvs);
fail("did not throw NullPointerException when uri is null.");
} catch (NullPointerException e) {
//expected.
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "delete",
args = {android.net.Uri.class, java.lang.String.class, java.lang.String[].class}
)
@ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
"ContentResolver#delete(Uri, String, String[]) when the input Uri are null")
public void testDelete() {
mCursor = mContentResolver.query(TABLE1_URI, null, null, null, null);
assertNotNull(mCursor);
assertEquals(3, mCursor.getCount());
mCursor.close();
assertEquals(3, mContentResolver.delete(TABLE1_URI, null, null));
mCursor = mContentResolver.query(TABLE1_URI, null, null, null, null);
assertNotNull(mCursor);
assertEquals(0, mCursor.getCount());
mCursor.close();
// add three rows to database.
ContentValues values = new ContentValues();
values.put(COLUMN_KEY_NAME, KEY1);
values.put(COLUMN_VALUE_NAME, VALUE1);
mContentResolver.insert(TABLE1_URI, values);
values.put(COLUMN_KEY_NAME, KEY2);
values.put(COLUMN_VALUE_NAME, VALUE2);
mContentResolver.insert(TABLE1_URI, values);
values.put(COLUMN_KEY_NAME, KEY3);
values.put(COLUMN_VALUE_NAME, VALUE3);
mContentResolver.insert(TABLE1_URI, values);
// test delete row using selection
String selection = COLUMN_ID_NAME + "=2";
assertEquals(1, mContentResolver.delete(TABLE1_URI, selection, null));
mCursor = mContentResolver.query(TABLE1_URI, null, null, null, null);
assertNotNull(mCursor);
assertEquals(2, mCursor.getCount());
mCursor.moveToFirst();
assertEquals(1, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(KEY1, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(VALUE1, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.moveToNext();
assertEquals(3, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(KEY3, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(VALUE3, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.close();
selection = COLUMN_VALUE_NAME + "=3";
assertEquals(1, mContentResolver.delete(TABLE1_URI, selection, null));
mCursor = mContentResolver.query(TABLE1_URI, null, null, null, null);
assertNotNull(mCursor);
assertEquals(1, mCursor.getCount());
mCursor.moveToFirst();
assertEquals(1, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(KEY1, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(VALUE1, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.close();
selection = COLUMN_KEY_NAME + "=\"" + KEY1 + "\"";
assertEquals(1, mContentResolver.delete(TABLE1_URI, selection, null));
mCursor = mContentResolver.query(TABLE1_URI, null, null, null, null);
assertNotNull(mCursor);
assertEquals(0, mCursor.getCount());
mCursor.close();
try {
mContentResolver.delete(null, null, null);
fail("did not throw NullPointerException when uri is null.");
} catch (NullPointerException e) {
//expected.
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "update",
args = {android.net.Uri.class, android.content.ContentValues.class,
java.lang.String.class, java.lang.String[].class}
)
@ToBeFixed(bug = "1695243", explanation = "The javadoc says \"return the URL of the " +
"newly created row\", but actually it return an integer.")
public void testUpdate() {
ContentValues values = new ContentValues();
String key10 = "key10";
String key20 = "key20";
int value10 = 10;
int value20 = 20;
values.put(COLUMN_KEY_NAME, key10);
values.put(COLUMN_VALUE_NAME, value10);
// test update all the rows.
assertEquals(3, mContentResolver.update(TABLE1_URI, values, null, null));
mCursor = mContentResolver.query(TABLE1_URI, null, null, null, null);
assertNotNull(mCursor);
assertEquals(3, mCursor.getCount());
mCursor.moveToFirst();
assertEquals(1, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(key10, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(value10, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.moveToNext();
assertEquals(2, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(key10, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(value10, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.moveToLast();
assertEquals(3, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(key10, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(value10, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.close();
// test update one row using selection.
String selection = COLUMN_ID_NAME + "=1";
values.put(COLUMN_KEY_NAME, key20);
values.put(COLUMN_VALUE_NAME, value20);
assertEquals(1, mContentResolver.update(TABLE1_URI, values, selection, null));
mCursor = mContentResolver.query(TABLE1_URI, null, null, null, null);
assertNotNull(mCursor);
assertEquals(3, mCursor.getCount());
mCursor.moveToFirst();
assertEquals(1, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(key20, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(value20, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.moveToNext();
assertEquals(2, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(key10, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(value10, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.moveToLast();
assertEquals(3, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_ID_NAME)));
assertEquals(key10, mCursor.getString(mCursor.getColumnIndexOrThrow(COLUMN_KEY_NAME)));
assertEquals(value10, mCursor.getInt(mCursor.getColumnIndexOrThrow(COLUMN_VALUE_NAME)));
mCursor.close();
try {
mContentResolver.update(null, values, null, null);
fail("did not throw NullPointerException when uri is null.");
} catch (NullPointerException e) {
//expected.
}
// javadoc says it will throw NullPointerException when values are null,
// but actually, it throws IllegalArgumentException here.
try {
mContentResolver.update(TABLE1_URI, null, null, null);
fail("did not throw IllegalArgumentException when values are null.");
} catch (IllegalArgumentException e) {
//expected.
}
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "registerContentObserver",
args = {android.net.Uri.class, boolean.class, android.database.ContentObserver.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "unregisterContentObserver",
args = {android.database.ContentObserver.class}
)
})
@ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
"ContentResolver#registerContentObserver(Uri, boolean, ContentObserver) and " +
"ContentResolver#unregisterContentObserver(ContentObserver) when the input " +
"params are null")
public void testRegisterContentObserver() {
final MockContentObserver mco = new MockContentObserver();
mContentResolver.registerContentObserver(TABLE1_URI, true, mco);
assertFalse(mco.hadOnChanged());
ContentValues values = new ContentValues();
values.put(COLUMN_KEY_NAME, "key10");
values.put(COLUMN_VALUE_NAME, 10);
mContentResolver.update(TABLE1_URI, values, null, null);
new DelayedCheck() {
@Override
protected boolean check() {
return mco.hadOnChanged();
}
}.run();
mco.reset();
mContentResolver.unregisterContentObserver(mco);
assertFalse(mco.hadOnChanged());
mContentResolver.update(TABLE1_URI, values, null, null);
assertFalse(mco.hadOnChanged());
try {
mContentResolver.registerContentObserver(null, false, mco);
fail("did not throw NullPointerException or IllegalArgumentException when uri is null.");
} catch (NullPointerException e) {
//expected.
} catch (IllegalArgumentException e) {
// also expected
}
try {
mContentResolver.registerContentObserver(TABLE1_URI, false, null);
fail("did not throw NullPointerException when register null content observer.");
} catch (NullPointerException e) {
//expected.
}
try {
mContentResolver.unregisterContentObserver(null);
fail("did not throw NullPointerException when unregister null content observer.");
} catch (NullPointerException e) {
//expected.
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "notifyChange",
args = {android.net.Uri.class, android.database.ContentObserver.class}
)
@ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
"ContentResolver#notifyChange(Uri, ContentObserver) when uri is null")
public void testNotifyChange1() {
final MockContentObserver mco = new MockContentObserver();
mContentResolver.registerContentObserver(TABLE1_URI, true, mco);
assertFalse(mco.hadOnChanged());
mContentResolver.notifyChange(TABLE1_URI, mco);
new DelayedCheck() {
@Override
protected boolean check() {
return mco.hadOnChanged();
}
}.run();
mContentResolver.unregisterContentObserver(mco);
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "notifyChange",
args = {android.net.Uri.class, android.database.ContentObserver.class, boolean.class}
)
@ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
"ContentResolver#notifyChange(Uri, ContentObserver, boolean) when uri is null ")
public void testNotifyChange2() {
final MockContentObserver mco = new MockContentObserver();
mContentResolver.registerContentObserver(TABLE1_URI, true, mco);
assertFalse(mco.hadOnChanged());
mContentResolver.notifyChange(TABLE1_URI, mco, false);
new DelayedCheck() {
@Override
protected boolean check() {
return mco.hadOnChanged();
}
}.run();
mContentResolver.unregisterContentObserver(mco);
}
@TestTargets({
@TestTargetNew(
level = TestLevel.NOT_FEASIBLE,
method = "startSync",
args = {android.net.Uri.class, android.os.Bundle.class}
),
@TestTargetNew(
level = TestLevel.NOT_FEASIBLE,
method = "cancelSync",
args = {android.net.Uri.class}
)
})
@ToBeFixed(bug = "1400231", explanation = "the key is SyncObserver class is deleted" +
" under currently enviroment(but still exists in doc)")
public void testStartCancelSync() {
Bundle extras = new Bundle();
extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
ContentResolver.requestSync(ACCOUNT, AUTHORITY, extras);
//FIXME: how to get the result to assert.
ContentResolver.cancelSync(ACCOUNT, AUTHORITY);
//FIXME: how to assert.
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "startSync",
args = {android.net.Uri.class, android.os.Bundle.class}
)
@ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
"ContentResolver#startSync(Uri, Bundle) when extras is null")
public void testStartSyncFailure() {
try {
ContentResolver.requestSync(null, null, null);
fail("did not throw IllegalArgumentException when extras is null.");
} catch (IllegalArgumentException e) {
//expected.
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "validateSyncExtrasBundle",
args = {android.os.Bundle.class}
)
public void testValidateSyncExtrasBundle() {
Bundle extras = new Bundle();
extras.putInt("Integer", 20);
extras.putLong("Long", 10l);
extras.putBoolean("Boolean", true);
extras.putFloat("Float", 5.5f);
extras.putDouble("Double", 2.5);
extras.putString("String", "cts");
extras.putCharSequence("CharSequence", null);
ContentResolver.validateSyncExtrasBundle(extras);
extras.putChar("Char", 'a'); // type Char is invalid
try {
ContentResolver.validateSyncExtrasBundle(extras);
fail("did not throw IllegalArgumentException when extras is invalide.");
} catch (IllegalArgumentException e) {
//expected.
}
}
private class MockContentObserver extends ContentObserver {
private boolean mHadOnChanged = false;
public MockContentObserver() {
super(null);
}
@Override
public boolean deliverSelfNotifications() {
return true;
}
@Override
public synchronized void onChange(boolean selfChange) {
super.onChange(selfChange);
mHadOnChanged = true;
}
public synchronized boolean hadOnChanged() {
return mHadOnChanged;
}
public synchronized void reset() {
mHadOnChanged = false;
}
}
}