/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.wink.example.multipart;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import javax.servlet.ServletException;
import javax.ws.rs.core.MediaType;
import org.apache.wink.common.internal.providers.multipart.MultiPartParser;
import org.apache.wink.common.internal.utils.MediaTypeUtils;
import org.apache.wink.server.internal.servlet.MockServletInvocationTest;
import org.apache.wink.test.mock.MockRequestConstructor;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
/**
*
*/
public class MultiPartTest extends MockServletInvocationTest {
@Override
protected Class<?>[] getClasses() {
return new Class[] {MultiPartResource.class};
}
private String buildUserXML(String first, String last, String id, String email) {
return "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><user><firstName>" + first
+ "</firstName><lastName>"
+ last
+ "</lastName><id>"
+ id
+ "</id><email>"
+ email
+ "</email></user>";
}
public void verifyResponse(MockHttpServletResponse response, int expectedPartsNum)
throws Exception {
String contentType = response.getContentType();
String bound = contentType.substring(contentType.indexOf("=") + 1);
String content = response.getContentAsString();
ByteArrayInputStream in = new ByteArrayInputStream(content.getBytes());
MultiPartParser mpp = new MultiPartParser(in, bound);
int numOfParts = 0;
while (mpp.nextPart()) {
numOfParts++;
}
assertEquals(numOfParts, expectedPartsNum);
}
private byte[] obtainByteData(String filename) throws IOException {
InputStream inputStream = getClass().getResourceAsStream(filename);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(1024);
byte[] bytes = new byte[512];
// Read bytes from the input stream in bytes.length-sized chunks and
// write
// them into the output stream
int readBytes;
while ((readBytes = inputStream.read(bytes)) > 0) {
outputStream.write(bytes, 0, readBytes);
}
// Convert the contents of the output stream into a byte array
byte[] byteData = outputStream.toByteArray();
// Close the streams
inputStream.close();
outputStream.close();
return byteData;
}
public void testUsers() throws Exception {
// check the collection
MockHttpServletRequest request =
MockRequestConstructor.constructMockRequest("GET",
"/MP/users",
MediaTypeUtils.MULTIPART_MIXED);
MockHttpServletResponse response = invoke(request);
assertEquals("status", 200, response.getStatus());
verifyResponse(response, 2);
String boundary = "I am a boundary";
String requestStr =
"--" + boundary
+ "\n"
+ "Content-Type: application/xml\n\n"
+ buildUserXML("firstName", "lastName", "9", "myEmail@mail.com")
+ "\n--"
+ boundary
+ "--";
request =
MockRequestConstructor
.constructMockRequest("POST",
"/MP/users",
MediaTypeUtils.MULTIPART_MIXED,
MediaTypeUtils.MULTIPART_MIXED + ";boundary=" + boundary,
requestStr.getBytes());
response = invoke(request);
assertEquals("status", 200, response.getStatus());
verifyResponse(response, 3);
}
/**
* Upload files and test the the file size as returned by the resource is
* identical to the actual file length
*
* @throws IOException
* @throws ServletException
* @throws UnsupportedEncodingException
*/
public void testUploadFile() throws IOException, ServletException, UnsupportedEncodingException {
String boundary = "I am a boundary";
MockHttpServletRequest request;
MockHttpServletResponse response;
String msg1 =
"--" + boundary
+ "\n"
+ "Content-Disposition: form-data; name=\"datafile\"; filename=\"JDOMAbout\"\n"
+ "Content-Type: application/octet-stream\n\n";
byte[] bms1 = msg1.getBytes();
byte[] bms2 = obtainByteData("file1");
String msg3 = "\n--" + boundary + "--";
byte[] bms3 = msg3.getBytes();
int bodyLength = bms2.length;
byte[] msg = new byte[bms1.length + bms2.length + bms3.length];
System.arraycopy(bms1, 0, msg, 0, bms1.length);
System.arraycopy(bms2, 0, msg, bms1.length, bms2.length);
System.arraycopy(bms3, 0, msg, bms1.length + bms2.length, bms3.length);
request =
MockRequestConstructor
.constructMockRequest("POST",
"/MP/files",
MediaType.TEXT_PLAIN,
MediaTypeUtils.MULTIPART_FORM_DATA + ";boundary=" + boundary,
msg);
response = invoke(request);
String content = response.getContentAsString();
int i = content.indexOf(String.valueOf(bodyLength));
assertNotSame(i, -1);
}
}