/* * Copyright 2011 JBoss Inc * * Licensed 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.jbpm.formbuilder.server.file; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.bind.JAXBException; import junit.framework.TestCase; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.methods.DeleteMethod; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.PutMethod; import org.easymock.EasyMock; import org.jbpm.formbuilder.server.GuvnorHelper; import org.jbpm.formbuilder.server.mock.MockAnswer; import org.jbpm.formbuilder.server.mock.MockDeleteMethod; import org.jbpm.formbuilder.server.mock.MockGetMethod; import org.jbpm.formbuilder.server.mock.MockPostMethod; import org.jbpm.formbuilder.server.mock.MockPutMethod; public class GuvnorFileServiceTest extends TestCase { public void testStoreFileOK() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); Map<String, Integer> statuses = new HashMap<String, Integer>(); statuses.put("GET http://www.redhat.com/rest/packages/somePackage/assets/fileName-upfile", 404); EasyMock.expect(client.executeMethod(EasyMock.isA(MockGetMethod.class))). andAnswer(new MockAnswer(statuses)).once(); EasyMock.expect(client.executeMethod(EasyMock.isA(MockPostMethod.class))).andReturn(201).once(); service.getHelper().setClient(client); EasyMock.replay(client); String url = service.storeFile("somePackage", "fileName.txt", new byte[] { 1,2,3,4,5,6,7,8,9 } ); EasyMock.verify(client); assertNotNull("url shouldn't be null", url); } public void testStoreFileOKForUpdate() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); Map<String, Integer> statuses = new HashMap<String, Integer>(); statuses.put("GET http://www.redhat.com/rest/packages/somePackage/assets/fileName-upfile", 200); EasyMock.expect(client.executeMethod(EasyMock.isA(MockGetMethod.class))). andAnswer(new MockAnswer(statuses)).once(); EasyMock.expect(client.executeMethod(EasyMock.isA(MockPostMethod.class))).andReturn(201).once(); EasyMock.expect(client.executeMethod(EasyMock.isA(MockDeleteMethod.class))).andReturn(204).once(); service.getHelper().setClient(client); EasyMock.replay(client); String url = service.storeFile("somePackage", "fileName.txt", new byte[] { 1,2,3,4,5,6,7,8,9 } ); EasyMock.verify(client); assertNotNull("url shouldn't be null", url); } public void testStoreFileProblem() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); Map<String, Integer> statuses = new HashMap<String, Integer>(); statuses.put("GET http://www.redhat.com/rest/packages/somePackage/assets/fileName-upfile", 404); EasyMock.expect(client.executeMethod(EasyMock.isA(MockGetMethod.class))). andAnswer(new MockAnswer(statuses)).once(); IOException exception = new IOException("mock io error"); EasyMock.expect(client.executeMethod(EasyMock.isA(MockPostMethod.class))).andThrow(exception).once(); service.getHelper().setClient(client); EasyMock.replay(client); try { service.storeFile("somePackage", "fileName.txt", new byte[] { 1,2,3,4,5,6,7,8,9 } ); fail("storeFile(...) should not succeed"); } catch (FileException e) { assertNotNull("e shouldn't be null", e); Throwable cause = e.getCause(); assertNotNull("cause shouldn't be null", cause); assertTrue("cause should be of type IOException", cause instanceof IOException); } EasyMock.verify(client); } public void testStoreFileDeleteOlderProblem() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); IOException exception = new IOException("mock io error"); EasyMock.expect(client.executeMethod(EasyMock.isA(MockGetMethod.class))).andThrow(exception).once(); service.getHelper().setClient(client); EasyMock.replay(client); try { service.storeFile("somePackage", "fileName.txt", new byte[] { 1,2,3,4,5,6,7,8,9 } ); fail("storeFile(...) should not succeed"); } catch (FileException e) { assertNotNull("e shouldn't be null", e); Throwable cause = e.getCause(); assertNotNull("cause shouldn't be null", cause); Throwable cause2 = cause.getCause(); assertNotNull("cause2 shouldn't be null", cause2); assertTrue("cause2 should be of type IOException", cause2 instanceof IOException); } EasyMock.verify(client); } public void testDeleteFileOK() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); Map<String, Integer> statuses = new HashMap<String, Integer>(); statuses.put("DELETE http://www.redhat.com/rest/packages/somePackage/assets/fileName-upfile", 204); EasyMock.expect(client.executeMethod(EasyMock.isA(MockDeleteMethod.class))).andAnswer(new MockAnswer(statuses)).once(); service.getHelper().setClient(client); EasyMock.replay(client); service.deleteFile("somePackage", "fileName.txt"); EasyMock.verify(client); } public void testDeleteFileIOProblem() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); IOException exception = new IOException(); EasyMock.expect(client.executeMethod(EasyMock.isA(MockDeleteMethod.class))).andThrow(exception).once(); service.getHelper().setClient(client); EasyMock.replay(client); try { service.deleteFile("somePackage", "fileName.txt"); fail("storeFile(...) should not succeed"); } catch (FileException e) { assertNotNull("e shouldn't be null", e); Throwable cause = e.getCause(); assertNotNull("cause shouldn't be null", cause); assertTrue("cause should be of type IOException", cause instanceof IOException); } EasyMock.verify(client); } public void testDeleteFileUnknownProblem() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); NullPointerException exception = new NullPointerException(); EasyMock.expect(client.executeMethod(EasyMock.isA(MockDeleteMethod.class))).andThrow(exception).once(); service.getHelper().setClient(client); EasyMock.replay(client); try { service.deleteFile("somePackage", "fileName.txt"); fail("deleteFile(...) should not succeed"); } catch (FileException e) { assertNotNull("e shouldn't be null", e); Throwable cause = e.getCause(); assertNotNull("cause shouldn't be null", cause); assertTrue("cause should be of type NullPointerException", cause instanceof NullPointerException); } EasyMock.verify(client); } public void testLoadFilesByTypeOK() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); Map<String, String> responses = new HashMap<String, String>(); String props = "<?xml version=\"1.0\"?><assets><asset>" + "<binaryLink>http://www.redhat.com/rest/packages/somePackage/assets/asset1/binary</binaryLink>" + "<refLink>http://www.redhat.com/rest/packages/somePackage/assets/asset1</refLink>" + "<sourceLink>http://www.redhat.com/rest/packages/somePackage/assets/asset1/source</sourceLink>" + "<metadata><format>txt</format></metadata>" + "</asset></assets>"; responses.put("GET http://www.redhat.com/rest/packages/somePackage/assets/", props); EasyMock.expect(client.executeMethod(EasyMock.isA(MockGetMethod.class))). andAnswer(new MockAnswer(responses, new IllegalArgumentException("unexpected call"))).once(); service.getHelper().setClient(client); EasyMock.replay(client); List<String> files = service.loadFilesByType("somePackage", "txt"); EasyMock.verify(client); assertNotNull("files shouldn't be null", files); assertFalse("files shouldn't be empty", files.isEmpty()); } public void testLoadFilesByTypeNoneOfType() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); Map<String, String> responses = new HashMap<String, String>(); String props = "<?xml version=\"1.0\"?><assets><asset>" + "<binaryLink>http://www.redhat.com/rest/packages/somePackage/assets/asset1/binary</binaryLink>" + "<refLink>http://www.redhat.com/rest/packages/somePackage/assets/asset1</refLink>" + "<sourceLink>http://www.redhat.com/rest/packages/somePackage/assets/asset1/source</sourceLink>" + "<metadata><format>drg</format></metadata>" + "</asset></assets>"; responses.put("GET http://www.redhat.com/rest/packages/somePackage/assets/", props); EasyMock.expect(client.executeMethod(EasyMock.isA(MockGetMethod.class))). andAnswer(new MockAnswer(responses, new IllegalArgumentException("unexpected call"))).once(); service.getHelper().setClient(client); EasyMock.replay(client); List<String> files = service.loadFilesByType("somePackage", "txt"); EasyMock.verify(client); assertNotNull("files shouldn't be null", files); assertTrue("files should be empty", files.isEmpty()); } public void testLoadFilesByTypeNoTypeSpecified() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); Map<String, String> responses = new HashMap<String, String>(); String props = "<?xml version=\"1.0\"?><assets><asset>" + "<binaryLink>http://www.redhat.com/rest/packages/somePackage/assets/asset1/binary</binaryLink>" + "<refLink>http://www.redhat.com/rest/packages/somePackage/assets/asset1</refLink>" + "<sourceLink>http://www.redhat.com/rest/packages/somePackage/assets/asset1/source</sourceLink>" + "<metadata><format>drg</format></metadata>" + "</asset></assets>"; responses.put("GET http://www.redhat.com/rest/packages/somePackage/assets/", props); EasyMock.expect(client.executeMethod(EasyMock.isA(MockGetMethod.class))). andAnswer(new MockAnswer(responses, new IllegalArgumentException("unexpected call"))).once(); service.getHelper().setClient(client); EasyMock.replay(client); List<String> files = service.loadFilesByType("somePackage", ""); EasyMock.verify(client); assertNotNull("files shouldn't be null", files); assertFalse("files shouldn't be empty", files.isEmpty()); } public void testLoadFilesByTypeNoTypeSpecified2() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); Map<String, String> responses = new HashMap<String, String>(); String props = "<?xml version=\"1.0\"?><assets><asset>" + "<binaryLink>http://www.redhat.com/rest/packages/somePackage/assets/asset1/binary</binaryLink>" + "<refLink>http://www.redhat.com/rest/packages/somePackage/assets/asset1</refLink>" + "<sourceLink>http://www.redhat.com/rest/packages/somePackage/assets/asset1/source</sourceLink>" + "<metadata><format>drg</format></metadata>" + "</asset></assets>"; responses.put("GET http://www.redhat.com/rest/packages/somePackage/assets/", props); EasyMock.expect(client.executeMethod(EasyMock.isA(MockGetMethod.class))). andAnswer(new MockAnswer(responses, new IllegalArgumentException("unexpected call"))).once(); service.getHelper().setClient(client); EasyMock.replay(client); List<String> files = service.loadFilesByType("somePackage", null); EasyMock.verify(client); assertNotNull("files shouldn't be null", files); assertFalse("files shouldn't be empty", files.isEmpty()); } public void testLoadFilesByTypeEmpty() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); Map<String, String> responses = new HashMap<String, String>(); String props = "<?xml version=\"1.0\"?><assets></assets>"; responses.put("GET http://www.redhat.com/rest/packages/somePackage/assets/", props); EasyMock.expect(client.executeMethod(EasyMock.isA(MockGetMethod.class))). andAnswer(new MockAnswer(responses, new IllegalArgumentException("unexpected call"))).once(); service.getHelper().setClient(client); EasyMock.replay(client); List<String> files = service.loadFilesByType("somePackage", "txt"); EasyMock.verify(client); assertNotNull("files shouldn't be null", files); assertTrue("files should be empty", files.isEmpty()); } public void testLoadFilesByTypeIOProblem() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); IOException exception = new IOException("mock io error"); EasyMock.expect(client.executeMethod(EasyMock.isA(MockGetMethod.class))).andThrow(exception).once(); service.getHelper().setClient(client); EasyMock.replay(client); try { service.loadFilesByType("somePackage", "txt"); fail("loadFilesByType(...) shouldn't succeed"); } catch (FileException e) { assertNotNull("e shouldn't be null", e); Throwable cause = e.getCause(); assertNotNull("cause shouldn't be null", cause); assertTrue("cause should be of type IOException", cause instanceof IOException); } EasyMock.verify(client); } public void testLoadFilesByTypeJAXBProblem() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); Map<String, String> responses = new HashMap<String, String>(); String props = "<?xml version=\"1.0\"?><assets></assetsBROKENXMLWHATSHAPPENINGITOLDYOUBRO>"; responses.put("GET http://www.redhat.com/rest/packages/somePackage/assets/", props); EasyMock.expect(client.executeMethod(EasyMock.isA(MockGetMethod.class))). andAnswer(new MockAnswer(responses, new IllegalArgumentException("unexpected call"))).once(); service.getHelper().setClient(client); EasyMock.replay(client); try { service.loadFilesByType("somePackage", "txt"); fail("loadFilesByType(...) shouldn't succeed"); } catch (FileException e) { assertNotNull("e shouldn't be null", e); Throwable cause = e.getCause(); assertNotNull("cause shouldn't be null", cause); assertTrue("cause should be of type JAXBException", cause instanceof JAXBException); } EasyMock.verify(client); } public void testLoadFilesByTypeUnknownProblem() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); EasyMock.expect(client.executeMethod(EasyMock.isA(MockGetMethod.class))).andThrow(new NullPointerException()).once(); service.getHelper().setClient(client); EasyMock.replay(client); try { service.loadFilesByType("somePackage", "txt"); fail("loadFilesByType(...) shouldn't succeed"); } catch (FileException e) { assertNotNull("e shouldn't be null", e); Throwable cause = e.getCause(); assertNotNull("cause shouldn't be null", cause); assertTrue("cause should be of type NullPointerException", cause instanceof NullPointerException); } EasyMock.verify(client); } public void testLoadFileOK() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); Map<String, String> responses = new HashMap<String, String>(); String txt = "This is a test"; responses.put("GET http://www.redhat.com/rest/packages/somePackage/assets/someFile-upfile/source", txt); EasyMock.expect(client.executeMethod(EasyMock.isA(MockGetMethod.class))). andAnswer(new MockAnswer(responses, new IllegalArgumentException("unexpected call"))).once(); service.getHelper().setClient(client); EasyMock.replay(client); byte[] retval = service.loadFile("somePackage", "someFile.txt"); EasyMock.verify(client); assertNotNull("retval shouldn't be null", retval); assertEquals("retval and txt should be the same length", retval.length, txt.length()); for (int i = 0; i < retval.length; i++) { assertEquals("byte " + i + " should be the same in both arrays", txt.getBytes()[i], retval[i]); } } public void testLoadFileIOProblem() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); EasyMock.expect(client.executeMethod(EasyMock.isA(MockGetMethod.class))).andThrow(new IOException("mock io error")).once(); service.getHelper().setClient(client); EasyMock.replay(client); try { service.loadFile("somePackage", "someFile.txt"); fail("loadFile(...) shouldn't succeed"); } catch (FileException e) { assertNotNull("e shouldn't be null", e); Throwable cause = e.getCause(); assertNotNull("cause shouldn't be null", cause); assertTrue("cause should be of type NullPointerException", cause instanceof IOException); } EasyMock.verify(client); } public void testLoadFileUnknownProblem() throws Exception { GuvnorFileService service = createService("http://www.redhat.com", "user", "pass"); HttpClient client = EasyMock.createMock(HttpClient.class); EasyMock.expect(client.executeMethod(EasyMock.isA(MockGetMethod.class))).andThrow(new NullPointerException()).once(); service.getHelper().setClient(client); EasyMock.replay(client); try { service.loadFile("somePackage", "someFile.txt"); fail("loadFile(...) shouldn't succeed"); } catch (FileException e) { assertNotNull("e shouldn't be null", e); Throwable cause = e.getCause(); assertNotNull("cause shouldn't be null", cause); assertTrue("cause should be of type NullPointerException", cause instanceof NullPointerException); } EasyMock.verify(client); } private GuvnorFileService createService(String baseUrl, String user, String pass) { GuvnorFileService service = new GuvnorFileService(); service.setHelper(new GuvnorHelper(baseUrl, user, pass) { @Override public GetMethod createGetMethod(String url) { return new MockGetMethod(url); } @Override public PostMethod createPostMethod(String url) { return new MockPostMethod(url); } @Override public DeleteMethod createDeleteMethod(String url) { return new MockDeleteMethod(url); } @Override public PutMethod createPutMethod(String url) { return new MockPutMethod(url); } @Override public void setAuth(HttpClient client, HttpMethod method) { } }); return service; } }