Added /revokeToken and /revokeTokens resources to the rest test framework Fixed remaining tests in AccessTokenIT. Extended/fixed some bugs in NamedResource.
Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/d7734af9 Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/d7734af9 Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/d7734af9 Branch: refs/heads/two-dot-o-dev Commit: d7734af907e975baad4887d153db62c330efa2e6 Parents: a33ae23 Author: GERey <[email protected]> Authored: Mon Mar 23 11:12:33 2015 -0700 Committer: GERey <[email protected]> Committed: Mon Mar 23 11:12:33 2015 -0700 ---------------------------------------------------------------------- .../usergrid/rest/management/AccessTokenIT.java | 406 ++++++++----------- .../endpoints/NamedResource.java | 29 +- .../endpoints/mgmt/RevokeTokenResource.java | 16 + .../endpoints/mgmt/RevokeTokensResource.java | 33 ++ .../endpoints/mgmt/UserResource.java | 8 + 5 files changed, 254 insertions(+), 238 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/d7734af9/stack/rest/src/test/java/org/apache/usergrid/rest/management/AccessTokenIT.java ---------------------------------------------------------------------- diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/management/AccessTokenIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/management/AccessTokenIT.java index 2d7911d..a5adc0e 100644 --- a/stack/rest/src/test/java/org/apache/usergrid/rest/management/AccessTokenIT.java +++ b/stack/rest/src/test/java/org/apache/usergrid/rest/management/AccessTokenIT.java @@ -16,29 +16,25 @@ */ package org.apache.usergrid.rest.management; -import com.fasterxml.jackson.databind.JsonNode; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.UniformInterfaceException; -import com.sun.jersey.api.representation.Form; import java.io.IOException; -import java.util.HashMap; import java.util.Map; -import javax.ws.rs.core.MediaType; + +import org.junit.Test; + import org.apache.usergrid.rest.test.resource2point0.AbstractRestIT; -import org.apache.usergrid.rest.management.organizations.OrganizationsResource; import org.apache.usergrid.rest.test.resource2point0.model.ApiResponse; import org.apache.usergrid.rest.test.resource2point0.model.Entity; -import org.apache.usergrid.rest.test.resource2point0.model.Organization; import org.apache.usergrid.rest.test.resource2point0.model.QueryParameters; import org.apache.usergrid.rest.test.resource2point0.model.Token; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.UniformInterfaceException; +import com.sun.jersey.api.representation.Form; + import static org.apache.usergrid.utils.MapUtils.hashMap; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; - -import org.jclouds.rest.annotations.Api; -import org.junit.Ignore; -import org.junit.Test; +import static org.junit.Assert.fail; /** @@ -107,7 +103,7 @@ public class AccessTokenIT extends AbstractRestIT { queryParameters.addParam( "ttl", String.valueOf(ttl) ); return queryParameters; } - + @Test public void meToken() throws Exception { tokenMeSetup( 0 ); @@ -139,221 +135,171 @@ public class AccessTokenIT extends AbstractRestIT { assertNotNull(orgProperties.get("name")); assertNotNull(orgProperties.get("properties")); } -// -// @Test -// public void meTokenPost() throws Exception { -// Map<String, String> payload -// = hashMap("grant_type", "password") -// .map("username", "[email protected]").map("password", "test"); -// -// JsonNode node = mapper.readTree(resource() -// .path("/management/me") -// .accept(MediaType.APPLICATION_JSON) -// .type(MediaType.APPLICATION_JSON_TYPE) -// .post(String.class, payload)); -// -// logNode(node); -// String token = node.get("access_token").textValue(); -// -// assertNotNull(token); -// -// refreshIndex("test-organization", "test-app"); -// -// node = mapper.readTree(resource() -// .path("/management/me") -// .queryParam("access_token", token) -// .accept(MediaType.APPLICATION_JSON) -// .get(String.class)); -// logNode(node); -// } -// -// @Test -// public void meTokenPostForm() throws IOException { -// -// Form form = new Form(); -// form.add("grant_type", "password"); -// form.add("username", "[email protected]"); -// form.add("password", "test"); -// -// JsonNode node = mapper.readTree(resource() -// .path("/management/me") -// .accept(MediaType.APPLICATION_JSON) -// .type(MediaType.APPLICATION_FORM_URLENCODED_TYPE) -// .entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE) -// .post(String.class)); -// -// logNode(node); -// String token = node.get("access_token").textValue(); -// -// assertNotNull(token); -// -// refreshIndex("test-organization", "test-app"); -// -// node = mapper.readTree(resource() -// .path("/management/me") -// .queryParam("access_token", token) -// .accept(MediaType.APPLICATION_JSON).get(String.class)); -// logNode(node); -// } -// -// @Test -// public void ttlNan() throws Exception { -// -// Map<String, String> payload = hashMap("grant_type", "password") -// .map("username", "[email protected]") -// .map("password", "test") -// .map("ttl", "derp"); -// -// ClientResponse.Status responseStatus = null; -// try { -// resource().path("/management/token") -// .accept(MediaType.APPLICATION_JSON) -// .type(MediaType.APPLICATION_JSON_TYPE) -// .post(String.class, payload); -// } catch (UniformInterfaceException uie) { -// responseStatus = uie.getResponse().getClientResponseStatus(); -// } -// -// assertEquals(ClientResponse.Status.BAD_REQUEST, responseStatus); -// } -// -// @Test -// public void ttlOverMax() throws Exception { -// -// Map<String, String> payload = hashMap("grant_type", "password") -// .map("username", "[email protected]") -// .map("password", "test") -// .map("ttl", Long.MAX_VALUE + ""); -// -// ClientResponse.Status responseStatus = null; -// -// try { -// resource().path("/management/token") -// .accept(MediaType.APPLICATION_JSON) -// .type(MediaType.APPLICATION_JSON_TYPE) -// .post(String.class, payload); -// } catch (UniformInterfaceException uie) { -// responseStatus = uie.getResponse().getClientResponseStatus(); -// } -// -// assertEquals(ClientResponse.Status.BAD_REQUEST, responseStatus); -// } -// -// @Test -// public void revokeToken() throws Exception { -// String token1 = super.adminToken(); -// String token2 = super.adminToken(); -// -// JsonNode response = mapper.readTree(resource().path("/management/users/test") -// .queryParam("access_token", token1) -// .accept(MediaType.APPLICATION_JSON) -// .type(MediaType.APPLICATION_JSON_TYPE) -// .get(String.class)); -// -// assertEquals("[email protected]", response.get("data").get("email").asText()); -// -// response = mapper.readTree(resource().path("/management/users/test") -// .queryParam("access_token", token2) -// .accept(MediaType.APPLICATION_JSON) -// .type(MediaType.APPLICATION_JSON_TYPE) -// .get(String.class)); -// -// assertEquals("[email protected]", response.get("data").get("email").asText()); -// -// // now revoke the tokens -// response = mapper.readTree(resource().path("/management/users/test/revoketokens") -// .queryParam("access_token", superAdminToken()) -// .accept(MediaType.APPLICATION_JSON) -// .type(MediaType.APPLICATION_JSON_TYPE) -// .post(String.class)); -// -// refreshIndex("test-organization", "test-app"); -// -// // the tokens shouldn't work -// ClientResponse.Status status = null; -// -// try { -// response = mapper.readTree(resource().path("/management/users/test") -// .queryParam("access_token", token1) -// .accept(MediaType.APPLICATION_JSON) -// .type(MediaType.APPLICATION_JSON_TYPE) -// .get(String.class)); -// } catch (UniformInterfaceException uie) { -// status = uie.getResponse().getClientResponseStatus(); -// } -// -// assertEquals(ClientResponse.Status.UNAUTHORIZED, status); -// -// status = null; -// -// try { -// response = mapper.readTree(resource().path("/management/users/test") -// .queryParam("access_token", token2) -// .accept(MediaType.APPLICATION_JSON) -// .type(MediaType.APPLICATION_JSON_TYPE) -// .get(String.class)); -// } catch (UniformInterfaceException uie) { -// status = uie.getResponse().getClientResponseStatus(); -// } -// -// assertEquals(ClientResponse.Status.UNAUTHORIZED, status); -// -// String token3 = super.adminToken(); -// String token4 = super.adminToken(); -// -// response = mapper.readTree(resource().path("/management/users/test") -// .queryParam("access_token", token3) -// .accept(MediaType.APPLICATION_JSON) -// .type(MediaType.APPLICATION_JSON_TYPE) -// .get(String.class)); -// -// assertEquals("[email protected]", response.get("data").get("email").asText()); -// -// response = mapper.readTree(resource().path("/management/users/test") -// .queryParam("access_token", token4) -// .accept(MediaType.APPLICATION_JSON) -// .type(MediaType.APPLICATION_JSON_TYPE) -// .get(String.class)); -// -// assertEquals("[email protected]", response.get("data").get("email").asText()); -// -// // now revoke the token3 -// response = mapper.readTree(resource().path("/management/users/test/revoketoken") -// .queryParam("access_token", token3) -// .queryParam("token", token3) -// .accept(MediaType.APPLICATION_JSON) -// .type(MediaType.APPLICATION_JSON_TYPE) -// .post(String.class)); -// -// // the token3 shouldn't work -// status = null; -// -// try { -// response = mapper.readTree(resource().path("/management/users/test") -// .queryParam("access_token", token3) -// .accept(MediaType.APPLICATION_JSON) -// .type(MediaType.APPLICATION_JSON_TYPE) -// .get(String.class)); -// } catch (UniformInterfaceException uie) { -// status = uie.getResponse().getClientResponseStatus(); -// } -// -// assertEquals(ClientResponse.Status.UNAUTHORIZED, status); -// -// status = null; -// -// try { -// response = mapper.readTree(resource().path("/management/users/test") -// .queryParam("access_token", token4) -// .accept(MediaType.APPLICATION_JSON) -// .type(MediaType.APPLICATION_JSON_TYPE) -// .get(String.class)); -// -// status = ClientResponse.Status.OK; -// } catch (UniformInterfaceException uie) { -// status = uie.getResponse().getClientResponseStatus(); -// } -// -// assertEquals(ClientResponse.Status.OK, status); -// } + + + /** + * Verify that we can POST and GET using the token that was returned. + * @throws Exception + */ + @Test + public void meTokenPost() throws Exception { + Map<String, String> payload + = hashMap("grant_type", "password") + .map("username", clientSetup.getUsername()).map("password", clientSetup.getPassword()); + + Token token = management().me().post( Token.class, payload ); + + assertNotNull( token ); + assertNotNull( token.getAccessToken() ); + management().token().setToken( token ); + + refreshIndex(); + + assertNotNull( management().me().get( Token.class ) ); + + } + + + /** + * Verifies that we can POST using a form and GET using the token that was returned. + * @throws IOException + */ + @Test + public void meTokenPostForm() throws IOException { + + Form form = new Form(); + form.add("grant_type", "password"); + form.add("username", clientSetup.getUsername()); + form.add("password", clientSetup.getPassword()); + + Token adminToken = management().me().post( Token.class,form ); + + assertNotNull( adminToken ); + assertNotNull( adminToken.getAccessToken() ); + + refreshIndex(); + + assertNotNull( management().me().get( Token.class ) ); + + } + + + /** + * Checks we get approriate response when giving a bad ttl request + * @throws Exception + */ + @Test + public void ttlNan() throws Exception { + + Map<String, String> payload = hashMap("grant_type", "password") + .map("username", clientSetup.getUsername()) + .map("password", clientSetup.getPassword()) + .map("ttl", "derp"); + + try { + management().token().post( Token.class,payload ); + } catch (UniformInterfaceException uie) { + assertEquals(ClientResponse.Status.BAD_REQUEST, uie.getResponse().getClientResponseStatus()); + } + + } + + /** + * Checks we get approriate response when giving a bad ttl request + * @throws Exception + */ + @Test + public void ttlOverMax() throws Exception { + + Map<String, String> payload = hashMap("grant_type", "password") + .map("username", clientSetup.getUsername()) + .map("password", clientSetup.getPassword()) + .map("ttl", Long.MAX_VALUE + ""); + + try { + management().token().post( Token.class, payload ); + } catch (UniformInterfaceException uie) { + assertEquals(ClientResponse.Status.BAD_REQUEST, uie.getResponse().getClientResponseStatus()); + } + + } + + /** + * Tests that we can revoke all of the tokens that have been assigned to a specific user + * @throws Exception + */ + @Test + public void revokeTokens() throws Exception { + Token token1 = getAdminToken(); + Token token2 = getAdminToken(); + + // using a superuser token, revoke all tokens associated with the admin user + management().token().setToken( clientSetup.getSuperuserToken() ); + management().users().user( clientSetup.getUsername() ).revokeTokens().post( ApiResponse.class ); + + refreshIndex(); + + + //test that token 1 doesn't work + try { + management().token().setToken( token1 ); + management().users().user( clientSetup.getUsername() ).get(); + fail( "Token1 should have been revoked" ); + } + catch ( UniformInterfaceException uie ) { + assertEquals( ClientResponse.Status.UNAUTHORIZED, uie.getResponse().getClientResponseStatus()); + } + + + //test that token 2 doesn't work + try { + management().token().setToken( token2 ); + management().users().user( clientSetup.getUsername() ).get(); + fail( "Token2 should have been revoked" ); + } + catch ( UniformInterfaceException uie ) { + assertEquals( ClientResponse.Status.UNAUTHORIZED, uie.getResponse().getClientResponseStatus()); + } + } + + /** + * Tests that we can revoke a single token that has been assigned to a specific user + * @throws Exception + */ + @Test + public void revokeSingleToken() throws Exception { + Token token1 = getAdminToken(); + Token token2 = getAdminToken(); + + // using a superuser token, revoke specific token associated with the admin user + QueryParameters queryParameters = new QueryParameters(); + queryParameters.addParam( "token", token1.getAccessToken() ); + + management().token().setToken( clientSetup.getSuperuserToken() ); + management().users().user( clientSetup.getUsername() ).revokeToken().post( ApiResponse.class,queryParameters ); + + refreshIndex(); + + + //test that token 1 doesn't work + try { + management().token().setToken( token1 ); + management().users().user( clientSetup.getUsername() ).get(); + fail( "Token1 should have been revoked" ); + } + catch ( UniformInterfaceException uie ) { + assertEquals( ClientResponse.Status.UNAUTHORIZED, uie.getResponse().getClientResponseStatus()); + } + + + //test that token 2 still works + try { + management().token().setToken( token2 ); + management().users().user( clientSetup.getUsername() ).get(); + } + catch ( UniformInterfaceException uie ) { + fail( "Token2 shouldn't have been revoked" ); + + } + } } http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/d7734af9/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/NamedResource.java ---------------------------------------------------------------------- diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/NamedResource.java b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/NamedResource.java index a5ffc9f..daf3502 100644 --- a/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/NamedResource.java +++ b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/NamedResource.java @@ -33,6 +33,8 @@ import java.util.Set; import java.util.UUID; import javax.ws.rs.core.MediaType; +import com.sun.jersey.api.representation.Form; + /** @@ -150,6 +152,16 @@ public abstract class NamedResource implements UrlResource { } + public <T> T post(Class<T> type, QueryParameters queryParameters) { + WebResource resource = getResource(); + resource = addParametersToResource(resource, queryParameters); + GenericType<T> gt = new GenericType<>((Class) type); + return resource.type(MediaType.APPLICATION_JSON_TYPE) + .accept( MediaType.APPLICATION_JSON ) + .post(gt.getRawClass()); + + } + public <T> T postWithToken(Class<T> type, Object requestEntity) { GenericType<T> gt = new GenericType<>((Class) type); return getResource(true).type(MediaType.APPLICATION_JSON_TYPE) @@ -167,14 +179,15 @@ public abstract class NamedResource implements UrlResource { } - //Get Resources -// public Entity get() { -// WebResource resource = getResource(true); -// -// ApiResponse response = resource.type( MediaType.APPLICATION_JSON_TYPE ) -// .accept( MediaType.APPLICATION_JSON ).get( ApiResponse.class); -// return new Entity(response); -// } + public <T> T post(Class<T> type, Form requestEntity) { + GenericType<T> gt = new GenericType<>((Class) type); + return getResource() + .accept( MediaType.APPLICATION_JSON ) + .type( MediaType.APPLICATION_FORM_URLENCODED_TYPE ) + .entity( requestEntity, MediaType.APPLICATION_FORM_URLENCODED_TYPE ) + .post( gt.getRawClass() ); + + } //For edge cases like Organizations and Tokens without any payload public <T> T get(Class<T> type) { http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/d7734af9/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/RevokeTokenResource.java ---------------------------------------------------------------------- diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/RevokeTokenResource.java b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/RevokeTokenResource.java new file mode 100644 index 0000000..c727521 --- /dev/null +++ b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/RevokeTokenResource.java @@ -0,0 +1,16 @@ +package org.apache.usergrid.rest.test.resource2point0.endpoints.mgmt; + + +import org.apache.usergrid.rest.test.resource2point0.endpoints.NamedResource; +import org.apache.usergrid.rest.test.resource2point0.endpoints.UrlResource; +import org.apache.usergrid.rest.test.resource2point0.state.ClientContext; + + +/** + * Handles /revokeToken endpoint ( as opposed to revokeTokens + */ +public class RevokeTokenResource extends NamedResource { + public RevokeTokenResource( final ClientContext context, final UrlResource parent ) { + super( "revoketoken", context, parent ); + } +} http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/d7734af9/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/RevokeTokensResource.java ---------------------------------------------------------------------- diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/RevokeTokensResource.java b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/RevokeTokensResource.java new file mode 100644 index 0000000..20796ae --- /dev/null +++ b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/RevokeTokensResource.java @@ -0,0 +1,33 @@ +/* + * 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.rest.test.resource2point0.endpoints.mgmt; + + +import org.apache.usergrid.rest.test.resource2point0.endpoints.NamedResource; +import org.apache.usergrid.rest.test.resource2point0.endpoints.UrlResource; +import org.apache.usergrid.rest.test.resource2point0.state.ClientContext; + + +/** + * Handles endpoints against /revoketokens + */ +public class RevokeTokensResource extends NamedResource { + public RevokeTokensResource( final ClientContext context, final UrlResource parent ) { + super( "revoketokens", context, parent ); + } +} + http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/d7734af9/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/UserResource.java ---------------------------------------------------------------------- diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/UserResource.java b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/UserResource.java index 9af23ce..a52d884 100644 --- a/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/UserResource.java +++ b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/UserResource.java @@ -62,6 +62,14 @@ public class UserResource extends NamedResource { return new OrgResource( context, this ); } + public RevokeTokensResource revokeTokens() { + return new RevokeTokensResource( context, this ); + } + + public RevokeTokenResource revokeToken() { + return new RevokeTokenResource( context, this ); + } + public Entity get() { WebResource resource = getResource( true ); ApiResponse response = resource.type( MediaType.APPLICATION_JSON_TYPE )
