From ed33b3ae280c2849a824612e034861ca878a9112 Mon Sep 17 00:00:00 2001 From: Christina Ho Date: Mon, 28 Oct 2019 17:18:05 -0600 Subject: [PATCH 1/3] Fixed a bug where file mime returned always included delimiter. Refactored and added unit tests. --- .../interceptors/SerializeInterceptor.java | 2 +- .../SerializeInterceptorTest.java | 98 ++++++++++++++++--- 2 files changed, 84 insertions(+), 16 deletions(-) diff --git a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/interceptors/SerializeInterceptor.java b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/interceptors/SerializeInterceptor.java index 9fd41ac4..99cb4191 100755 --- a/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/interceptors/SerializeInterceptor.java +++ b/ipp-v3-java-devkit/src/main/java/com/intuit/ipp/interceptors/SerializeInterceptor.java @@ -202,7 +202,7 @@ private boolean isImageType(String mime) { */ private String getMime(String name, String delimiter) { if (StringUtils.hasText(name)) { - return name.substring(name.lastIndexOf(delimiter), name.length()); + return name.substring(name.lastIndexOf(delimiter) + 1, name.length()); } return null; } diff --git a/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/SerializeInterceptorTest.java b/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/SerializeInterceptorTest.java index d0c3ddca..b9430ee4 100644 --- a/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/SerializeInterceptorTest.java +++ b/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/SerializeInterceptorTest.java @@ -3,13 +3,22 @@ import com.intuit.ipp.data.Attachable; import com.intuit.ipp.exception.FMSException; import com.intuit.ipp.util.Config; +import mockit.Expectations; + +import org.testng.Assert; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; +import javax.imageio.ImageIO; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.namespace.QName; +import java.awt.image.RenderedImage; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.HashMap; @@ -24,16 +33,28 @@ public class SerializeInterceptorTest { - private SerializeInterceptor serializeInterceptor = new SerializeInterceptor(); + private SerializeInterceptor serializeInterceptor; + private IntuitMessage message; + Map requestParams; + JAXBElement jaxbElement; + + @BeforeTest + public void setUp() { + TestJson json = new TestJson(); + json.setFoo("bar"); + jaxbElement = new JAXBElement(new QName(TestJson.class.getSimpleName()), TestJson.class, json); + serializeInterceptor = new SerializeInterceptor(); + } + + @BeforeMethod + public void beforeEach() { + message = new IntuitMessage(); + requestParams = new HashMap<>(); + } @Test(description = "Given a POST request with object for serialization, " + "the serialized data should be present in the serializedData object") public void execute_positiveCase1() throws FMSException { - IntuitMessage message = new IntuitMessage(); - TestJson json = new TestJson(); - json.setFoo("bar"); - JAXBElement jaxbElement = new JAXBElement(new QName(TestJson.class.getSimpleName()), TestJson.class, json); - Map requestParams = new HashMap<>(); requestParams.put(REQ_PARAM_METHOD_TYPE, "POST"); message.getRequestElements().setRequestParameters(requestParams); message.getRequestElements().setObjectToSerialize(jaxbElement); @@ -44,8 +65,6 @@ public void execute_positiveCase1() throws FMSException { @Test(description = "Given a POST request with post body for serialization, " + "the serialized data should be present in the serializedData object") public void execute_positiveCase2() throws FMSException { - IntuitMessage message = new IntuitMessage(); - Map requestParams = new HashMap<>(); requestParams.put(REQ_PARAM_METHOD_TYPE, "POST"); message.getRequestElements().setRequestParameters(requestParams); String jsonInput = "{\"foo\":\"bar\"}"; @@ -56,8 +75,6 @@ public void execute_positiveCase2() throws FMSException { @Test(description = "Given a GET request for serialization, the serialized data should be null") public void execute_positiveCase3() throws FMSException { - IntuitMessage message = new IntuitMessage(); - Map requestParams = new HashMap<>(); requestParams.put(REQ_PARAM_METHOD_TYPE, "GET"); message.getRequestElements().setRequestParameters(requestParams); serializeInterceptor.execute(message); @@ -69,17 +86,14 @@ public void execute_positiveCase3() throws FMSException { "a file to be uploaded. The serialized data should be present in the " + "serializedData object along with the file that would be uploaded.") public void execute_positiveCase4() throws FMSException { - IntuitMessage message = new IntuitMessage(); - TestJson json = new TestJson(); - json.setFoo("bar"); - JAXBElement jaxbElement = new JAXBElement(new QName(TestJson.class.getSimpleName()), TestJson.class, json); - Map requestParams = new HashMap<>(); requestParams.put(REQ_PARAM_METHOD_TYPE, "POST"); message.getRequestElements().setRequestParameters(requestParams); message.getRequestElements().setObjectToSerialize(jaxbElement); + message.getRequestElements().setAction(UPLOAD.toString()); message.getRequestElements().getUploadRequestElements().setBoundaryForEntity("Entity"); message.getRequestElements().getUploadRequestElements().setBoundaryForContent("Content"); + Attachable attachable = new Attachable(); attachable.setFileName("test.txt"); message.getRequestElements().setEntity(attachable); @@ -110,6 +124,53 @@ public void execute_positiveCase5() throws FMSException { assertEquals(message.getRequestElements().getSerializedData(), "{\"foo\":\"bar\"}"); } + @Test(description = "Given a POST request with an image file upload, " + + "the serializeData object should return the boundaries with the serialized data") + public void execute_uploadFileImageContent() throws FMSException, IOException { + requestParams.put(REQ_PARAM_METHOD_TYPE, "POST"); + message.getRequestElements().setRequestParameters(requestParams); + + InputStream mockedStream = new ByteArrayInputStream("test data".getBytes()); + setTestUploadRequestElements(mockedStream); + + Attachable attachable = new Attachable(); + attachable.setContentType("something/jpeg"); + message.getRequestElements().setEntity(attachable); + message.getRequestElements().setObjectToSerialize(jaxbElement); + + new Expectations(ImageIO.class) {{ + ImageIO.write((RenderedImage) any, anyString, (ByteArrayOutputStream) any); + }}; + + serializeInterceptor.execute(message); + Assert.assertEquals(message.getRequestElements().getSerializedData(), "EntityBoundary{\"foo\":\"bar\"}ContentBoundary"); + } + + @Test(description = "Given a POST request with image file upload, " + + "an exception thrown when an internal IO error occurs", + expectedExceptions = FMSException.class + ) + public void execute_uploadFileImageContent_exception() throws FMSException, IOException { + requestParams.put(REQ_PARAM_METHOD_TYPE, "POST"); + message.getRequestElements().setRequestParameters(requestParams); + + InputStream mockedStream = new ByteArrayInputStream("test data".getBytes()); + setTestUploadRequestElements(mockedStream); + + Attachable attachable = new Attachable(); + attachable.setContentType("something/jpeg"); + message.getRequestElements().setEntity(attachable); + message.getRequestElements().setObjectToSerialize(jaxbElement); + + new Expectations(ImageIO.class) {{ + ImageIO.write((RenderedImage) any, anyString, (ByteArrayOutputStream) any); + result = new IOException("IOException thrown"); + }}; + + serializeInterceptor.execute(message); + Assert.assertEquals(message.getRequestElements().getSerializedData(), "EntityBoundary{\"foo\":\"bar\"}ContentBoundary"); + } + @Test(description = "Serialization request format returned should be of " + "the form: message.request.serialization") public void getSerializationRequestFormat() { @@ -119,6 +180,13 @@ public void getSerializationRequestFormat() { .equalsIgnoreCase(Config.getProperty(SERIALIZATION_REQUEST_FORMAT))); } + private void setTestUploadRequestElements(InputStream docContent) { + message.getRequestElements().setAction("upload"); + message.getRequestElements().getUploadRequestElements().setDocContent(docContent); + message.getRequestElements().getUploadRequestElements().setBoundaryForContent("ContentBoundary"); + message.getRequestElements().getUploadRequestElements().setBoundaryForEntity("EntityBoundary"); + } + @XmlRootElement class TestJson { From d6c4f3a4bcddb16ad459dcf4298b459d98881bef Mon Sep 17 00:00:00 2001 From: Christina Ho Date: Tue, 29 Oct 2019 10:21:45 -0600 Subject: [PATCH 2/3] Replace Expectations with Mockups --- .../SerializeInterceptorTest.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/SerializeInterceptorTest.java b/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/SerializeInterceptorTest.java index b9430ee4..7f27511f 100644 --- a/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/SerializeInterceptorTest.java +++ b/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/SerializeInterceptorTest.java @@ -3,8 +3,9 @@ import com.intuit.ipp.data.Attachable; import com.intuit.ipp.exception.FMSException; import com.intuit.ipp.util.Config; -import mockit.Expectations; +import mockit.Mock; +import mockit.MockUp; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeTest; @@ -17,9 +18,9 @@ import javax.xml.namespace.QName; import java.awt.image.RenderedImage; import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -138,9 +139,12 @@ public void execute_uploadFileImageContent() throws FMSException, IOException { message.getRequestElements().setEntity(attachable); message.getRequestElements().setObjectToSerialize(jaxbElement); - new Expectations(ImageIO.class) {{ - ImageIO.write((RenderedImage) any, anyString, (ByteArrayOutputStream) any); - }}; + new MockUp() { + @Mock + public boolean write(RenderedImage image, String formatName, OutputStream output) { + return true; + } + }; serializeInterceptor.execute(message); Assert.assertEquals(message.getRequestElements().getSerializedData(), "EntityBoundary{\"foo\":\"bar\"}ContentBoundary"); @@ -162,10 +166,12 @@ public void execute_uploadFileImageContent_exception() throws FMSException, IOEx message.getRequestElements().setEntity(attachable); message.getRequestElements().setObjectToSerialize(jaxbElement); - new Expectations(ImageIO.class) {{ - ImageIO.write((RenderedImage) any, anyString, (ByteArrayOutputStream) any); - result = new IOException("IOException thrown"); - }}; + new MockUp() { + @Mock + public boolean write(RenderedImage image, String formatName, OutputStream output) throws IOException { + throw new IOException("IOException thrown"); + } + }; serializeInterceptor.execute(message); Assert.assertEquals(message.getRequestElements().getSerializedData(), "EntityBoundary{\"foo\":\"bar\"}ContentBoundary"); From ba0fbd7f1e1eca02d56931ccfe1d1111017f09f2 Mon Sep 17 00:00:00 2001 From: Christina Ho Date: Tue, 29 Oct 2019 11:42:20 -0600 Subject: [PATCH 3/3] remove mock usage as jdk9 doesnt like it --- .../SerializeInterceptorTest.java | 63 +++++-------------- 1 file changed, 15 insertions(+), 48 deletions(-) diff --git a/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/SerializeInterceptorTest.java b/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/SerializeInterceptorTest.java index 7f27511f..377abf88 100644 --- a/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/SerializeInterceptorTest.java +++ b/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/SerializeInterceptorTest.java @@ -4,8 +4,6 @@ import com.intuit.ipp.exception.FMSException; import com.intuit.ipp.util.Config; -import mockit.Mock; -import mockit.MockUp; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeTest; @@ -16,11 +14,12 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.namespace.QName; -import java.awt.image.RenderedImage; +import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; + import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -131,48 +130,23 @@ public void execute_uploadFileImageContent() throws FMSException, IOException { requestParams.put(REQ_PARAM_METHOD_TYPE, "POST"); message.getRequestElements().setRequestParameters(requestParams); - InputStream mockedStream = new ByteArrayInputStream("test data".getBytes()); - setTestUploadRequestElements(mockedStream); - - Attachable attachable = new Attachable(); - attachable.setContentType("something/jpeg"); - message.getRequestElements().setEntity(attachable); - message.getRequestElements().setObjectToSerialize(jaxbElement); - - new MockUp() { - @Mock - public boolean write(RenderedImage image, String formatName, OutputStream output) { - return true; - } - }; - - serializeInterceptor.execute(message); - Assert.assertEquals(message.getRequestElements().getSerializedData(), "EntityBoundary{\"foo\":\"bar\"}ContentBoundary"); - } - - @Test(description = "Given a POST request with image file upload, " + - "an exception thrown when an internal IO error occurs", - expectedExceptions = FMSException.class - ) - public void execute_uploadFileImageContent_exception() throws FMSException, IOException { - requestParams.put(REQ_PARAM_METHOD_TYPE, "POST"); - message.getRequestElements().setRequestParameters(requestParams); + // Generate an image byte array + BufferedImage image = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ImageIO.write(image, "jpg", baos); + InputStream mockedStream = new ByteArrayInputStream(baos.toByteArray()); - InputStream mockedStream = new ByteArrayInputStream("test data".getBytes()); - setTestUploadRequestElements(mockedStream); + // set message request elements + message.getRequestElements().setAction("upload"); + message.getRequestElements().getUploadRequestElements().setDocContent(mockedStream); + message.getRequestElements().getUploadRequestElements().setBoundaryForContent("ContentBoundary"); + message.getRequestElements().getUploadRequestElements().setBoundaryForEntity("EntityBoundary"); Attachable attachable = new Attachable(); attachable.setContentType("something/jpeg"); message.getRequestElements().setEntity(attachable); message.getRequestElements().setObjectToSerialize(jaxbElement); - new MockUp() { - @Mock - public boolean write(RenderedImage image, String formatName, OutputStream output) throws IOException { - throw new IOException("IOException thrown"); - } - }; - serializeInterceptor.execute(message); Assert.assertEquals(message.getRequestElements().getSerializedData(), "EntityBoundary{\"foo\":\"bar\"}ContentBoundary"); } @@ -180,19 +154,11 @@ public boolean write(RenderedImage image, String formatName, OutputStream output @Test(description = "Serialization request format returned should be of " + "the form: message.request.serialization") public void getSerializationRequestFormat() { - SerializeInterceptor interceptor = new SerializeInterceptor(); - assertTrue(interceptor + assertTrue(serializeInterceptor .getSerializationRequestFormat() .equalsIgnoreCase(Config.getProperty(SERIALIZATION_REQUEST_FORMAT))); } - private void setTestUploadRequestElements(InputStream docContent) { - message.getRequestElements().setAction("upload"); - message.getRequestElements().getUploadRequestElements().setDocContent(docContent); - message.getRequestElements().getUploadRequestElements().setBoundaryForContent("ContentBoundary"); - message.getRequestElements().getUploadRequestElements().setBoundaryForEntity("EntityBoundary"); - } - @XmlRootElement class TestJson { @@ -207,4 +173,5 @@ public void setFoo(String foo) { this.foo = foo; } } + } \ No newline at end of file