blob: 4aa04d790ff66c0e393d5708db530378c6dd4b58 [file] [log] [blame]
package com.android.bluetooth.tests;
import java.util.ArrayList;
import java.util.concurrent.CountDownLatch;
import javax.obex.HeaderSet;
import javax.obex.Operation;
import javax.obex.ResponseCodes;
import junit.framework.Assert;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.os.RemoteException;
import android.util.Log;
import com.android.bluetooth.map.BluetoothMapAccountItem;
import com.android.bluetooth.map.BluetoothMapContentObserver;
import com.android.bluetooth.map.BluetoothMapMasInstance;
import com.android.bluetooth.map.BluetoothMapObexServer;
import com.android.bluetooth.map.BluetoothMnsObexClient;
public class MapObexTestServer extends BluetoothMapObexServer {
private static final String TAG = "MapObexTestServer";
private static final boolean V = true;
ArrayList<SeqStep> mSequence;
CountDownLatch mStopLatch;
ObexTestDataHandler mDataHandler;
int mOperationIndex = 0;
/* This needs to be static, as calling the super-constructor must be the first step.
* Alternatively add the account as constructor parameter, and create a builder
* function - factory pattern. */
// private static BluetoothMapAccountItem mAccountMock = new BluetoothMapAccountItem("1",
// "TestAccount",
// "do.not.exist.package.name.and.never.used.anyway:-)",
// "info.guardianproject.otr.app.im.provider.bluetoothprovider",
// null,
// BluetoothMapUtils.TYPE.IM,
// null,
// null);
private static BluetoothMapAccountItem mAccountMock = null;
/* MAP Specific instance variables
private final BluetoothMapContentObserver mObserver = null;
private final BluetoothMnsObexClient mMnsClient = null;*/
/* Test values, consider gathering somewhere else */
private static final int MAS_ID = 0;
private static final int REMOTE_FEATURE_MASK = 0x07FFFFFF;
private static final BluetoothMapMasInstance mMasInstance =
new MockMasInstance(MAS_ID, REMOTE_FEATURE_MASK);
public MapObexTestServer(final Context context, ArrayList<SeqStep> sequence,
CountDownLatch stopLatch) throws RemoteException {
super(null, context,
new BluetoothMapContentObserver(context,
new BluetoothMnsObexClient(
BluetoothAdapter.getDefaultAdapter().
getRemoteDevice("12:23:34:45:56:67"), null, null),
/* TODO: this will not work for single device test... */
mMasInstance,
mAccountMock, /* Account */
true) /* Enable SMS/MMS*/,
mMasInstance,
mAccountMock /* Account */,
true /* SMS/MMS enabled*/);
mSequence = sequence;
mDataHandler = new ObexTestDataHandler("(Server)");
mStopLatch = stopLatch;
}
/* OBEX operation handlers */
@Override
public int onConnect(HeaderSet request, HeaderSet reply) {
Log.i(TAG,"onConnect()");
int index;
int result = ResponseCodes.OBEX_HTTP_OK;
try {
index = ((Long)request.getHeader(TestSequencer.STEP_INDEX_HEADER)).intValue();
mOperationIndex = index;
SeqStep step = mSequence.get(mOperationIndex);
Assert.assertNotNull("invalid step index!", step);
if(step.mServerPreAction != null) {
step.mServerPreAction.execute(step, request, null);
}
result = super.onConnect(request, reply);
} catch (Exception e) {
Log.e(TAG, "Exception in onConnect - aborting...", e);
result = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
// A read from null will produce exception to end the test.
}
return result;
}
@Override
public void onDisconnect(HeaderSet request, HeaderSet reply) {
Log.i(TAG,"onDisconnect()");
/* TODO: validate request headers, and set response headers */
int index;
int result = ResponseCodes.OBEX_HTTP_OK;
try {
index = ((Long)request.getHeader(TestSequencer.STEP_INDEX_HEADER)).intValue();
mOperationIndex = index;
SeqStep step = mSequence.get(mOperationIndex);
Assert.assertNotNull("invalid step index!", step);
if(step.mServerPreAction != null) {
step.mServerPreAction.execute(step, request, null);
}
super.onDisconnect(request, reply);
} catch (Exception e) {
Log.e(TAG, "Exception in onDisconnect - aborting...", e);
result = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
// A read from null will produce exception to end the test.
}
if(mOperationIndex >= (mSequence.size()-1)) {
/* End of test, signal test runner thread */
Log.i(TAG, "Sending latch close signal...");
mStopLatch.countDown();
} else {
Log.i(TAG, "Got disconnect with mOperationCounter = " + mOperationIndex);
}
reply.responseCode = result;
}
@Override
public int onPut(Operation operation) {
Log.i(TAG,"onPut()");
int result = ResponseCodes.OBEX_HTTP_OK;
try{
HeaderSet reqHeaders = operation.getReceivedHeader();
int index = ((Long)reqHeaders.getHeader(TestSequencer.STEP_INDEX_HEADER)).intValue();
mOperationIndex = index;
SeqStep step = mSequence.get(mOperationIndex);
Assert.assertNotNull("invalid step index!", step);
if(step.mServerPreAction != null) {
step.mServerPreAction.execute(step, reqHeaders, operation);
}
super.onPut(operation);
} catch (Exception e) {
Log.e(TAG, "Exception in onPut - aborting...", e);
result = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
// A read from null will produce exception to end the test.
}
if(result == ResponseCodes.OBEX_HTTP_OK) {
Log.i(TAG, "OBEX-HANDLER: operation complete success");
} else {
Log.e(TAG, "OBEX-HANDLER: operation complete FAILED!");
}
return result;
}
@Override
public int onGet(Operation operation) {
Log.i(TAG,"onGet()");
int result = ResponseCodes.OBEX_HTTP_OK;
try{
HeaderSet reqHeaders = operation.getReceivedHeader();
int index = ((Long)reqHeaders.getHeader(TestSequencer.STEP_INDEX_HEADER)).intValue();
mOperationIndex = index;
SeqStep step = mSequence.get(mOperationIndex);
Assert.assertNotNull("invalid step index!", step);
if(step.mServerPreAction != null) {
step.mServerPreAction.execute(step, reqHeaders, operation);
}
super.onGet(operation);
} catch (Exception e) {
Log.e(TAG, "Exception in onGet - aborting...", e);
result = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
// A read from null will produce exception to end the test.
}
if(result == ResponseCodes.OBEX_HTTP_OK) {
Log.i(TAG, "OBEX-HANDLER: operation complete success");
} else {
Log.e(TAG, "OBEX-HANDLER: operation complete FAILED!");
}
return result;
}
}