/* * 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.usergrid.chop.webapp; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.GenericType; import com.sun.jersey.multipart.FormDataBodyPart; import com.sun.jersey.multipart.FormDataMultiPart; import org.apache.commons.lang.RandomStringUtils; import org.apache.usergrid.chop.api.BaseResult; import org.apache.usergrid.chop.api.RestParams; import org.apache.usergrid.chop.api.Runner; import org.apache.usergrid.chop.api.RunnerBuilder; import org.apache.usergrid.chop.webapp.coordinator.rest.*; import org.safehaus.jettyjam.utils.TestParams; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.io.File; import java.io.FileInputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import static junit.framework.TestCase.*; /** * Common tests run in unit and test mode. */ class ChopUiTestUtils { private final static Map<String, String> WRONG_USER_PARAMS = new HashMap<String, String>() { { put( "user", "user" ); put( "pwd", "foo" ); } }; private final static Map<String, String> QUERY_PARAMS = new HashMap<String, String>() { { put( RestParams.USERNAME, "user" ); put( RestParams.PASSWORD, "pass" ); put( RestParams.COMMIT_ID, UUID.randomUUID().toString() ); put( RestParams.MODULE_VERSION, "2.0.0-SNAPSHOT" ); put( RestParams.MODULE_ARTIFACTID, "chop-example" ); put( RestParams.MODULE_GROUPID, "org.apache.usergrid.chop" ); put( RestParams.VCS_REPO_URL, "git@github.com:usergrid/usergrid.git" ); put( RestParams.TEST_PACKAGE, "org.apache.usergrid.chop.example" ); } }; static void testRunManagerNext( TestParams testParams ) { Integer next = testParams.addQueryParameters( QUERY_PARAMS ) .setEndpoint( RunManagerResource.ENDPOINT ) .newWebResource() .path( "/next" ) .type( MediaType.APPLICATION_JSON_TYPE ) .accept( MediaType.APPLICATION_JSON ) .get( Integer.class ); assertEquals( 1, next.intValue() ); } static void testRunnerRegistryList(TestParams testParams) { List<Runner> runnerList = testParams.addQueryParameters(QUERY_PARAMS) .setEndpoint(RunnerRegistryResource.ENDPOINT) .newWebResource() .path("/list") .type(MediaType.APPLICATION_JSON_TYPE) .accept(MediaType.APPLICATION_JSON_TYPE) .get(new GenericType<List<Runner>>() { }); assertNotNull(runnerList); assertEquals(0, runnerList.size()); } static void testRunnerRegistryUnregister(TestParams testParams) { Boolean result = testParams.addQueryParameters(QUERY_PARAMS) .setEndpoint(RunnerRegistryResource.ENDPOINT) .newWebResource() .path("/unregister") .accept(MediaType.APPLICATION_JSON_TYPE) .post(Boolean.class); assertFalse(result); } static void testRunnerRegistryRegister(TestParams testParams) { /* * Even though in test mode the runner is not used, a runner must * be sent over because the method is expecting the Runner as JSON. */ RunnerBuilder builder = new RunnerBuilder(); builder.setTempDir(".") .setServerPort(19023) .setUrl("https://localhost:19023") .setHostname("foobar") .setIpv4Address("127.0.0.1"); Boolean result = testParams.addQueryParameters(QUERY_PARAMS) .setEndpoint(RunnerRegistryResource.ENDPOINT) .newWebResource() .path("/register") .type(MediaType.APPLICATION_JSON_TYPE) .accept(MediaType.APPLICATION_JSON_TYPE) .post(Boolean.class, builder.getRunner()); assertFalse(result); } static void testRunnerRegistrySequence(TestParams testParams) { /* * ------------------------------------------------------------ * Let's register a runner first before we query for it * ------------------------------------------------------------ */ String commitId = UUID.randomUUID().toString(); String hostname = RandomStringUtils.randomAlphabetic(8); RunnerBuilder builder = new RunnerBuilder(); builder.setTempDir(".") .setServerPort(19023) .setUrl("https://localhost:19023") .setHostname(hostname) .setIpv4Address("127.0.0.1"); Boolean result = testParams.addQueryParameters(QUERY_PARAMS) .setEndpoint(RunnerRegistryResource.ENDPOINT) .newWebResource(null) .queryParam(RestParams.COMMIT_ID, commitId) .path("/register") .type(MediaType.APPLICATION_JSON_TYPE) .accept(MediaType.APPLICATION_JSON_TYPE) .post(Boolean.class, builder.getRunner()); assertTrue(result); /* * ------------------------------------------------------------ * Let's see if we can get the runner back from the registry * ------------------------------------------------------------ */ List<Runner> runnerList = testParams .setEndpoint(RunnerRegistryResource.ENDPOINT) .newWebResource(null) .queryParam(RestParams.COMMIT_ID, commitId) .path("/list") .type(MediaType.APPLICATION_JSON_TYPE) .accept(MediaType.APPLICATION_JSON_TYPE) .get(new GenericType<List<Runner>>() { }); assertNotNull(runnerList); assertEquals(1, runnerList.size()); Runner runner = runnerList.get(0); assertEquals(19023, runner.getServerPort()); assertEquals("https://localhost:19023", runner.getUrl()); assertEquals(hostname, runner.getHostname()); assertEquals("127.0.0.1", runner.getIpv4Address()); assertEquals(".", runner.getTempDir()); /* * ------------------------------------------------------------ * Let's unregister the runner from the registry and check * ------------------------------------------------------------ */ result = testParams .newWebResource(null) .queryParam(RestParams.RUNNER_URL, runner.getUrl()) .path("/unregister") .type(MediaType.APPLICATION_JSON_TYPE) .accept(MediaType.APPLICATION_JSON_TYPE) .post(Boolean.class); assertTrue(result); /* * ------------------------------------------------------------ * Let's make sure we do NOT get the runner from the registry * ------------------------------------------------------------ */ runnerList.clear(); runnerList = testParams .setEndpoint(RunnerRegistryResource.ENDPOINT) .newWebResource(null) .queryParam(RestParams.COMMIT_ID, commitId) .path("/list") .type(MediaType.APPLICATION_JSON_TYPE) .accept(MediaType.APPLICATION_JSON_TYPE) .get(new GenericType<List<Runner>>() { }); assertNotNull(runnerList); assertEquals(0, runnerList.size()); } static void testSetup(TestParams testParams) { ClientResponse response = testParams.addQueryParameters(QUERY_PARAMS) .setEndpoint(SetupResource.ENDPOINT) .newWebResource() .queryParam(RestParams.RUNNER_COUNT, "5") .path("/stack") .type(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON) .post(ClientResponse.class); assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus()); assertEquals("\"JarNotFound\"", response.getEntity(String.class)); } static void testDestroy( TestParams testParams ) { ClientResponse response = testParams.addQueryParameters( QUERY_PARAMS ) .setEndpoint( DestroyResource.ENDPOINT ) .newWebResource() .path( "/stack" ) .type( MediaType.APPLICATION_JSON ) .accept( MediaType.APPLICATION_JSON ) .post( ClientResponse.class ); assertEquals( Response.Status.CREATED.getStatusCode(), response.getStatus() ); assertEquals( "\"JarNotFound\"", response.getEntity( String.class ) ); } static void testStart(TestParams testParams) { BaseResult result = testParams .setEndpoint(StartResource.ENDPOINT) .newWebResource() .accept(MediaType.APPLICATION_JSON) .post(BaseResult.class); assertEquals(result.getEndpoint(), StartResource.ENDPOINT); } static void testReset(TestParams testParams) { BaseResult result = testParams .setEndpoint(ResetResource.ENDPOINT) .newWebResource() .accept(MediaType.APPLICATION_JSON) .post(BaseResult.class); assertEquals(result.getEndpoint(), ResetResource.ENDPOINT); } static void testStop(TestParams testParams) { BaseResult result = testParams .setEndpoint(StopResource.ENDPOINT) .newWebResource() .accept(MediaType.APPLICATION_JSON) .post(BaseResult.class); assertEquals(result.getEndpoint(), StopResource.ENDPOINT); } static void testUpload(TestParams testParams) throws Exception { FormDataMultiPart part = new FormDataMultiPart(); part.field( RestParams.COMMIT_ID, QUERY_PARAMS.get( RestParams.COMMIT_ID ) ); part.field( RestParams.MODULE_GROUPID, QUERY_PARAMS.get( RestParams.MODULE_GROUPID ) ); part.field( RestParams.MODULE_ARTIFACTID, QUERY_PARAMS.get( RestParams.MODULE_ARTIFACTID ) ); part.field( RestParams.MODULE_VERSION, QUERY_PARAMS.get( RestParams.MODULE_VERSION ) ); part.field( RestParams.USERNAME, QUERY_PARAMS.get( RestParams.USERNAME ) ); part.field( RestParams.VCS_REPO_URL, "ssh://git@stash.safehaus.org:7999/chop/main.git" ); part.field( RestParams.TEST_PACKAGE, QUERY_PARAMS.get( RestParams.TEST_PACKAGE ) ); part.field( RestParams.MD5, "d7d4829506f6cb8c0ab2da9cb1daca02" ); File tmpFile = File.createTempFile("runner", "jar"); FileInputStream in = new FileInputStream( tmpFile ); FormDataBodyPart body = new FormDataBodyPart( RestParams.CONTENT, in, MediaType.APPLICATION_OCTET_STREAM_TYPE ); part.bodyPart( body ); ClientResponse response = testParams.addQueryParameters( QUERY_PARAMS ) .setEndpoint( UploadResource.ENDPOINT ) .newWebResource() .path( "/runner" ) .type( MediaType.MULTIPART_FORM_DATA ) .accept( MediaType.TEXT_PLAIN ) .post( ClientResponse.class, part ); assertEquals( Response.Status.CREATED.getStatusCode(), response.getStatus() ); assertEquals( UploadResource.SUCCESSFUL_TEST_MESSAGE, response.getEntity( String.class ) ); tmpFile.delete(); } static void testStoreResults( TestParams testParams ) throws Exception { FormDataMultiPart part = new FormDataMultiPart(); File tmpFile = File.createTempFile("results", "tmp"); FileInputStream in = new FileInputStream( tmpFile ); FormDataBodyPart body = new FormDataBodyPart( RestParams.CONTENT, in, MediaType.APPLICATION_OCTET_STREAM_TYPE ); part.bodyPart( body ); ClientResponse response = testParams.addQueryParameters( QUERY_PARAMS ) .setEndpoint( RunManagerResource.ENDPOINT ) .newWebResource() .queryParam( RestParams.RUNNER_HOSTNAME, "localhost" ) .queryParam( RestParams.RUN_ID, "112316437" ) .queryParam( RestParams.RUN_NUMBER, "3" ) .path( "/store" ) .type( MediaType.MULTIPART_FORM_DATA_TYPE ) .accept( MediaType.APPLICATION_JSON ) .post( ClientResponse.class, part ); tmpFile.delete(); assertEquals( Response.Status.CREATED.getStatusCode(), response.getStatus() ); assertEquals( UploadResource.SUCCESSFUL_TEST_MESSAGE, response.getEntity( String.class ) ); } static void testRunCompleted( TestParams testParams ) { ClientResponse response = testParams.addQueryParameters( QUERY_PARAMS ) .setEndpoint( RunManagerResource.ENDPOINT ) .newWebResource() .queryParam( RestParams.RUNNER_HOSTNAME, "localhost" ) .queryParam( RestParams.RUN_NUMBER, "1" ) .queryParam( RestParams.TEST_CLASS, "org.apache.usergrid.chop.example.MechanicalWatchTest" ) .path( "/completed" ) .type( MediaType.APPLICATION_JSON ) .accept( MediaType.APPLICATION_JSON ) .get( ClientResponse.class ); assertEquals( Response.Status.CREATED.getStatusCode(), response.getStatus() ); assertEquals( Boolean.TRUE, response.getEntity( Boolean.class ) ); } static void testGet(TestParams testParams) { String result = testParams .setEndpoint(TestGetResource.ENDPOINT_URL) .newWebResource() .accept(MediaType.TEXT_PLAIN) .get(String.class); assertEquals(TestGetResource.TEST_MESSAGE, result); } static void testAuthGet(TestParams testParams) { String result = testParams.addQueryParameters(QUERY_PARAMS) .setEndpoint(AuthResource.ENDPOINT_URL) .newWebResource() .accept(MediaType.APPLICATION_JSON) .get(String.class); assertEquals(AuthResource.GET_MESSAGE, result); } static void testAuthPost(TestParams testParams) { String result = testParams.addQueryParameters(QUERY_PARAMS) .setEndpoint(AuthResource.ENDPOINT_URL) .newWebResource() .accept(MediaType.APPLICATION_JSON) .post(String.class); assertEquals(AuthResource.POST_MESSAGE, result); } static void testAuthGetWithWrongCredentials(TestParams testParams) { testParams.addQueryParameters(WRONG_USER_PARAMS) .setEndpoint(AuthResource.ENDPOINT_URL) .newWebResource() .accept(MediaType.APPLICATION_JSON) .get(String.class); } static void testAuthPostWithAllowedRole(TestParams testParams) { String result = testParams.addQueryParameters(QUERY_PARAMS) .setEndpoint(AuthResource.ENDPOINT_URL + AuthResource.ALLOWED_ROLE_PATH) .newWebResource() .accept(MediaType.APPLICATION_JSON) .post(String.class); assertEquals(AuthResource.POST_WITH_ALLOWED_ROLE_MESSAGE, result); } static void testAuthPostWithWrongCredentials(TestParams testParams) { testParams.addQueryParameters(WRONG_USER_PARAMS) .setEndpoint(AuthResource.ENDPOINT_URL) .newWebResource() .accept(MediaType.APPLICATION_JSON) .post(String.class); } static void testAuthPostWithUnallowedRole(TestParams testParams) { testParams.addQueryParameters(QUERY_PARAMS) .setEndpoint(AuthResource.ENDPOINT_URL + AuthResource.UNALLOWED_ROLE_PATH) .newWebResource() .accept(MediaType.APPLICATION_JSON) .post(String.class); } static void testAuthGetWithAllowedRole(TestParams testParams) { String result = testParams.addQueryParameters(QUERY_PARAMS) .setEndpoint(AuthResource.ENDPOINT_URL + AuthResource.ALLOWED_ROLE_PATH) .newWebResource() .accept(MediaType.APPLICATION_JSON) .get(String.class); assertEquals(AuthResource.GET_WITH_ALLOWED_ROLE_MESSAGE, result); } static void testAuthGetWithUnallowedRole(TestParams testParams) { testParams.addQueryParameters(QUERY_PARAMS) .setEndpoint(AuthResource.ENDPOINT_URL + AuthResource.UNALLOWED_ROLE_PATH) .newWebResource() .accept(MediaType.APPLICATION_JSON) .get(String.class); } }