blob: 7cb723bf2eb6bf6224f46fcd3c0413fabe9f6a7f [file] [log] [blame]
package com.android.bluetooth.tests;
import java.io.IOException;
import java.util.Date;
import javax.obex.HeaderSet;
import javax.obex.Operation;
import android.annotation.TargetApi;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.Telephony.Sms;
import android.test.AndroidTestCase;
import android.util.Log;
import com.android.bluetooth.map.BluetoothMapConvoContactElement;
import com.android.bluetooth.map.BluetoothMapConvoListing;
import com.android.bluetooth.map.BluetoothMapConvoListingElement;
import com.android.bluetooth.mapapi.BluetoothMapContract;
/**
* Class to hold test data - both the server side data to insert into the databases, and the
* validation data to validate the result, when reading back the data.
*
* Should be data only, not operation specific functionality (client).
*
* Please try to keep useful functionality call-able from a test case, to make it possible
* to call a single test case to e.g. inject some contacts or messages into the database.
*
*/
@TargetApi(20)
public class MapTestData extends AndroidTestCase {
private static final String TAG = "MapTestData";
/* Test validation variables */
static final String TEST_CONTACT_NAME = "Jesus Überboss";
static final String TEST_CONTACT_PHONE = "55566688";
static final String TEST_CONTACT_EMAIL = "boss@the.skyes";
static final int TEST_NUM_CONTACTS = 3;
static final int TEST_ADD_CONTACT_PER_ITERATIONS = 4;
/* I do know this function is deprecated, but I'm unable to find a good alternative
* except from taking a copy of the Date.UTC function as suggested. */
// NOTE: This will only set the data on the message - not the lastActivity on SMS/MMS threads
static final long TEST_ACTIVITY_BEGIN = Date.UTC(
2014-1900,
8-1, /* month 0-11*/
22, /*day 1-31 */
22, /*hour*/
15, /*minute*/
20 /*second*/);
static final String TEST_ACTIVITY_BEGIN_STRING = "20150102T150047";
static final String TEST_ACTIVITY_END_STRING = "20160102T150047";
static final int TEST_ACTIVITY_INTERVAL = 5*60*1000; /*ms*/
static Context sContext = null;
public static void init(Context context){
sContext = context;
}
/**
* Adds messages to the SMS message database.
*/
public static class MapAddSmsMessages implements ISeqStepAction {
int mCount;
/**
*
* @param count the number of iterations to execute
*/
public MapAddSmsMessages(int count) {
mCount = count;
}
@Override
public void execute(SeqStep step, HeaderSet request, Operation op)
throws IOException {
int count = mCount; // Number of messages in each conversation
ContentResolver resolver = sContext.getContentResolver();
// Insert some messages
insertTestMessages(resolver, step.index, count);
// Cleanup if needed to avoid duplicates
deleteTestContacts(resolver);
// And now add the contacts
setupTestContacts(resolver);
}
}
/**
* TODO: Only works for filter on TEST_CONTACT_NAME
* @param maxCount
* @param offset
* @param filterContact
* @param read
* @param reportRead
* @param msgCount
* @return
*/
public static BluetoothMapConvoListing getConvoListingReference(int maxCount, int offset,
boolean filterContact, boolean read, boolean reportRead, int msgCount){
BluetoothMapConvoListing list = new BluetoothMapConvoListing();
BluetoothMapConvoListingElement element;
BluetoothMapConvoContactElement contact;
element = new BluetoothMapConvoListingElement();
element.setRead(read, reportRead);
element.setVersionCounter(0);
contact = new BluetoothMapConvoContactElement();
contact.setName(TEST_CONTACT_NAME);
contact.setLastActivity(TEST_ACTIVITY_BEGIN +
msgCount*TEST_ADD_CONTACT_PER_ITERATIONS*TEST_ACTIVITY_INTERVAL);
element.addContact(contact);
list.add(element);
return null;
}
public static void insertTestMessages(ContentResolver resolver, int tag, int count) {
ContentValues values[] = new ContentValues[count*4]; // 4 messages/iteration
long date = TEST_ACTIVITY_BEGIN;
Log.i(TAG, "Preparing messages... with data = " + date);
for (int x = 0;x < count;x++){
/* NOTE: Update TEST_ADD_CONTACT_PER_ITERATIONS if more messages are added */
ContentValues item = new ContentValues(5);
item.put("address", "98765432");
item.put("body", "test message " + x + " step index: " + tag);
item.put("date", date+=TEST_ACTIVITY_INTERVAL);
item.put("read", "0");
if(x%2 == 0) {
item.put("type", Sms.MESSAGE_TYPE_INBOX);
} else {
item.put("type", Sms.MESSAGE_TYPE_SENT);
}
values[x] = item;
item = new ContentValues(5);
item.put("address", "23456780");
item.put("body", "test message " + x + " step index: " + tag);
item.put("date", date += TEST_ACTIVITY_INTERVAL);
item.put("read", "0");
if(x%2 == 0) {
item.put("type", Sms.MESSAGE_TYPE_INBOX);
} else {
item.put("type", Sms.MESSAGE_TYPE_SENT);
}
values[count+x] = item;
item = new ContentValues(5);
item.put("address", "+4523456780");
item.put("body", "test message "+x+" step index: " + tag);
item.put("date", date += TEST_ACTIVITY_INTERVAL);
item.put("read", "0");
if(x%2 == 0) {
item.put("type", Sms.MESSAGE_TYPE_INBOX);
} else {
item.put("type", Sms.MESSAGE_TYPE_SENT);
}
values[2*count+x] = item;
/* This is the message used for test */
item = new ContentValues(5);
item.put("address", TEST_CONTACT_PHONE);
item.put("body", "test message "+x+" step index: " + tag);
item.put("date", date += TEST_ACTIVITY_INTERVAL);
item.put("read", "0");
if(x%2 == 0) {
item.put("type", Sms.MESSAGE_TYPE_INBOX);
} else {
item.put("type", Sms.MESSAGE_TYPE_SENT);
}
values[3*count+x] = item;
}
Log.i(TAG, "Starting bulk insert...");
resolver.bulkInsert(Uri.parse("content://sms"), values);
Log.i(TAG, "Bulk insert done.");
}
/**
* Insert a few contacts in the main contact database, using a test account.
*/
public static void setupTestContacts(ContentResolver resolver){
/*TEST_NUM_CONTACTS must be updated if this function is changed */
insertContact(resolver, "Hans Hansen", "98765432", "hans@hansens.global");
insertContact(resolver, "Helle Børgesen", "23456780", "hb@gmail.com");
insertContact(resolver, TEST_CONTACT_NAME, TEST_CONTACT_PHONE, TEST_CONTACT_EMAIL);
}
/**
* Helper function to insert a contact
* @param name
* @param phone
* @param email
*/
private static void insertContact(ContentResolver resolver, String name, String phone, String email) {
// Get the account info
//Cursor c = resolver.query(uri, projection, selection, selectionArgs, sortOrder)
ContentValues item = new ContentValues(3);
item.put(ContactsContract.RawContacts.ACCOUNT_TYPE, "test_account");
item.put(ContactsContract.RawContacts.ACCOUNT_NAME, "MAP account");
Uri uri = resolver.insert(ContactsContract.RawContacts.CONTENT_URI, item);
Log.i(TAG, "Inserted RawContact: " + uri);
long rawId = Long.parseLong(uri.getLastPathSegment());
//Now add contact information
item = new ContentValues(3);
item.put(ContactsContract.Data.RAW_CONTACT_ID, rawId);
item.put(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
item.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
name);
resolver.insert(ContactsContract.Data.CONTENT_URI, item);
if(phone != null) {
item = new ContentValues(3);
item.put(ContactsContract.Data.RAW_CONTACT_ID, rawId);
item.put(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
item.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone);
resolver.insert(ContactsContract.Data.CONTENT_URI, item);
}
if(email != null) {
item = new ContentValues(3);
item.put(ContactsContract.Data.RAW_CONTACT_ID, rawId);
item.put(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
item.put(ContactsContract.CommonDataKinds.Email.ADDRESS, email);
resolver.insert(ContactsContract.Data.CONTENT_URI, item);
}
}
/**
* Delete all contacts belonging to the test_account.
*/
public static void deleteTestContacts(ContentResolver resolver){
resolver.delete(ContactsContract.RawContacts.CONTENT_URI,
ContactsContract.RawContacts.ACCOUNT_TYPE + "=\"test_account\"", null);
}
/****************************************************************************
* Small test cases to trigger the functionality without running a sequence.
****************************************************************************/
/**
* Insert a few contacts in the main contact database, using a test account.
*/
public void testInsertMessages() {
ContentResolver resolver = mContext.getContentResolver();
insertTestMessages(resolver, 1234, 10);
}
public void testInsert1000Messages() {
ContentResolver resolver = mContext.getContentResolver();
insertTestMessages(resolver, 1234, 1000);
}
/**
* Insert a few contacts in the main contact database, using a test account.
*/
public void testSetupContacts() {
ContentResolver resolver = mContext.getContentResolver();
setupTestContacts(resolver);
}
/**
* Delete all contacts belonging to the test_account.
*/
public void testDeleteTestContacts() {
ContentResolver resolver = mContext.getContentResolver();
deleteTestContacts(resolver);
}
public void testSetup1000Contacts() {
ContentResolver resolver = mContext.getContentResolver();
for(int i = 0; i < 1000; i++) {
insertContact(resolver, "Hans Hansen " + i,
"98765431" + i, "hans" + i + "@hansens.global");
}
}
}