Repository: jclouds-labs-google Updated Branches: refs/heads/master 6c839f135 -> 627667018
http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/62766701/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/ToIteratorOfListPageExpectTest.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/ToIteratorOfListPageExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/ToIteratorOfListPageExpectTest.java new file mode 100644 index 0000000..2e0aa87 --- /dev/null +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/ToIteratorOfListPageExpectTest.java @@ -0,0 +1,183 @@ +/* + * 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.jclouds.googlecomputeengine.internal; + +import static org.jclouds.googlecomputeengine.options.ListOptions.Builder.maxResults; +import static org.testng.Assert.assertEquals; + +import java.util.Iterator; +import java.util.List; + +import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; +import org.jclouds.googlecomputeengine.config.GoogleComputeEngineParserModule; +import org.jclouds.googlecomputeengine.domain.Address; +import org.jclouds.googlecomputeengine.domain.Image; +import org.jclouds.googlecomputeengine.domain.Instance; +import org.jclouds.googlecomputeengine.domain.ListPage; +import org.jclouds.googlecomputeengine.features.AddressApi; +import org.jclouds.googlecomputeengine.features.ImageApi; +import org.jclouds.googlecomputeengine.features.InstanceApi; +import org.jclouds.googlecomputeengine.parse.ParseAddressTest; +import org.jclouds.googlecomputeengine.parse.ParseImageTest; +import org.jclouds.googlecomputeengine.parse.ParseInstanceTest; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.jclouds.json.Json; +import org.jclouds.json.config.GsonModule; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; +import com.google.inject.Guice; + +@Test(groups = "unit", testName = "ToIteratorOfListPageTest") +public class ToIteratorOfListPageExpectTest extends BaseGoogleComputeEngineExpectTest<GoogleComputeEngineApi> { + + private final Json json = Guice.createInjector(new GsonModule(), new GoogleComputeEngineParserModule()) + .getInstance(Json.class); + + public void globalScope() { + HttpRequest list = HttpRequest + .builder() + .method("GET") + .endpoint(BASE_URL + "/party/global/images") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/image_list_single_page.json")).build(); + + ImageApi imageApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, list, operationResponse).images(); + + Iterator<ListPage<Image>> images = imageApi.list(); + + assertEquals(images.next().size(), 3); + } + + public void multiplePagesProjectScoped() { + HttpRequest list1 = HttpRequest + .builder() + .method("GET") + .endpoint(BASE_URL + "/party/global/images?maxResults=1") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpRequest list2 = list1.toBuilder() + .endpoint(BASE_URL + "/party/global/images?pageToken=token1&maxResults=1").build(); + + HttpRequest list3 = list1.toBuilder() + .endpoint(BASE_URL + "/party/global/images?pageToken=token2&maxResults=1").build(); + + List<Image> items = ImmutableList.of(new ParseImageTest().expected()); + + HttpResponse list1Response = HttpResponse.builder().statusCode(200) + .payload(json.toJson(ListPage.create(items, "token1"))).build(); + + HttpResponse list2Response = HttpResponse.builder().statusCode(200) + .payload(json.toJson(ListPage.create(items, "token2"))).build(); + + HttpResponse list3Response = HttpResponse.builder().statusCode(200) + .payload(json.toJson(ListPage.create(items, null))).build(); + + ImageApi imageApi = orderedRequestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, list1, list1Response, list2, list2Response, list3, list3Response).images(); + + Iterator<ListPage<Image>> images = imageApi.list(maxResults(1)); + + int imageCounter = 0; + while (images.hasNext()) { + imageCounter += images.next().size(); + } + assertEquals(imageCounter, 3); + } + + public void multiplePagesRegionScoped() { + HttpRequest list1 = HttpRequest + .builder() + .method("GET") + .endpoint(BASE_URL + "/party/regions/us-central1/addresses?maxResults=1") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpRequest list2 = list1.toBuilder() + .endpoint(BASE_URL + "/party/regions/us-central1/addresses?pageToken=token1&maxResults=1").build(); + + HttpRequest list3 = list1.toBuilder() + .endpoint(BASE_URL + "/party/regions/us-central1/addresses?pageToken=token2&maxResults=1").build(); + + List<Address> items = ImmutableList.of(new ParseAddressTest().expected()); + + HttpResponse list1Response = HttpResponse.builder().statusCode(200) + .payload(json.toJson(ListPage.create(items, "token1"))).build(); + + HttpResponse list2Response = HttpResponse.builder().statusCode(200) + .payload(json.toJson(ListPage.create(items, "token2"))).build(); + + HttpResponse list3Response = HttpResponse.builder().statusCode(200) + .payload(json.toJson(ListPage.create(items, null))).build(); + + AddressApi addressApi = orderedRequestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, list1, list1Response, list2, list2Response, list3, list3Response) + .addressesInRegion("us-central1"); + + Iterator<ListPage<Address>> addresses = addressApi.list(maxResults(1)); + + int addressCounter = 0; + while (addresses.hasNext()) { + addressCounter += addresses.next().size(); + } + assertEquals(addressCounter, 3); + } + + public void multiplePagesZoneScoped() { + HttpRequest list1 = HttpRequest + .builder() + .method("GET") + .endpoint(BASE_URL + "/party/zones/us-central1-a/instances?maxResults=1") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpRequest list2 = list1.toBuilder() + .endpoint(BASE_URL + "/party/zones/us-central1-a/instances?pageToken=token1&maxResults=1").build(); + + HttpRequest list3 = list1.toBuilder() + .endpoint(BASE_URL + "/party/zones/us-central1-a/instances?pageToken=token2&maxResults=1").build(); + + List<Instance> items = ImmutableList.of(new ParseInstanceTest().expected()); + + HttpResponse list1Response = HttpResponse.builder().statusCode(200) + .payload(json.toJson(ListPage.create(items, "token1"))).build(); + + HttpResponse list2Response = HttpResponse.builder().statusCode(200) + .payload(json.toJson(ListPage.create(items, "token2"))).build(); + + HttpResponse list3Response = HttpResponse.builder().statusCode(200) + .payload(json.toJson(ListPage.create(items, null))).build(); + + InstanceApi instanceApi = orderedRequestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, list1, list1Response, list2, list2Response, list3, list3Response) + .instancesInZone("us-central1-a"); + + Iterator<ListPage<Instance>> instances = instanceApi.list(maxResults(1)); + + int instanceCounter = 0; + while (instances.hasNext()) { + instanceCounter += instances.next().size(); + } + assertEquals(instanceCounter, 3); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/62766701/oauth/README ---------------------------------------------------------------------- diff --git a/oauth/README b/oauth/README index 1c5f73b..40b039d 100644 --- a/oauth/README +++ b/oauth/README @@ -13,4 +13,4 @@ mvn clean install -Plive\ -Dtest.oauth.credential=<accout pk in pem format>\ -Dtest.oauth.endpoint=https://accounts.google.com/o/oauth2/token\ -Dtest.jclouds.oauth.audience=https://accounts.google.com/o/oauth2/token\ - -Dtest.jclouds.oauth.scopes=https://www.googleapis.com/auth/prediction \ No newline at end of file + -Dtest.jclouds.oauth.scope=https://www.googleapis.com/auth/prediction \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/62766701/oauth/pom.xml ---------------------------------------------------------------------- diff --git a/oauth/pom.xml b/oauth/pom.xml index 275ce4b..9f83ac8 100644 --- a/oauth/pom.xml +++ b/oauth/pom.xml @@ -37,7 +37,7 @@ <test.oauth.endpoint>FIX_ME</test.oauth.endpoint> <test.jclouds.oauth.jws-alg>RS256</test.jclouds.oauth.jws-alg> <test.jclouds.oauth.audience>FIX_ME</test.jclouds.oauth.audience> - <test.jclouds.oauth.scopes>FIX_ME</test.jclouds.oauth.scopes> + <test.jclouds.oauth.scope>FIX_ME</test.jclouds.oauth.scope> <test.oauth.api-version>2</test.oauth.api-version> <test.oauth.build-version /> </properties> @@ -123,7 +123,7 @@ <test.oauth.build-version>${test.oauth.build-version}</test.oauth.build-version> <test.jclouds.oauth.jws-alg>${test.jclouds.oauth.jws-alg}</test.jclouds.oauth.jws-alg> <test.jclouds.oauth.audience>${test.jclouds.oauth.audience}</test.jclouds.oauth.audience> - <test.jclouds.oauth.scopes>${test.jclouds.oauth.scopes}</test.jclouds.oauth.scopes> + <test.jclouds.oauth.scope>${test.jclouds.oauth.scope}</test.jclouds.oauth.scope> </systemPropertyVariables> </configuration> </execution> http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/62766701/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthHttpApiModule.java ---------------------------------------------------------------------- diff --git a/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthHttpApiModule.java b/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthHttpApiModule.java index 3bb7c1a..5a1d5d2 100644 --- a/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthHttpApiModule.java +++ b/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthHttpApiModule.java @@ -29,9 +29,7 @@ import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import com.google.inject.Provides; -/** - * OAuth module to when accessing OAuth stand-alone. - */ +/** Api module to when accessing OAuth stand-alone. */ @ConfiguresHttpApi public class OAuthHttpApiModule extends HttpApiModule<OAuthApi> { @@ -41,5 +39,4 @@ public class OAuthHttpApiModule extends HttpApiModule<OAuthApi> { protected Supplier<URI> provideAuthenticationEndpoint(ProviderMetadata providerMetadata) { return Suppliers.ofInstance(URI.create(providerMetadata.getEndpoint())); } - } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/62766701/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthModule.java ---------------------------------------------------------------------- diff --git a/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthModule.java b/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthModule.java index e831c0f..e6d5985 100644 --- a/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthModule.java +++ b/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthModule.java @@ -35,6 +35,7 @@ import org.jclouds.oauth.v2.functions.PrivateKeySupplier; import org.jclouds.oauth.v2.functions.SignOrProduceMacForToken; import com.google.common.base.Function; +import com.google.common.base.Functions; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import com.google.common.cache.CacheBuilder; @@ -81,11 +82,7 @@ public class OAuthModule extends AbstractModule { @Provides @Singleton Supplier<Function<byte[], byte[]>> signOrProduceMacForToken(@Named(JWS_ALG) String jwsAlg, Provider<SignOrProduceMacForToken> in) { if (jwsAlg.equals(NONE)) { // Current implementation requires we return null on none. - return Suppliers.<Function<byte[], byte[]>>ofInstance(new Function<byte[], byte[]>() { - @Override public byte[] apply(byte[] input) { - return null; - } - }); + return (Supplier) Suppliers.ofInstance(Functions.constant(null)); } return Suppliers.memoize(in.get()); } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/62766701/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthScopes.java ---------------------------------------------------------------------- diff --git a/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthScopes.java b/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthScopes.java index d4fe7d4..d154839 100644 --- a/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthScopes.java +++ b/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthScopes.java @@ -16,26 +16,57 @@ */ package org.jclouds.oauth.v2.config; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.util.List; -import javax.inject.Qualifier; +import org.jclouds.http.HttpRequest; + +import com.google.auto.value.AutoValue; +import com.google.common.collect.ImmutableList; /** - * Used to annotate REST methods/ifaces that use OAuthAuthentication. - * <p/> - * Sets the scopes for the token request for that particular method. + * Implementations are api-specific, typically routing GET or HEAD requests to a read-only role, and others to a + * read-write one. */ -@Retention(value = RetentionPolicy.RUNTIME) -@Target(value = {ElementType.TYPE, ElementType.METHOD}) -@Qualifier -public @interface OAuthScopes { +public interface OAuthScopes { + + /** Returns a list of scopes needed to perform the request. */ + List<String> forRequest(HttpRequest input); + + @AutoValue public abstract static class SingleScope implements OAuthScopes { + abstract List<String> scopes(); + + public static SingleScope create(String scope) { + return new AutoValue_OAuthScopes_SingleScope(ImmutableList.of(scope)); + } + + @Override public List<String> forRequest(HttpRequest input) { + return scopes(); + } + + SingleScope() { + } + } + + @AutoValue public abstract static class ReadOrWriteScopes implements OAuthScopes { + abstract List<String> readScopes(); + + abstract List<String> writeScopes(); + + public static ReadOrWriteScopes create(String readScope, String writeScope) { + return new AutoValue_OAuthScopes_ReadOrWriteScopes( // + ImmutableList.of(readScope), // + ImmutableList.of(writeScope) // + ); + } - /** - * @return the OAuth scopes required to access the resource. - */ - String[] value(); + @Override public List<String> forRequest(HttpRequest input) { + if (input.getMethod().equals("GET") || input.getMethod().equals("HEAD")) { + return readScopes(); + } + return writeScopes(); + } + ReadOrWriteScopes() { + } + } } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/62766701/oauth/src/main/java/org/jclouds/oauth/v2/functions/BuildTokenRequest.java ---------------------------------------------------------------------- diff --git a/oauth/src/main/java/org/jclouds/oauth/v2/functions/BuildTokenRequest.java b/oauth/src/main/java/org/jclouds/oauth/v2/functions/BuildTokenRequest.java index 4a51954..51ab318 100644 --- a/oauth/src/main/java/org/jclouds/oauth/v2/functions/BuildTokenRequest.java +++ b/oauth/src/main/java/org/jclouds/oauth/v2/functions/BuildTokenRequest.java @@ -16,7 +16,6 @@ */ package org.jclouds.oauth.v2.functions; -import static com.google.common.base.Preconditions.checkState; import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; import static org.jclouds.oauth.v2.config.OAuthProperties.AUDIENCE; import static org.jclouds.oauth.v2.config.OAuthProperties.JWS_ALG; @@ -35,12 +34,10 @@ import org.jclouds.location.Provider; import org.jclouds.oauth.v2.config.OAuthScopes; import org.jclouds.oauth.v2.domain.Header; import org.jclouds.oauth.v2.domain.TokenRequest; -import org.jclouds.rest.internal.GeneratedHttpRequest; import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.base.Supplier; -import com.google.common.reflect.Invokable; /** Builds the default token request with the following claims: {@code iss,scope,aud,iat,exp}. */ public class BuildTokenRequest implements Function<HttpRequest, TokenRequest> { @@ -49,13 +46,14 @@ public class BuildTokenRequest implements Function<HttpRequest, TokenRequest> { private final String assertionTargetDescription; private final String signatureAlgorithm; private final Supplier<Credentials> credentialsSupplier; + private final OAuthScopes scopes; private final long tokenDuration; public static class TestBuildTokenRequest extends BuildTokenRequest { @Inject TestBuildTokenRequest(@Named(AUDIENCE) String assertionTargetDescription, @Named(JWS_ALG) String signatureAlgorithm, @Provider Supplier<Credentials> credentialsSupplier, - @Named(PROPERTY_SESSION_INTERVAL) long tokenDuration) { - super(assertionTargetDescription, signatureAlgorithm, credentialsSupplier, tokenDuration); + OAuthScopes scopes, @Named(PROPERTY_SESSION_INTERVAL) long tokenDuration) { + super(assertionTargetDescription, signatureAlgorithm, credentialsSupplier, scopes, tokenDuration); } public long currentTimeSeconds() { @@ -65,10 +63,11 @@ public class BuildTokenRequest implements Function<HttpRequest, TokenRequest> { @Inject BuildTokenRequest(@Named(AUDIENCE) String assertionTargetDescription, @Named(JWS_ALG) String signatureAlgorithm, @Provider Supplier<Credentials> credentialsSupplier, - @Named(PROPERTY_SESSION_INTERVAL) long tokenDuration) { + OAuthScopes scopes, @Named(PROPERTY_SESSION_INTERVAL) long tokenDuration) { this.assertionTargetDescription = assertionTargetDescription; this.signatureAlgorithm = signatureAlgorithm; this.credentialsSupplier = credentialsSupplier; + this.scopes = scopes; this.tokenDuration = tokenDuration; } @@ -77,7 +76,7 @@ public class BuildTokenRequest implements Function<HttpRequest, TokenRequest> { Map<String, Object> claims = new LinkedHashMap<String, Object>(); claims.put("iss", credentialsSupplier.get().identity); - claims.put("scope", getOAuthScopes((GeneratedHttpRequest) request)); + claims.put("scope", ON_COMMA.join(scopes.forRequest(request))); claims.put("aud", assertionTargetDescription); long now = currentTimeSeconds(); @@ -87,18 +86,6 @@ public class BuildTokenRequest implements Function<HttpRequest, TokenRequest> { return TokenRequest.create(header, claims); } - //TODO: Remove and switch to a request function. - private String getOAuthScopes(GeneratedHttpRequest request) { - Invokable<?, ?> invokable = request.getInvocation().getInvokable(); - OAuthScopes classScopes = invokable.getOwnerType().getRawType().getAnnotation(OAuthScopes.class); - OAuthScopes methodScopes = invokable.getAnnotation(OAuthScopes.class); - checkState(classScopes != null || methodScopes != null, "Api interface or method should be annotated " // - + "with OAuthScopes specifying required permissions. Api interface: %s, Method: %s", // - invokable.getOwnerType(), invokable.getName()); - OAuthScopes scopes = methodScopes != null ? methodScopes : classScopes; - return ON_COMMA.join(scopes.value()); - } - long currentTimeSeconds() { return System.currentTimeMillis() / 1000; } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/62766701/oauth/src/test/java/org/jclouds/oauth/v2/binders/TokenBinderTest.java ---------------------------------------------------------------------- diff --git a/oauth/src/test/java/org/jclouds/oauth/v2/binders/TokenBinderTest.java b/oauth/src/test/java/org/jclouds/oauth/v2/binders/TokenBinderTest.java index 2f56aaf..93042f4 100644 --- a/oauth/src/test/java/org/jclouds/oauth/v2/binders/TokenBinderTest.java +++ b/oauth/src/test/java/org/jclouds/oauth/v2/binders/TokenBinderTest.java @@ -25,29 +25,31 @@ import static org.testng.Assert.assertTrue; import java.io.IOException; import java.util.Map; -import org.jclouds.ContextBuilder; import org.jclouds.http.HttpRequest; -import org.jclouds.oauth.v2.OAuthApiMetadata; -import org.jclouds.oauth.v2.OAuthTestUtils; +import org.jclouds.json.config.GsonModule; import org.jclouds.oauth.v2.domain.Header; import org.jclouds.oauth.v2.domain.TokenRequest; import org.jclouds.util.Strings2; import org.testng.annotations.Test; +import com.google.common.base.Function; +import com.google.common.base.Functions; import com.google.common.base.Splitter; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; +import com.google.inject.Binder; +import com.google.inject.Guice; +import com.google.inject.Module; +import com.google.inject.Provides; @Test(groups = "unit", testName = "OAuthTokenBinderTest") public class TokenBinderTest { public static final String STRING_THAT_GENERATES_URL_UNSAFE_BASE64_ENCODING = "§1234567890'+±!\"#$%&/()" + - "=?*qwertyuiopº´WERTYUIOPªà sdfghjklç~ASDFGHJKLÃ^<zxcvbnm," + - ".->ZXCVBNM;:_@â¬"; + "=?*qwertyuiopº´WERTYUIOPªà sdfghjklç~ASDFGHJKLÃ^<zxcvbnm,.->ZXCVBNM;:_@â¬"; public void testPayloadIsUrlSafe() throws IOException { - TokenBinder tokenRequestFormat = ContextBuilder.newBuilder(new OAuthApiMetadata()).overrides - (OAuthTestUtils.defaultProperties(null)).build().utils() - .injector().getInstance(TokenBinder.class); Header header = Header.create("a", "b"); Map<String, Object> claims = ImmutableMap.<String, Object>builder() @@ -56,7 +58,7 @@ public class TokenBinderTest { .put("ist", STRING_THAT_GENERATES_URL_UNSAFE_BASE64_ENCODING).build(); TokenRequest tokenRequest = TokenRequest.create(header, claims); - HttpRequest request = tokenRequestFormat.bindToRequest( + HttpRequest request = tokenBinder.bindToRequest( HttpRequest.builder().method("GET").endpoint("http://localhost").build(), tokenRequest); assertNotNull(request.getPayload()); @@ -71,4 +73,13 @@ public class TokenBinderTest { assertTrue(!payload.contains("+")); assertTrue(!payload.contains("/")); } + + private final TokenBinder tokenBinder = Guice.createInjector(new GsonModule(), new Module() { + @Override public void configure(Binder binder) { + } + + @Provides Supplier<Function<byte[], byte[]>> signer() { + return (Supplier) Suppliers.ofInstance(Functions.constant(null)); + } + }).getInstance(TokenBinder.class); } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/62766701/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiLiveTest.java ---------------------------------------------------------------------- diff --git a/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiLiveTest.java b/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiLiveTest.java index a48b725..cc83f8b 100644 --- a/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiLiveTest.java +++ b/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiLiveTest.java @@ -65,14 +65,13 @@ public class OAuthApiLiveTest extends BaseOAuthApiLiveTest { Header header = Header.create(jwsAlg, "JWT"); - String scopes = getMandatoryProperty(properties, "jclouds.oauth.scopes"); String audience = getMandatoryProperty(properties, AUDIENCE); - long now = nowInSeconds(); + long now = System.currentTimeMillis() / 1000; Map<String, Object> claims = ImmutableMap.<String, Object>builder() .put("iss", identity) - .put("scope", scopes) + .put("scope", scope) .put("aud", audience) .put(EXPIRATION_TIME, now + 3600) .put(ISSUED_AT, now).build(); http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/62766701/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiMockTest.java ---------------------------------------------------------------------- diff --git a/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiMockTest.java b/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiMockTest.java index f76a360..febaee7 100644 --- a/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiMockTest.java +++ b/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiMockTest.java @@ -37,6 +37,8 @@ import org.jclouds.concurrent.config.ExecutorServiceModule; import org.jclouds.oauth.v2.OAuthApi; import org.jclouds.oauth.v2.OAuthApiMetadata; import org.jclouds.oauth.v2.OAuthTestUtils; +import org.jclouds.oauth.v2.config.OAuthScopes; +import org.jclouds.oauth.v2.config.OAuthScopes.SingleScope; import org.jclouds.oauth.v2.domain.Header; import org.jclouds.oauth.v2.domain.Token; import org.jclouds.oauth.v2.domain.TokenRequest; @@ -46,6 +48,7 @@ import com.google.common.base.Joiner; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.io.BaseEncoding; +import com.google.inject.Binder; import com.google.inject.Module; import com.squareup.okhttp.mockwebserver.MockResponse; import com.squareup.okhttp.mockwebserver.MockWebServer; @@ -53,19 +56,19 @@ import com.squareup.okhttp.mockwebserver.RecordedRequest; @Test(groups = "unit", testName = "OAuthApiMockTest") public class OAuthApiMockTest { + private static final String SCOPE = "https://www.googleapis.com/auth/prediction"; private static final String header = "{\"alg\":\"RS256\",\"typ\":\"JWT\"}"; private static final String claims = "{\"iss\":\"761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer" + - ".gserviceaccount.com\"," + - "\"scope\":\"https://www.googleapis.com/auth/prediction\",\"aud\":\"https://accounts.google" + + ".gserviceaccount.com\",\"scope\":\"" + SCOPE + "\",\"aud\":\"https://accounts.google" + ".com/o/oauth2/token\",\"exp\":1328573381,\"iat\":1328569781}"; private static final Token TOKEN = Token.create("1/8xbJqaOZXSUZbHLl5EOtu1pxz3fmmetKx9W8CV4t79M", "Bearer", 3600); private static final Map<String, Object> CLAIMS = ImmutableMap.<String, Object>builder() .put("iss", "761326798069-r5mljlln1rd4lrbhg75efgigp36m7...@developer.gserviceaccount.com") - .put("scope", "https://www.googleapis.com/auth/prediction") + .put("scope", SCOPE) .put("aud", "https://accounts.google.com/o/oauth2/token") .put(EXPIRATION_TIME, 1328573381) .put(ISSUED_AT, 1328569781).build(); @@ -113,7 +116,11 @@ public class OAuthApiMockTest { .credentials("foo", toStringAndClose(OAuthTestUtils.class.getResourceAsStream("/testpk.pem"))) .endpoint(url.toString()) .overrides(overrides) - .modules(ImmutableSet.<Module>of(new ExecutorServiceModule(sameThreadExecutor()))) + .modules(ImmutableSet.of(new ExecutorServiceModule(sameThreadExecutor()), new Module() { + @Override public void configure(Binder binder) { + binder.bind(OAuthScopes.class).toInstance(SingleScope.create(SCOPE)); + } + })) .buildApi(OAuthApi.class); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/62766701/oauth/src/test/java/org/jclouds/oauth/v2/internal/BaseOAuthApiLiveTest.java ---------------------------------------------------------------------- diff --git a/oauth/src/test/java/org/jclouds/oauth/v2/internal/BaseOAuthApiLiveTest.java b/oauth/src/test/java/org/jclouds/oauth/v2/internal/BaseOAuthApiLiveTest.java index 0a50dfe..2421d16 100644 --- a/oauth/src/test/java/org/jclouds/oauth/v2/internal/BaseOAuthApiLiveTest.java +++ b/oauth/src/test/java/org/jclouds/oauth/v2/internal/BaseOAuthApiLiveTest.java @@ -20,36 +20,44 @@ import static com.google.common.base.Preconditions.checkNotNull; import static org.jclouds.oauth.v2.OAuthTestUtils.setCredential; import static org.jclouds.oauth.v2.config.OAuthProperties.AUDIENCE; import static org.jclouds.oauth.v2.config.OAuthProperties.JWS_ALG; +import static org.jclouds.oauth.v2.config.OAuthScopes.SingleScope; import java.util.Properties; -import java.util.concurrent.TimeUnit; import org.jclouds.apis.BaseApiLiveTest; import org.jclouds.oauth.v2.OAuthApi; +import org.jclouds.oauth.v2.config.OAuthScopes; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableList; +import com.google.inject.Binder; +import com.google.inject.Module; @Test(groups = "live") public class BaseOAuthApiLiveTest extends BaseApiLiveTest<OAuthApi> { + protected String scope; + public BaseOAuthApiLiveTest() { provider = "oauth"; } - @Override - protected Properties setupProperties() { + @Override protected Properties setupProperties() { Properties props = super.setupProperties(); setCredential(props, "oauth.credential"); checkNotNull(setIfTestSystemPropertyPresent(props, "oauth.endpoint"), "test.oauth.endpoint must be set"); checkNotNull(setIfTestSystemPropertyPresent(props, AUDIENCE), "test.jclouds.oauth.audience must be set"); - setIfTestSystemPropertyPresent(props, "jclouds.oauth.scopes"); + scope = setIfTestSystemPropertyPresent(props, "jclouds.oauth.scope"); setIfTestSystemPropertyPresent(props, JWS_ALG); return props; } - protected long nowInSeconds() { - return TimeUnit.SECONDS.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS); + @Override protected Iterable<Module> setupModules() { + return ImmutableList.<Module>builder().add(new Module() { + @Override public void configure(Binder binder) { + binder.bind(OAuthScopes.class).toInstance(SingleScope.create(scope)); + } + }).addAll(super.setupModules()).build(); } - }
