package com.microsoft.live.unittest; import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; import java.util.concurrent.LinkedBlockingQueue; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.HttpVersion; import org.apache.http.StatusLine; import org.apache.http.client.methods.HttpPut; import org.apache.http.message.BasicStatusLine; import org.json.JSONObject; import android.text.TextUtils; import com.microsoft.live.LiveOperation; import com.microsoft.live.LiveOperationException; import com.microsoft.live.LiveUploadOperationListener; import com.microsoft.live.OverwriteOption; import com.microsoft.live.constants.JsonKeys; import com.microsoft.live.constants.Paths; import com.microsoft.live.mock.MockHttpEntity; import com.microsoft.live.mock.MockHttpResponse; import com.microsoft.live.test.util.UploadAsyncRunnable; import com.microsoft.live.test.util.UploadOperationQueueingListener; import com.microsoft.live.util.NullLiveUploadOperationListener; public class UploadTest extends ApiTest<LiveOperation, LiveUploadOperationListener> { private static final String SOURCE = "http://download.location.com/some/path"; private static final InputStream FILE; private static final String FILE_ID = "file.1231"; private static final String FILENAME = "some_file.txt"; static { FILE = new ByteArrayInputStream("File contents".getBytes()); } public void testAsyncFileNull() { try { this.liveConnectClient.uploadAsync(Paths.ME_SKYDRIVE, null, FILE, NullLiveUploadOperationListener.INSTANCE); this.failNoNullPointerExceptionThrown(); } catch (NullPointerException e) { assertNotNull(e.getMessage()); } } public void testAsyncFilenameNull() { try { this.liveConnectClient.uploadAsync(Paths.ME_SKYDRIVE, FILENAME, (InputStream)null, NullLiveUploadOperationListener.INSTANCE); this.failNoNullPointerExceptionThrown(); } catch (NullPointerException e) { assertNotNull(e.getMessage()); } try { this.liveConnectClient.uploadAsync(Paths.ME_SKYDRIVE, FILENAME, (File)null, NullLiveUploadOperationListener.INSTANCE); this.failNoNullPointerExceptionThrown(); } catch (NullPointerException e) { assertNotNull(e.getMessage()); } } @Override public void testAsyncResponseBodyInvalid() throws Throwable { this.loadInvalidResponseBody(); String requestPath = Paths.ME_SKYDRIVE; this.runTestOnUiThread(createAsyncRunnable(requestPath, FILENAME, FILE)); LiveOperation fromMethod = this.responseQueue.take(); LiveOperation fromCallback = this.pollResponseQueue(); LiveOperationException exception = this.pollExceptionQueue(); this.checkReturnedException(fromMethod, fromCallback, exception); this.checkOperationMembers(fromMethod, getMethod(), requestPath); this.checkResponseBodyInvalid(fromMethod); } @Override public void testAsyncResponseBodyValid() throws Throwable { this.loadUploadLocationResponseBody(); this.loadValidResponseBody(); String requestPath = Paths.ME_SKYDRIVE; this.runTestOnUiThread(createAsyncRunnable(requestPath, FILENAME, FILE)); LiveOperation fromMethod = this.responseQueue.take(); LiveOperation fromCallback = this.pollResponseQueue(); this.checkReturnedOperations(fromMethod, fromCallback); this.checkOperationMembers(fromMethod, getMethod(), requestPath); this.checkValidResponseBody(fromMethod); } @Override public void testAsyncResponseBodyValidWithUserState() throws Throwable { this.loadUploadLocationResponseBody(); this.loadValidResponseBody(); String requestPath = Paths.ME_SKYDRIVE; Object userState = new Object(); this.runTestOnUiThread(createAsyncRunnable(requestPath, FILENAME, FILE, userState)); LiveOperation fromMethod = this.responseQueue.take(); LiveOperation fromCallback = this.pollResponseQueue(); this.checkReturnedOperations(fromMethod, fromCallback); this.checkOperationMembers(fromMethod, getMethod(), requestPath, userState); this.checkValidResponseBody(fromMethod); } public void testAsyncResponseBodyValidWithOverwrite() throws Throwable { this.loadUploadLocationResponseBody(); this.loadValidResponseBody(); String requestPath = Paths.ME_SKYDRIVE; Object userState = new Object(); this.runTestOnUiThread(createAsyncRunnable( requestPath, FILENAME, OverwriteOption.Overwrite, FILE, userState)); LiveOperation fromMethod = this.responseQueue.take(); LiveOperation fromCallback = this.pollResponseQueue(); this.checkReturnedOperations(fromMethod, fromCallback); this.checkOperationMembers(fromMethod, getMethod(), requestPath, userState); this.checkValidResponseBody(fromMethod); } public void testSyncFileNull() throws Exception { try { this.liveConnectClient.upload(Paths.ME_SKYDRIVE, FILENAME, (InputStream)null); this.failNoNullPointerExceptionThrown(); } catch (NullPointerException e) { assertNotNull(e.getMessage()); } try { this.liveConnectClient.upload(Paths.ME_SKYDRIVE, FILENAME, (File)null); this.failNoNullPointerExceptionThrown(); } catch (NullPointerException e) { assertNotNull(e.getMessage()); } } public void testSyncFilenameNull() throws Exception { try { this.liveConnectClient.upload(Paths.ME_SKYDRIVE, null, FILE); this.failNoNullPointerExceptionThrown(); } catch (NullPointerException e) { assertNotNull(e.getMessage()); } } @Override public void testSyncResponseBodyInvalid() throws Exception { this.loadInvalidResponseBody(); String requestPath = Paths.ME_SKYDRIVE; try { this.liveConnectClient.upload(requestPath, FILENAME, FILE); this.failNoLiveOperationExceptionThrown(); } catch (LiveOperationException e) { assertFalse(TextUtils.isEmpty(e.getMessage())); } } public void testSyncResponseBodyInvalidWithOverwrite() throws Exception { this.loadInvalidResponseBody(); String requestPath = Paths.ME_SKYDRIVE; try { this.liveConnectClient.upload(requestPath, FILENAME, FILE, OverwriteOption.Overwrite); this.failNoLiveOperationExceptionThrown(); } catch (LiveOperationException e) { assertFalse(TextUtils.isEmpty(e.getMessage())); } } @Override public void testSyncResponseBodyValid() throws Exception { this.loadUploadLocationResponseBody(); this.loadValidResponseBody(); String requestPath = Paths.ME_SKYDRIVE; LiveOperation operation = this.liveConnectClient.upload(requestPath, FILENAME, FILE); this.checkOperationMembers(operation, getMethod(), requestPath); this.checkValidResponseBody(operation); } public void testSyncResponseBodyValidWithOverwrite() throws Exception { this.loadUploadLocationResponseBody(); this.loadValidResponseBody(); String requestPath = Paths.ME_SKYDRIVE; LiveOperation operation = this.liveConnectClient.upload( requestPath, FILENAME, FILE, OverwriteOption.Overwrite); this.checkOperationMembers(operation, getMethod(), requestPath); this.checkValidResponseBody(operation); } @Override protected void checkValidResponseBody(LiveOperation operation) throws Exception { JSONObject result = operation.getResult(); assertEquals(2, result.length()); String id = result.getString(JsonKeys.ID); assertEquals(FILE_ID, id); String source = result.getString(JsonKeys.SOURCE); assertEquals(SOURCE, source); } protected UploadAsyncRunnable createAsyncRunnable(String requestPath, String filename, InputStream file) { return new UploadAsyncRunnable(this.responseQueue, this.liveConnectClient, requestPath, filename, file, this.queueingListener); } protected UploadAsyncRunnable createAsyncRunnable(String requestPath, String filename, InputStream file, Object userState) { return new UploadAsyncRunnable(this.responseQueue, this.liveConnectClient, requestPath, filename, file, this.queueingListener, userState); } protected UploadAsyncRunnable createAsyncRunnable(String requestPath, String filename, OverwriteOption overwrite, InputStream file, Object userState) { return new UploadAsyncRunnable(this.responseQueue, this.liveConnectClient, requestPath, filename, overwrite, file, this.queueingListener, userState); } @Override protected final UploadAsyncRunnable createAsyncRunnable(String requestPath) { throw new UnsupportedOperationException("Unable to create UploadAsyncRunnable from only " + "a requestPath"); } @Override protected final UploadAsyncRunnable createAsyncRunnable(String requestPath, Object userState) { throw new UnsupportedOperationException("Unable to create UploadAsyncRunnable from only " + "a requestPath and an userState"); } @Override protected void loadInvalidResponseBody() throws Exception { super.loadInvalidResponseBody(); HttpResponse invalidResponse = this.mockClient.getHttpResponse(); this.mockClient.clearHttpResponseQueue(); this.loadUploadLocationResponseBody(); this.mockClient.addHttpResponse(invalidResponse); } @Override protected void loadPathInvalidResponse(String requestPath) throws Exception { super.loadPathInvalidResponse(requestPath); // we have to load the uploadLocationResponse first // so store the invalidResponse and load it in again after the uploadlocation // has been added. HttpResponse invalidResponse = this.mockClient.getHttpResponse(); this.mockClient.clearHttpResponseQueue(); this.loadUploadLocationResponseBody(); this.mockClient.addHttpResponse(invalidResponse); } @Override protected void loadValidResponseBody() throws Exception { JSONObject jsonResponseBody = new JSONObject(); jsonResponseBody.put(JsonKeys.ID, FILE_ID); jsonResponseBody.put(JsonKeys.SOURCE, SOURCE); InputStream responseStream = new ByteArrayInputStream(jsonResponseBody.toString().getBytes()); MockHttpEntity responseEntity = new MockHttpEntity(responseStream); StatusLine created = new BasicStatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_CREATED, ""); MockHttpResponse response = new MockHttpResponse(responseEntity, created); this.mockClient.addHttpResponse(response); } protected void loadUploadLocationResponseBody() throws Exception { /* create folder response */ JSONObject folder = new JSONObject(); folder.put(JsonKeys.UPLOAD_LOCATION, "https://upload.location.com/some/path"); InputStream uploadLocationStream = new ByteArrayInputStream(folder.toString().getBytes()); MockHttpEntity uploadLocationEntity = new MockHttpEntity(uploadLocationStream); StatusLine ok = new BasicStatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, ""); MockHttpResponse uploadLocationResponse = new MockHttpResponse(uploadLocationEntity, ok); this.mockClient.setHttpResponse(uploadLocationResponse); } @Override protected String getMethod() { return HttpPut.METHOD_NAME; } @Override protected void setUp() throws Exception { super.setUp(); // some upload requests perform two http requests, so clear any responses that may have // been entered already. each test here is responsible for loading 1 or two responses. this.mockClient.clearHttpResponseQueue(); this.responseQueue = new LinkedBlockingQueue<LiveOperation>(); this.queueingListener = new UploadOperationQueueingListener(this.exceptionQueue, this.responseQueue); } }