Java tutorial
/* * Copyright (C) 2006 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.unit_tests; import org.apache.commons.codec.binary.Base64; import android.content.ContentResolver; import android.content.ContentValues; import android.content.ContentUris; import android.database.Cursor; import android.net.Uri; import android.provider.Checkin; import android.server.checkin.CheckinProvider; import android.server.data.BuildData; import android.server.data.CrashData; import android.server.data.ThrowableData; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.MediumTest; import android.test.suitebuilder.annotation.SmallTest; import java.io.DataInputStream; import java.io.ByteArrayInputStream; /** Unit test for {@link CheckinProvider}. */ public class CheckinProviderTest extends AndroidTestCase { @MediumTest public void testEventReport() { long start = System.currentTimeMillis(); ContentResolver r = getContext().getContentResolver(); Checkin.logEvent(r, Checkin.Events.Tag.TEST, "Test Value"); Cursor c = r.query(Checkin.Events.CONTENT_URI, null, Checkin.Events.TAG + "=?", new String[] { Checkin.Events.Tag.TEST.toString() }, null); long id = -1; while (c.moveToNext()) { String tag = c.getString(c.getColumnIndex(Checkin.Events.TAG)); String value = c.getString(c.getColumnIndex(Checkin.Events.VALUE)); long date = c.getLong(c.getColumnIndex(Checkin.Events.DATE)); assertEquals(Checkin.Events.Tag.TEST.toString(), tag); if ("Test Value".equals(value) && date >= start) { assertTrue(id < 0); id = c.getInt(c.getColumnIndex(Checkin.Events._ID)); } } assertTrue(id > 0); int rows = r.delete(ContentUris.withAppendedId(Checkin.Events.CONTENT_URI, id), null, null); assertEquals(1, rows); c.requery(); while (c.moveToNext()) { long date = c.getLong(c.getColumnIndex(Checkin.Events.DATE)); assertTrue(date < start); // Have deleted the only newer TEST. } c.close(); } @MediumTest public void testStatsUpdate() { ContentResolver r = getContext().getContentResolver(); // First, delete any existing data associated with the TEST tag. Uri uri = Checkin.updateStats(r, Checkin.Stats.Tag.TEST, 0, 0); assertNotNull(uri); assertEquals(1, r.delete(uri, null, null)); assertFalse(r.query(uri, null, null, null, null).moveToNext()); // Now, add a known quantity to the TEST tag. Uri u2 = Checkin.updateStats(r, Checkin.Stats.Tag.TEST, 1, 0.5); assertFalse(uri.equals(u2)); Cursor c = r.query(u2, null, null, null, null); assertTrue(c.moveToNext()); assertEquals(1, c.getInt(c.getColumnIndex(Checkin.Stats.COUNT))); assertEquals(0.5, c.getDouble(c.getColumnIndex(Checkin.Stats.SUM))); assertFalse(c.moveToNext()); // Only one. // Add another known quantity to TEST (should sum with the first). Uri u3 = Checkin.updateStats(r, Checkin.Stats.Tag.TEST, 2, 1.0); assertEquals(u2, u3); c.requery(); assertTrue(c.moveToNext()); assertEquals(3, c.getInt(c.getColumnIndex(Checkin.Stats.COUNT))); assertEquals(1.5, c.getDouble(c.getColumnIndex(Checkin.Stats.SUM))); assertFalse(c.moveToNext()); // Only one. // Now subtract the values; the whole row should disappear. Uri u4 = Checkin.updateStats(r, Checkin.Stats.Tag.TEST, -3, -1.5); assertNull(u4); c.requery(); assertFalse(c.moveToNext()); // Row has been deleted. c.close(); } @MediumTest public void testCrashReport() throws Exception { long start = System.currentTimeMillis(); ContentResolver r = getContext().getContentResolver(); // Log a test (fake) crash report. Checkin.reportCrash(r, new CrashData("Test", "Test Activity", new BuildData("Test Build", "123", start), new ThrowableData(new RuntimeException("Test Exception")))); // Crashes aren't indexed; go through them all to find the one we added. Cursor c = r.query(Checkin.Crashes.CONTENT_URI, null, null, null, null); Uri uri = null; while (c.moveToNext()) { String coded = c.getString(c.getColumnIndex(Checkin.Crashes.DATA)); byte[] bytes = Base64.decodeBase64(coded.getBytes()); CrashData crash = new CrashData(new DataInputStream(new ByteArrayInputStream(bytes))); // Should be exactly one recently added "Test" crash. if (crash.getId().equals("Test") && crash.getTime() > start) { assertEquals("Test Activity", crash.getActivity()); assertEquals("Test Build", crash.getBuildData().getFingerprint()); assertEquals("Test Exception", crash.getThrowableData().getMessage()); assertNull(uri); uri = ContentUris.withAppendedId(Checkin.Crashes.CONTENT_URI, c.getInt(c.getColumnIndex(Checkin.Crashes._ID))); } } assertNotNull(uri); c.close(); // Update the "logs" column. ContentValues values = new ContentValues(); values.put(Checkin.Crashes.LOGS, "Test Logs"); assertEquals(1, r.update(uri, values, null, null)); c = r.query(uri, null, null, null, null); assertTrue(c.moveToNext()); String logs = c.getString(c.getColumnIndex(Checkin.Crashes.LOGS)); assertEquals("Test Logs", logs); c.deleteRow(); c.close(); c.requery(); assertFalse(c.moveToNext()); c.close(); } @MediumTest public void testPropertiesRestricted() throws Exception { ContentResolver r = getContext().getContentResolver(); // The test app doesn't have the permission to access properties, // so any attempt to do so should fail. try { r.insert(Checkin.Properties.CONTENT_URI, new ContentValues()); fail("SecurityException expected"); } catch (SecurityException e) { // expected } try { r.query(Checkin.Properties.CONTENT_URI, null, null, null, null); fail("SecurityException expected"); } catch (SecurityException e) { // expected } } }