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();
    }
-
 }
 

Reply via email to