You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by bf...@apache.org on 2014/02/20 20:17:26 UTC
[20/50] [abbrv] Nvp and rest refactoring and more tests
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/510972ab/utils/test/com/cloud/utils/rest/RESTServiceConnectorTest.java
----------------------------------------------------------------------
diff --git a/utils/test/com/cloud/utils/rest/RESTServiceConnectorTest.java b/utils/test/com/cloud/utils/rest/RESTServiceConnectorTest.java
new file mode 100644
index 0000000..d406f94
--- /dev/null
+++ b/utils/test/com/cloud/utils/rest/RESTServiceConnectorTest.java
@@ -0,0 +1,373 @@
+package com.cloud.utils.rest;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.util.Collections;
+//import java.util.List;
+
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpException;
+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.apache.commons.httpclient.params.HttpClientParams;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RESTServiceConnectorTest {
+ protected static final String UUID = "aaaa";
+ protected static final String UUID2 = "bbbb";
+ protected static final String SCHEMA = "myTestSchema";
+ protected static final String SCHEMA2 = "myTestSchema2";
+ protected static final String HREF = "myTestHref";
+ protected static final String HREF2 = "myTestHref2";
+ protected static final String DISPLAY_NAME = "myTestName";
+ protected static final String UUID_JSON_RESPONSE = "{\"uuid\" : \"aaaa\"}";
+ protected static final String SEC_PROFILE_JSON_RESPONSE =
+ "{\"uuid\" : \"aaaa\","
+ + "\"display_name\" : \"myTestName\","
+ + "\"href\" : \"myTestHref\","
+ + "\"schema\" : \"myTestSchema\"}";
+
+ protected static final String SEC_PROFILE_LIST_JSON_RESPONSE = "{\"results\" : [{\"uuid\" : \"aaaa\","
+ + "\"display_name\" : \"myTestName\","
+ + "\"href\" : \"myTestHref\","
+ + "\"schema\" : \"myTestSchema\"},"
+ + "{ \"uuid\" : \"bbbb\","
+ + "\"display_name\" : \"myTestName2\","
+ + "\"href\" : \"myTestHref2\","
+ + "\"schema\" : \"myTestSchema2\"}],"
+ + "\"result_count\": 2}";
+
+ RESTServiceConnector connector;
+ HttpClient client = mock(HttpClient.class);
+ HttpMethod method;
+ String type;
+ String uri;
+
+ @Before
+ public void setUp() {
+ final HttpClientParams hmp = mock(HttpClientParams.class);
+ when(client.getParams()).thenReturn(hmp);
+ connector = new RESTServiceConnector(null) {
+ @Override
+ public HttpClient createHttpClient() {
+ return client;
+ }
+
+ @Override
+ public HttpMethod createMethod(final String newType, final String newUri) {
+ type = newType;
+ uri = newUri;
+ return method;
+ }
+ };
+
+ connector.validation = new RESTValidationStrategy();
+ connector.setAdminCredentials("admin", "adminpass");
+ connector.setControllerAddress("localhost");
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteLoginWithoutHostname() throws CloudstackRESTException {
+ connector.setControllerAddress(null);
+ connector.validation.login(RESTServiceConnector.protocol, client);
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteLoginWithoutCredentials() throws CloudstackRESTException {
+ method = mock(PutMethod.class);
+ connector.setAdminCredentials(null, null);
+ connector.validation.login(RESTServiceConnector.protocol, client);
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteUpdateObjectWithoutHostname() throws CloudstackRESTException {
+ method = mock(PutMethod.class);
+ connector.setControllerAddress(null);
+ connector.executeUpdateObject(new String(), "/", Collections.<String, String> emptyMap());
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteUpdateObjectWithoutCredentials() throws CloudstackRESTException {
+ method = mock(PutMethod.class);
+ connector.setAdminCredentials(null, null);
+ connector.executeUpdateObject(new String(), "/", Collections.<String, String> emptyMap());
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteCreateObjectWithoutHostname() throws CloudstackRESTException {
+ method = mock(PostMethod.class);
+ connector.setControllerAddress(null);
+ connector.executeCreateObject(new String(), String.class, "/", Collections.<String, String> emptyMap());
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteCreateObjectWithoutCredentials() throws CloudstackRESTException {
+ method = mock(PostMethod.class);
+ connector.setAdminCredentials(null, null);
+ connector.executeCreateObject(new String(), String.class, "/", Collections.<String, String> emptyMap());
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteDeleteObjectWithoutHostname() throws CloudstackRESTException {
+ method = mock(DeleteMethod.class);
+ connector.setControllerAddress(null);
+ connector.executeDeleteObject("/");
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteDeleteObjectWithoutCredentials() throws CloudstackRESTException {
+ method = mock(DeleteMethod.class);
+ connector.setAdminCredentials(null, null);
+ connector.executeDeleteObject("/");
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteRetrieveObjectWithoutHostname() throws CloudstackRESTException {
+ method = mock(GetMethod.class);
+ connector.setControllerAddress(null);
+ connector.executeRetrieveObject(String.class, "/", Collections.<String, String> emptyMap());
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteRetrieveObjectWithoutCredentials() throws CloudstackRESTException {
+ method = mock(GetMethod.class);
+ connector.setAdminCredentials(null, null);
+ connector.executeRetrieveObject(String.class, "/", Collections.<String, String> emptyMap());
+ }
+
+ @Test
+ public void testExecuteMethod() throws CloudstackRESTException {
+ final GetMethod gm = mock(GetMethod.class);
+
+ when(gm.getStatusCode()).thenReturn(HttpStatus.SC_OK);
+ connector.executeMethod(gm);
+ verify(gm, times(1)).getStatusCode();
+ }
+
+ /* Bit of a roundabout way to ensure that login is called after an un authorized result
+ * It not possible to properly mock login()
+ */
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteMethodWithLogin() throws CloudstackRESTException, HttpException, IOException {
+ final GetMethod gm = mock(GetMethod.class);
+ when(client.executeMethod((HttpMethod)any())).thenThrow(new HttpException());
+ when(gm.getStatusCode()).thenReturn(HttpStatus.SC_UNAUTHORIZED).thenReturn(HttpStatus.SC_UNAUTHORIZED);
+ connector.executeMethod(gm);
+ verify(gm, times(1)).getStatusCode();
+ }
+
+ @Test
+ public void testExecuteCreateObject() throws CloudstackRESTException, IOException {
+ JsonEntity ls = new JsonEntity();
+ method = mock(PostMethod.class);
+ when(method.getStatusCode()).thenReturn(HttpStatus.SC_CREATED);
+ when(method.getResponseBodyAsString()).thenReturn(UUID_JSON_RESPONSE);
+ ls = connector.executeCreateObject(ls, JsonEntity.class, "/", Collections.<String, String> emptyMap());
+ assertTrue(UUID.equals(ls.getUuid()));
+ verify(method, times(1)).releaseConnection();
+
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteCreateObjectFailure() throws CloudstackRESTException, IOException {
+ JsonEntity ls = new JsonEntity();
+ method = mock(PostMethod.class);
+ when(method.getStatusCode()).thenReturn(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+ final Header header = mock(Header.class);
+ when(header.getValue()).thenReturn("text/html");
+ when(method.getResponseHeader("Content-Type")).thenReturn(header);
+ when(method.getResponseBodyAsString()).thenReturn("Off to timbuktu, won't be back later.");
+ when(method.isRequestSent()).thenReturn(true);
+ try {
+ ls = connector.executeCreateObject(ls, JsonEntity.class, "/", Collections.<String, String> emptyMap());
+ } finally {
+ verify(method, times(1)).releaseConnection();
+ }
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteCreateObjectException() throws CloudstackRESTException, IOException {
+ JsonEntity ls = new JsonEntity();
+ when(client.executeMethod((HttpMethod)any())).thenThrow(new HttpException());
+ method = mock(PostMethod.class);
+ when(method.getStatusCode()).thenReturn(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+ final Header header = mock(Header.class);
+ when(header.getValue()).thenReturn("text/html");
+ when(method.getResponseHeader("Content-Type")).thenReturn(header);
+ when(method.getResponseBodyAsString()).thenReturn("Off to timbuktu, won't be back later.");
+ try {
+ ls = connector.executeCreateObject(ls, JsonEntity.class, "/", Collections.<String, String> emptyMap());
+ } finally {
+ verify(method, times(1)).releaseConnection();
+ }
+ }
+
+ @Test
+ public void testExecuteUpdateObject() throws CloudstackRESTException, IOException {
+ final JsonEntity ls = new JsonEntity();
+ method = mock(PutMethod.class);
+ when(method.getStatusCode()).thenReturn(HttpStatus.SC_OK);
+ connector.executeUpdateObject(ls, "/", Collections.<String, String> emptyMap());
+ verify(method, times(1)).releaseConnection();
+ verify(client, times(1)).executeMethod(method);
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteUpdateObjectFailure() throws CloudstackRESTException, IOException {
+ final JsonEntity ls = new JsonEntity();
+ method = mock(PutMethod.class);
+ when(method.getStatusCode()).thenReturn(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+ final Header header = mock(Header.class);
+ when(header.getValue()).thenReturn("text/html");
+ when(method.getResponseHeader("Content-Type")).thenReturn(header);
+ when(method.getResponseBodyAsString()).thenReturn("Off to timbuktu, won't be back later.");
+ when(method.isRequestSent()).thenReturn(true);
+ try {
+ connector.executeUpdateObject(ls, "/", Collections.<String, String> emptyMap());
+ } finally {
+ verify(method, times(1)).releaseConnection();
+ }
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteUpdateObjectException() throws CloudstackRESTException, IOException {
+ final JsonEntity ls = new JsonEntity();
+ method = mock(PutMethod.class);
+ when(method.getStatusCode()).thenReturn(HttpStatus.SC_OK);
+ when(client.executeMethod((HttpMethod)any())).thenThrow(new IOException());
+ try {
+ connector.executeUpdateObject(ls, "/", Collections.<String, String> emptyMap());
+ } finally {
+ verify(method, times(1)).releaseConnection();
+ }
+ }
+
+ @Test
+ public void testExecuteDeleteObject() throws CloudstackRESTException, IOException {
+ method = mock(DeleteMethod.class);
+ when(method.getStatusCode()).thenReturn(HttpStatus.SC_NO_CONTENT);
+ connector.executeDeleteObject("/");
+ verify(method, times(1)).releaseConnection();
+ verify(client, times(1)).executeMethod(method);
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteDeleteObjectFailure() throws CloudstackRESTException, IOException {
+ method = mock(DeleteMethod.class);
+ when(method.getStatusCode()).thenReturn(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+ final Header header = mock(Header.class);
+ when(header.getValue()).thenReturn("text/html");
+ when(method.getResponseHeader("Content-Type")).thenReturn(header);
+ when(method.getResponseBodyAsString()).thenReturn("Off to timbuktu, won't be back later.");
+ when(method.isRequestSent()).thenReturn(true);
+ try {
+ connector.executeDeleteObject("/");
+ } finally {
+ verify(method, times(1)).releaseConnection();
+ }
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteDeleteObjectException() throws CloudstackRESTException, IOException {
+ method = mock(DeleteMethod.class);
+ when(method.getStatusCode()).thenReturn(HttpStatus.SC_NO_CONTENT);
+ when(client.executeMethod((HttpMethod)any())).thenThrow(new HttpException());
+ try {
+ connector.executeDeleteObject("/");
+ } finally {
+ verify(method, times(1)).releaseConnection();
+ }
+ }
+
+ @Test
+ public void testExecuteRetrieveObject() throws CloudstackRESTException, IOException {
+ method = mock(GetMethod.class);
+ when(method.getStatusCode()).thenReturn(HttpStatus.SC_OK);
+ when(method.getResponseBodyAsString()).thenReturn(UUID_JSON_RESPONSE);
+ connector.executeRetrieveObject(JsonEntity.class, "/", Collections.<String, String> emptyMap());
+ verify(method, times(1)).releaseConnection();
+ verify(client, times(1)).executeMethod(method);
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteRetrieveObjectFailure() throws CloudstackRESTException, IOException {
+ method = mock(GetMethod.class);
+ when(method.getStatusCode()).thenReturn(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+ when(method.getResponseBodyAsString()).thenReturn(UUID_JSON_RESPONSE);
+ final Header header = mock(Header.class);
+ when(header.getValue()).thenReturn("text/html");
+ when(method.getResponseHeader("Content-Type")).thenReturn(header);
+ when(method.getResponseBodyAsString()).thenReturn("Off to timbuktu, won't be back later.");
+ when(method.isRequestSent()).thenReturn(true);
+ try {
+ connector.executeRetrieveObject(JsonEntity.class, "/", Collections.<String, String> emptyMap());
+ } finally {
+ verify(method, times(1)).releaseConnection();
+ }
+ }
+
+ @Test(expected = CloudstackRESTException.class)
+ public void testExecuteRetrieveObjectException() throws CloudstackRESTException, IOException {
+ method = mock(GetMethod.class);
+ when(method.getStatusCode()).thenReturn(HttpStatus.SC_OK);
+ when(method.getResponseBodyAsString()).thenReturn(UUID_JSON_RESPONSE);
+ when(client.executeMethod((HttpMethod)any())).thenThrow(new HttpException());
+ try {
+ connector.executeRetrieveObject(JsonEntity.class, "/", Collections.<String, String> emptyMap());
+ } finally {
+ verify(method, times(1)).releaseConnection();
+ }
+ }
+
+}
+
+class JsonEntity {
+ private String displayName;
+ private String uuid;
+ private String href;
+ private String schema;
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(final String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(final String uuid) {
+ this.uuid = uuid;
+ }
+
+ public String getHref() {
+ return href;
+ }
+
+ public void setHref(final String href) {
+ this.href = href;
+ }
+
+ public String getSchema() {
+ return schema;
+ }
+
+ public void setSchema(final String schema) {
+ this.schema = schema;
+ }
+}
\ No newline at end of file