| package com.android.bluetooth.tests; |
| |
| import java.io.IOException; |
| |
| import javax.obex.HeaderSet; |
| import javax.obex.Operation; |
| import javax.obex.ResponseCodes; |
| |
| import junit.framework.Assert; |
| import android.util.Log; |
| |
| import com.android.bluetooth.map.BluetoothMapAppParams; |
| import com.android.bluetooth.map.BluetoothMapFolderElement; |
| import com.android.bluetooth.tests.TestSequencer.OPTYPE; |
| |
| public class MapStepsFolder { |
| private final static String TAG = "MapStepsFolder"; |
| /** |
| * Request and expect the following folder structure: |
| * root |
| * telecom |
| * msg |
| * inbox |
| * outbox |
| * draft |
| * sent |
| * deleted |
| * |
| * The order in which they occur in the listing will not matter. |
| * @param sequencer |
| */ |
| protected static void addGoToMsgFolderSteps(TestSequencer sequencer) { |
| SeqStep step; |
| //BluetoothMapFolderElement rootDir = new BluetoothMapFolderElement("root", null); |
| |
| // MAP Get Folder Listing Steps |
| // The telecom folder |
| step = sequencer.addStep(OPTYPE.GET, null); |
| HeaderSet hs = new HeaderSet(); |
| hs.setHeader(HeaderSet.TYPE, MapObexLevelTest.TYPE_GET_FOLDER_LISTING); |
| step.mReqHeaders = hs; |
| step.mValidator = new MapBuildFolderStructurValidator(1, null); |
| |
| step = sequencer.addStep(OPTYPE.SET_PATH, ObexTest.getResponsecodevalidator()); |
| hs = new HeaderSet(); |
| hs.setHeader(HeaderSet.NAME, "telecom"); |
| step.mReqHeaders = hs; |
| step.mClientPostAction = new MapSetClientFolder("telecom"); |
| |
| |
| // The msg folder |
| step = sequencer.addStep(OPTYPE.GET, null); |
| hs = new HeaderSet(); |
| hs.setHeader(HeaderSet.TYPE, MapObexLevelTest.TYPE_GET_FOLDER_LISTING); |
| step.mReqHeaders = hs; |
| step.mValidator = new MapBuildFolderStructurValidator(1, null); |
| |
| step = sequencer.addStep(OPTYPE.SET_PATH, ObexTest.getResponsecodevalidator()); |
| hs = new HeaderSet(); |
| hs.setHeader(HeaderSet.NAME, "msg"); |
| step.mReqHeaders = hs; |
| step.mClientPostAction = new MapSetClientFolder("msg"); |
| |
| // The msg folder |
| step = sequencer.addStep(OPTYPE.GET, null); |
| hs = new HeaderSet(); |
| hs.setHeader(HeaderSet.TYPE, MapObexLevelTest.TYPE_GET_FOLDER_LISTING); |
| step.mReqHeaders = hs; |
| step.mValidator = new MapBuildFolderStructurValidator(5, buildDefaultFolderStructure()); |
| } |
| |
| /** |
| * Sets the current folder on the client, to the folder name specified in the constructor. |
| * TODO: Could be extended to be able to navigate back and forth in the folder structure. |
| */ |
| private static class MapSetClientFolder implements ISeqStepAction { |
| final String mFolderName; |
| public MapSetClientFolder(String folderName) { |
| super(); |
| this.mFolderName = folderName; |
| } |
| @Override |
| public void execute(SeqStep step, HeaderSet request, Operation op) |
| throws IOException { |
| MapBuildFolderStructurValidator.sCurrentFolder = |
| MapBuildFolderStructurValidator.sCurrentFolder.getSubFolder(mFolderName); |
| Assert.assertNotNull(MapBuildFolderStructurValidator.sCurrentFolder); |
| Log.i(TAG, "MapSetClientFolder(): Current path: " + |
| MapBuildFolderStructurValidator.sCurrentFolder.getFullPath()); |
| } |
| } |
| |
| /* Functions to validate results */ |
| private static class MapBuildFolderStructurValidator implements ISeqStepValidator { |
| |
| final int mExpectedListingSize; |
| static BluetoothMapFolderElement sCurrentFolder = null; |
| final BluetoothMapFolderElement mExpectedFolderElement; |
| |
| public MapBuildFolderStructurValidator(int mExpectedListingSize, |
| BluetoothMapFolderElement folderElement) { |
| super(); |
| if(sCurrentFolder == null) { |
| sCurrentFolder = new BluetoothMapFolderElement("root", null); |
| } |
| this.mExpectedListingSize = mExpectedListingSize; |
| this.mExpectedFolderElement = folderElement; |
| } |
| |
| |
| @Override |
| public boolean validate(SeqStep step, HeaderSet response, Operation op) |
| throws IOException { |
| Assert.assertNotNull(op); |
| op.noBodyHeader(); |
| try { |
| // For some odd reason, the request will not be send before we start to read the |
| // reply data, hence we need to do this first? |
| sCurrentFolder.appendSubfolders(op.openInputStream()); |
| response = op.getReceivedHeader(); |
| byte[] appParamsRaw = (byte[])response.getHeader(HeaderSet.APPLICATION_PARAMETER); |
| Assert.assertNotNull(appParamsRaw); |
| BluetoothMapAppParams appParams; |
| appParams = new BluetoothMapAppParams(appParamsRaw); |
| Assert.assertNotNull(appParams); |
| if(mExpectedFolderElement != null) { |
| // Recursively compare |
| Assert.assertTrue(mExpectedFolderElement.compareTo(sCurrentFolder.getRoot()) |
| == 0); |
| } |
| int responseCode = op.getResponseCode(); |
| Assert.assertEquals(ResponseCodes.OBEX_HTTP_OK, responseCode); |
| op.close(); |
| } catch (Exception e) { |
| Log.e(TAG,"",e); |
| Assert.fail(); |
| } |
| return true; |
| } |
| |
| } |
| |
| |
| private static BluetoothMapFolderElement buildDefaultFolderStructure(){ |
| BluetoothMapFolderElement root = |
| new BluetoothMapFolderElement("root", null); // This will be the root element |
| BluetoothMapFolderElement tmpFolder; |
| tmpFolder = root.addFolder("telecom"); // root/telecom |
| tmpFolder = tmpFolder.addFolder("msg"); // root/telecom/msg |
| tmpFolder.addFolder("inbox"); // root/telecom/msg/inbox |
| tmpFolder.addFolder("outbox"); // root/telecom/msg/outbox |
| tmpFolder.addFolder("sent"); // root/telecom/msg/sent |
| tmpFolder.addFolder("deleted"); // root/telecom/msg/deleted |
| tmpFolder.addFolder("draft"); // root/telecom/msg/draft |
| return root; |
| } |
| |
| |
| } |