From 1321043c0261e9a06cbd18ace064ba178b3b8f96 Mon Sep 17 00:00:00 2001 From: Andrew Gaul Date: Thu, 15 Jul 2021 10:21:19 +0900 Subject: [PATCH] Remove Google appengine driver This has an incompatibility with JAXB motivating this removal. jclouds GAE has not seen any development or issues in recent years and uses a very old appengine-api-1.0-sdk dependency. Further it appears to have modern Guava incompatibilities as seen in JCLOUDS-836. --- drivers/gae/README.txt | 6 - drivers/gae/bnd.bnd | 2 - drivers/gae/pom.xml | 89 --------- .../org/jclouds/gae/ConvertToGaeRequest.java | 121 ------------ .../jclouds/gae/ConvertToJcloudsResponse.java | 66 ------- .../gae/GaeHttpCommandExecutorService.java | 91 --------- .../CurrentRequestExecutorServiceModule.java | 105 ----------- .../GoogleAppEngineConfigurationModule.java | 86 --------- .../jclouds/gae/ConvertToGaeRequestTest.java | 175 ------------------ .../gae/ConvertToJcloudsResponseTest.java | 105 ----------- ...CommandExecutorServiceIntegrationTest.java | 73 -------- .../org/jclouds/gae/GaeSocketOpenTest.java | 42 ----- drivers/gae/src/test/resources/test.jks | Bin 1365 -> 0 bytes drivers/pom.xml | 1 - 14 files changed, 962 deletions(-) delete mode 100644 drivers/gae/README.txt delete mode 100644 drivers/gae/bnd.bnd delete mode 100644 drivers/gae/pom.xml delete mode 100644 drivers/gae/src/main/java/org/jclouds/gae/ConvertToGaeRequest.java delete mode 100644 drivers/gae/src/main/java/org/jclouds/gae/ConvertToJcloudsResponse.java delete mode 100644 drivers/gae/src/main/java/org/jclouds/gae/GaeHttpCommandExecutorService.java delete mode 100644 drivers/gae/src/main/java/org/jclouds/gae/config/CurrentRequestExecutorServiceModule.java delete mode 100644 drivers/gae/src/main/java/org/jclouds/gae/config/GoogleAppEngineConfigurationModule.java delete mode 100644 drivers/gae/src/test/java/org/jclouds/gae/ConvertToGaeRequestTest.java delete mode 100644 drivers/gae/src/test/java/org/jclouds/gae/ConvertToJcloudsResponseTest.java delete mode 100644 drivers/gae/src/test/java/org/jclouds/gae/GaeHttpCommandExecutorServiceIntegrationTest.java delete mode 100644 drivers/gae/src/test/java/org/jclouds/gae/GaeSocketOpenTest.java delete mode 100644 drivers/gae/src/test/resources/test.jks diff --git a/drivers/gae/README.txt b/drivers/gae/README.txt deleted file mode 100644 index 461fc707dc..0000000000 --- a/drivers/gae/README.txt +++ /dev/null @@ -1,6 +0,0 @@ -# -# A driver to run jclouds on Google App Engine (http://code.google.com/appengine/). -# -# Expects the joda-time JAR (see drivers/joda) to be present on your application's classpath. -# -# TODO: Usage example. diff --git a/drivers/gae/bnd.bnd b/drivers/gae/bnd.bnd deleted file mode 100644 index 492d129c46..0000000000 --- a/drivers/gae/bnd.bnd +++ /dev/null @@ -1,2 +0,0 @@ -Export-Package: \ - org.jclouds.gae.*;version="${project.version}";-noimport:=true \ No newline at end of file diff --git a/drivers/gae/pom.xml b/drivers/gae/pom.xml deleted file mode 100644 index 30b820ea14..0000000000 --- a/drivers/gae/pom.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - 4.0.0 - - org.apache.jclouds - jclouds-project - 2.4.0-SNAPSHOT - ../../project/pom.xml - - org.apache.jclouds.driver - jclouds-gae - jclouds Google App Engine Components - Google App Engine Components - - - - org.apache.jclouds - jclouds-core - ${project.version} - - - com.google.appengine - appengine-api-1.0-sdk - 1.6.5 - - - org.apache.jclouds - jclouds-core - ${project.version} - test-jar - test - - - com.squareup.okhttp3 - mockwebserver - test - - - com.squareup.okhttp3 - okhttp-tls - test - - - com.google.appengine - appengine-api-stubs - 1.6.5 - test - - - com.google.appengine - appengine-testing - 1.6.5 - test - - - - - - maven-surefire-plugin - - - 1 - classes - - - - - diff --git a/drivers/gae/src/main/java/org/jclouds/gae/ConvertToGaeRequest.java b/drivers/gae/src/main/java/org/jclouds/gae/ConvertToGaeRequest.java deleted file mode 100644 index 628a956448..0000000000 --- a/drivers/gae/src/main/java/org/jclouds/gae/ConvertToGaeRequest.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * 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.gae; - -import static com.google.appengine.api.urlfetch.FetchOptions.Builder.disallowTruncate; - -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Map.Entry; -import java.util.Set; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.http.HttpRequest; -import org.jclouds.http.HttpUtils; -import org.jclouds.io.ContentMetadataCodec; -import org.jclouds.io.Payload; -import org.jclouds.util.Closeables2; - -import com.google.appengine.api.urlfetch.FetchOptions; -import com.google.appengine.api.urlfetch.HTTPHeader; -import com.google.appengine.api.urlfetch.HTTPMethod; -import com.google.appengine.api.urlfetch.HTTPRequest; -import com.google.appengine.repackaged.com.google.common.base.Throwables; -import com.google.common.base.Function; -import com.google.common.collect.ImmutableSet; -import com.google.common.io.ByteStreams; -import com.google.common.net.HttpHeaders; - -@Singleton -public class ConvertToGaeRequest implements Function { - public static final String USER_AGENT = "jclouds/1.0 urlfetch/1.4.3"; - // http://code.google.com/appengine/docs/java/urlfetch/overview.html - public final Set prohibitedHeaders = ImmutableSet.of("Accept-Encoding", "Content-Length", "Host", "Var", - "X-Forwarded-For"); - - protected final HttpUtils utils; - protected final ContentMetadataCodec contentMetadataCodec; - - @Inject - ConvertToGaeRequest(HttpUtils utils, ContentMetadataCodec contentMetadataCodec) { - this.utils = utils; - this.contentMetadataCodec = contentMetadataCodec; - } - - /** - * byte [] content is replayable and the only content type supportable by GAE. As such, we - * convert the original request content to a byte array. - */ - @Override - public HTTPRequest apply(HttpRequest request) { - URL url = null; - try { - url = request.getEndpoint().toURL(); - } catch (MalformedURLException e) { - Throwables.propagate(e); - } - - FetchOptions options = disallowTruncate(); - options.doNotFollowRedirects(); - if (utils.relaxHostname() || utils.trustAllCerts()) - options.doNotFollowRedirects(); - options.setDeadline(10.0); - - HTTPRequest gaeRequest = new HTTPRequest(url, HTTPMethod.valueOf(request.getMethod().toString()), options); - - for (Entry entry : request.getHeaders().entries()) { - String header = entry.getKey(); - if (!prohibitedHeaders.contains(header)) - gaeRequest.addHeader(new HTTPHeader(header, entry.getValue())); - } - gaeRequest.addHeader(new HTTPHeader(HttpHeaders.USER_AGENT, USER_AGENT)); - /** - * byte [] content is replayable and the only content type supportable by GAE. As such, we - * convert the original request content to a byte array. - */ - if (request.getPayload() != null) { - InputStream input = request.getPayload().getInput(); - try { - byte[] array = ByteStreams.toByteArray(input); - if (!request.getPayload().isRepeatable()) { - Payload oldPayload = request.getPayload(); - request.setPayload(array); - HttpUtils.copy(oldPayload.getContentMetadata(), request.getPayload().getContentMetadata()); - } - gaeRequest.setPayload(array); - if (array.length > 0) { - gaeRequest.setHeader(new HTTPHeader("Expect", "100-continue")); - } - } catch (IOException e) { - Throwables.propagate(e); - } finally { - Closeables2.closeQuietly(input); - } - - for (Entry header : contentMetadataCodec.toHeaders( - request.getPayload().getContentMetadata()).entries()) { - if (!prohibitedHeaders.contains(header.getKey())) - gaeRequest.setHeader(new HTTPHeader(header.getKey(), header.getValue())); - } - } - return gaeRequest; - } -} diff --git a/drivers/gae/src/main/java/org/jclouds/gae/ConvertToJcloudsResponse.java b/drivers/gae/src/main/java/org/jclouds/gae/ConvertToJcloudsResponse.java deleted file mode 100644 index 181585ebb6..0000000000 --- a/drivers/gae/src/main/java/org/jclouds/gae/ConvertToJcloudsResponse.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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.gae; -import static org.jclouds.http.HttpUtils.filterOutContentHeaders; - -import javax.inject.Singleton; - -import org.jclouds.http.HttpResponse; -import org.jclouds.io.ContentMetadataCodec; -import org.jclouds.io.Payload; -import org.jclouds.io.Payloads; - -import com.google.appengine.api.urlfetch.HTTPHeader; -import com.google.appengine.api.urlfetch.HTTPResponse; -import com.google.common.base.Function; -import com.google.common.collect.LinkedHashMultimap; -import com.google.common.collect.Multimap; -import com.google.inject.Inject; - -@Singleton -public class ConvertToJcloudsResponse implements Function { - - private final ContentMetadataCodec contentMetadataCodec; - - @Inject - public ConvertToJcloudsResponse(ContentMetadataCodec contentMetadataCodec) { - this.contentMetadataCodec = contentMetadataCodec; - } - - @Override - public HttpResponse apply(HTTPResponse gaeResponse) { - Payload payload = gaeResponse.getContent() != null ? Payloads.newByteArrayPayload(gaeResponse.getContent()) - : null; - Multimap headers = LinkedHashMultimap.create(); - String message = null; - for (HTTPHeader header : gaeResponse.getHeaders()) { - if (header.getName() == null) - message = header.getValue(); - else - headers.put(header.getName(), header.getValue()); - } - - if (payload != null) { - contentMetadataCodec.fromHeaders(payload.getContentMetadata(), headers); - } - return HttpResponse.builder() - .statusCode(gaeResponse.getResponseCode()) - .message(message) - .payload(payload) - .headers(filterOutContentHeaders(headers)).build(); - } -} diff --git a/drivers/gae/src/main/java/org/jclouds/gae/GaeHttpCommandExecutorService.java b/drivers/gae/src/main/java/org/jclouds/gae/GaeHttpCommandExecutorService.java deleted file mode 100644 index b98a221caf..0000000000 --- a/drivers/gae/src/main/java/org/jclouds/gae/GaeHttpCommandExecutorService.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * 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.gae; - -import static org.jclouds.Constants.PROPERTY_IDEMPOTENT_METHODS; - -import java.io.IOException; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.JcloudsVersion; -import org.jclouds.concurrent.SingleThreaded; -import org.jclouds.http.HttpRequest; -import org.jclouds.http.HttpResponse; -import org.jclouds.http.HttpUtils; -import org.jclouds.http.IOExceptionRetryHandler; -import org.jclouds.http.handlers.DelegatingErrorHandler; -import org.jclouds.http.handlers.DelegatingRetryHandler; -import org.jclouds.http.internal.BaseHttpCommandExecutorService; -import org.jclouds.http.internal.HttpWire; -import org.jclouds.io.ContentMetadataCodec; - -import com.google.appengine.api.urlfetch.HTTPRequest; -import com.google.appengine.api.urlfetch.HTTPResponse; -import com.google.appengine.api.urlfetch.URLFetchService; -import com.google.common.annotations.VisibleForTesting; - -/** - * Google App Engine version of {@link HttpCommandExecutorService} - */ -@SingleThreaded -@Singleton -public class GaeHttpCommandExecutorService extends BaseHttpCommandExecutorService { - //TODO: look up gae version - public static final String USER_AGENT = String.format("jclouds/%s urlfetch/%s", JcloudsVersion.get(), "1.6.5"); - - private final URLFetchService urlFetchService; - private final ConvertToGaeRequest convertToGaeRequest; - private final ConvertToJcloudsResponse convertToJcloudsResponse; - - @Inject - public GaeHttpCommandExecutorService(URLFetchService urlFetchService, HttpUtils utils, - ContentMetadataCodec contentMetadataCodec, - IOExceptionRetryHandler ioRetryHandler, DelegatingRetryHandler retryHandler, - DelegatingErrorHandler errorHandler, HttpWire wire, ConvertToGaeRequest convertToGaeRequest, - ConvertToJcloudsResponse convertToJcloudsResponse, - @Named(PROPERTY_IDEMPOTENT_METHODS) String idempotentMethods) { - super(utils, contentMetadataCodec, retryHandler, ioRetryHandler, errorHandler, wire, idempotentMethods); - this.urlFetchService = urlFetchService; - this.convertToGaeRequest = convertToGaeRequest; - this.convertToJcloudsResponse = convertToJcloudsResponse; - } - - @VisibleForTesting - protected HttpResponse convert(HTTPResponse gaeResponse) { - return convertToJcloudsResponse.apply(gaeResponse); - } - - @VisibleForTesting - protected HTTPRequest convert(HttpRequest request) throws IOException { - return convertToGaeRequest.apply(request); - } - - /** - * nothing to clean up. - */ - @Override - protected void cleanup(HTTPRequest nativeRequest) { - } - - @Override - protected HttpResponse invoke(HTTPRequest request) throws IOException { - return convert(urlFetchService.fetch(request)); - } -} diff --git a/drivers/gae/src/main/java/org/jclouds/gae/config/CurrentRequestExecutorServiceModule.java b/drivers/gae/src/main/java/org/jclouds/gae/config/CurrentRequestExecutorServiceModule.java deleted file mode 100644 index 1554390f76..0000000000 --- a/drivers/gae/src/main/java/org/jclouds/gae/config/CurrentRequestExecutorServiceModule.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * 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.gae.config; - -import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.concurrent.DynamicExecutors.newScalingThreadPool; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ThreadFactory; - -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.Constants; -import org.jclouds.concurrent.config.ConfiguresExecutorService; -import org.jclouds.concurrent.config.WithSubmissionTrace; - -import com.google.appengine.api.ThreadManager; -import com.google.apphosting.api.ApiProxy; -import com.google.common.annotations.Beta; -import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; -import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.common.util.concurrent.MoreExecutors; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; - -@Beta -@ConfiguresExecutorService -public class CurrentRequestExecutorServiceModule extends AbstractModule { - - private final Supplier memoizedCurrentRequestExecutorService; - - public CurrentRequestExecutorServiceModule() { - this(memoizedCurrentRequestExecutorService()); - } - - /** - * Used when you are creating multiple contexts in the same app. - * - * @param memoizedCurrentRequestExecutorService - * @see #memoizedCurrentRequestExecutorService - */ - public CurrentRequestExecutorServiceModule(Supplier memoizedCurrentRequestExecutorService) { - this.memoizedCurrentRequestExecutorService = memoizedCurrentRequestExecutorService; - } - - /** - * Used when you are creating multiple contexts in the same app. - * - * @param currentRequestExecutorService - * @see #currentRequestExecutorService - */ - public CurrentRequestExecutorServiceModule(ListeningExecutorService currentRequestExecutorService) { - this.memoizedCurrentRequestExecutorService = Suppliers.ofInstance(currentRequestExecutorService); - } - - @Override - protected void configure() { - } - - public static Supplier memoizedCurrentRequestExecutorService() { - return Suppliers.memoize(new Supplier() { - // important that these are lazy bound vs in configure, as GAE may not - // quite be initialized, yet! - @Override - public ListeningExecutorService get() { - return currentRequestExecutorService(); - } - - }); - - } - - public static ListeningExecutorService currentRequestExecutorService() { - ThreadFactory factory = checkNotNull(ThreadManager.currentRequestThreadFactory(), - "ThreadManager.currentRequestThreadFactory()"); - // GAE requests cannot exceed 10 threads per request - int maxThreads = 10; - long keepAlive = ApiProxy.getCurrentEnvironment().getRemainingMillis(); - ExecutorService pool = newScalingThreadPool(0, maxThreads, keepAlive, factory); - return WithSubmissionTrace.wrap(MoreExecutors.listeningDecorator(pool)); - } - - @Provides - @Singleton - @Named(Constants.PROPERTY_USER_THREADS) - protected final ListeningExecutorService userExecutor() { - return memoizedCurrentRequestExecutorService.get(); - } -} diff --git a/drivers/gae/src/main/java/org/jclouds/gae/config/GoogleAppEngineConfigurationModule.java b/drivers/gae/src/main/java/org/jclouds/gae/config/GoogleAppEngineConfigurationModule.java deleted file mode 100644 index fb6fd66fcb..0000000000 --- a/drivers/gae/src/main/java/org/jclouds/gae/config/GoogleAppEngineConfigurationModule.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * 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.gae.config; - -import static com.google.common.util.concurrent.MoreExecutors.newDirectExecutorService; - -import org.jclouds.concurrent.SingleThreaded; -import org.jclouds.concurrent.config.ConfiguresExecutorService; -import org.jclouds.concurrent.config.ExecutorServiceModule; -import org.jclouds.gae.GaeHttpCommandExecutorService; -import org.jclouds.http.HttpCommandExecutorService; -import org.jclouds.http.config.ConfiguresHttpCommandExecutorService; -import org.jclouds.predicates.SocketOpen; -import org.jclouds.predicates.SocketOpenUnsupported; - -import com.google.appengine.api.urlfetch.URLFetchService; -import com.google.appengine.api.urlfetch.URLFetchServiceFactory; -import com.google.common.base.Supplier; -import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.inject.AbstractModule; -import com.google.inject.Module; -import com.google.inject.Provides; -import com.google.inject.Scopes; - -/** - * Configures {@link GaeHttpCommandExecutorService}. - */ -@ConfiguresHttpCommandExecutorService -@ConfiguresExecutorService -@SingleThreaded -public class GoogleAppEngineConfigurationModule extends AbstractModule { - private final Module userExecutorModule; - - public GoogleAppEngineConfigurationModule() { - this(new ExecutorServiceModule(newDirectExecutorService())); - } - - /** - * Used when you are creating multiple contexts in the same app. - * - * @see CurrentRequestExecutorServiceModule#currentRequestExecutorService - */ - public GoogleAppEngineConfigurationModule(Module userExecutorModule) { - this.userExecutorModule = userExecutorModule; - } - - /** - * Used when you are creating multiple contexts in the same app. - * - * @param memoizedCurrentRequestExecutorService - * @see CurrentRequestExecutorServiceModule#memoizedCurrentRequestExecutorService - */ - public GoogleAppEngineConfigurationModule(Supplier memoizedCurrentRequestExecutorService) { - this.userExecutorModule = new CurrentRequestExecutorServiceModule(memoizedCurrentRequestExecutorService); - } - - @Override - protected void configure() { - install(userExecutorModule); - bind(SocketOpen.class).to(SocketOpenUnsupported.class).in(Scopes.SINGLETON); - bindHttpCommandExecutorService(); - } - - protected void bindHttpCommandExecutorService() { - bind(HttpCommandExecutorService.class).to(GaeHttpCommandExecutorService.class); - } - - @Provides - protected final URLFetchService provideURLFetchService() { - return URLFetchServiceFactory.getURLFetchService(); - } -} diff --git a/drivers/gae/src/test/java/org/jclouds/gae/ConvertToGaeRequestTest.java b/drivers/gae/src/test/java/org/jclouds/gae/ConvertToGaeRequestTest.java deleted file mode 100644 index 950df4f230..0000000000 --- a/drivers/gae/src/test/java/org/jclouds/gae/ConvertToGaeRequestTest.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * 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.gae; - -import static org.testng.Assert.assertEquals; - -import java.io.File; -import java.io.IOException; -import java.net.URI; -import java.security.NoSuchAlgorithmException; -import java.security.cert.CertificateException; -import java.util.Date; - -import javax.ws.rs.HttpMethod; - -import org.jclouds.crypto.Crypto; -import org.jclouds.date.internal.DateServiceDateCodecFactory; -import org.jclouds.date.internal.SimpleDateFormatDateService; -import org.jclouds.encryption.internal.JCECrypto; -import org.jclouds.http.HttpRequest; -import org.jclouds.http.HttpUtils; -import org.jclouds.io.ContentMetadataCodec.DefaultContentMetadataCodec; -import org.jclouds.io.Payloads; -import org.jclouds.util.Strings2; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Parameters; -import org.testng.annotations.Test; - -import com.google.appengine.api.urlfetch.HTTPHeader; -import com.google.appengine.api.urlfetch.HTTPRequest; -import com.google.appengine.repackaged.com.google.common.base.Charsets; -import com.google.common.base.Throwables; -import com.google.common.io.Files; -import com.google.common.net.HttpHeaders; - -@Test -public class ConvertToGaeRequestTest { - ConvertToGaeRequest req; - URI endPoint; - - protected static volatile Crypto crypto; - static { - try { - crypto = new JCECrypto(); - } catch (NoSuchAlgorithmException e) { - Throwables.propagate(e); - } catch (CertificateException e) { - Throwables.propagate(e); - } - } - - @BeforeTest - void setupClient() { - endPoint = URI.create("http://localhost:80/foo"); - req = new ConvertToGaeRequest(new HttpUtils(0, 0, 0, 0), new DefaultContentMetadataCodec( - new DateServiceDateCodecFactory(new SimpleDateFormatDateService()))); - } - - @Test - void testConvertRequestGetsTargetAndUri() throws IOException { - HttpRequest request = HttpRequest.builder().method(HttpMethod.GET).endpoint(endPoint).build(); - HTTPRequest gaeRequest = req.apply(request); - assertEquals(gaeRequest.getURL().getPath(), "/foo"); - } - - @Test - void testConvertRequestSetsFetchOptions() throws IOException { - HttpRequest request = HttpRequest.builder().method(HttpMethod.GET).endpoint(endPoint).build(); - HTTPRequest gaeRequest = req.apply(request); - assert gaeRequest.getFetchOptions() != null; - } - - @Test - void testConvertRequestSetsHeaders() throws IOException { - HttpRequest request = HttpRequest.builder() - .method(HttpMethod.GET) - .endpoint(endPoint) - .addHeader("foo", "bar").build(); - HTTPRequest gaeRequest = req.apply(request); - assertEquals(gaeRequest.getHeaders().get(0).getName(), "foo"); - assertEquals(gaeRequest.getHeaders().get(0).getValue(), "bar"); - } - - @Test - void testConvertRequestNoContent() throws IOException { - HttpRequest request = HttpRequest.builder().method(HttpMethod.GET).endpoint(endPoint).build(); - HTTPRequest gaeRequest = req.apply(request); - assert gaeRequest.getPayload() == null; - assertEquals(gaeRequest.getHeaders().size(), 1); // user agent - assertEquals(gaeRequest.getHeaders().get(0).getName(), HttpHeaders.USER_AGENT); - assertEquals(gaeRequest.getHeaders().get(0).getValue(), "jclouds/1.0 urlfetch/1.4.3"); - } - - @Test - void testConvertRequestStringContent() throws IOException { - HttpRequest request = HttpRequest.builder() - .method(HttpMethod.GET) - .endpoint(endPoint) - .payload("hoot!").build(); - testHoot(request); - } - - @Test - void testConvertRequestInputStreamContent() throws IOException { - HttpRequest request = HttpRequest.builder() - .method(HttpMethod.GET) - .endpoint(endPoint) - .payload(Strings2.toInputStream("hoot!")).build(); - request.getPayload().getContentMetadata().setContentLength(5L); - testHoot(request); - } - - @Test - void testConvertRequestBytesContent() throws IOException { - HttpRequest request = HttpRequest.builder() - .method(HttpMethod.GET) - .endpoint(endPoint) - .payload("hoot!".getBytes()).build(); - testHoot(request); - } - - @Test(expectedExceptions = UnsupportedOperationException.class) - void testConvertRequestBadContent() throws IOException { - HttpRequest request = HttpRequest.builder() - .method(HttpMethod.GET) - .endpoint(endPoint) - .payload(Payloads.newPayload(new Date())).build(); - req.apply(request); - } - - @Test - @Parameters("basedir") - void testConvertRequestFileContent(String basedir) throws IOException { - File file = new File(basedir, "target/testfiles/hoot"); - file.getParentFile().mkdirs(); - Files.write("hoot!".getBytes(Charsets.UTF_8), file); - HttpRequest request = HttpRequest.builder() - .method(HttpMethod.GET) - .endpoint(endPoint) - .payload(file).build(); - testHoot(request); - } - - private void testHoot(HttpRequest request) throws IOException { - request.getPayload().getContentMetadata().setContentType("text/plain"); - request.getPayload().getContentMetadata().setContentMD5(new byte[16]); - HTTPRequest gaeRequest = req.apply(request); - - StringBuilder builder = new StringBuilder(); - for (HTTPHeader header : gaeRequest.getHeaders()) { - builder.append(header.getName()).append(": ").append(header.getValue()).append("\n"); - } - assertEquals(builder.toString(), - // note content-length is prohibited in gae - "User-Agent: jclouds/1.0 urlfetch/1.4.3\n" + - "Expect: 100-continue\n" + - "Content-Type: text/plain\n" + - "Content-MD5: AAAAAAAAAAAAAAAAAAAAAA==\n"); - assertEquals(new String(gaeRequest.getPayload()), "hoot!"); - } -} diff --git a/drivers/gae/src/test/java/org/jclouds/gae/ConvertToJcloudsResponseTest.java b/drivers/gae/src/test/java/org/jclouds/gae/ConvertToJcloudsResponseTest.java deleted file mode 100644 index b313e1cec3..0000000000 --- a/drivers/gae/src/test/java/org/jclouds/gae/ConvertToJcloudsResponseTest.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * 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.gae; - -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.testng.Assert.assertEquals; - -import java.io.IOException; -import java.net.URI; -import java.security.NoSuchAlgorithmException; -import java.security.cert.CertificateException; -import java.util.List; - -import org.jclouds.crypto.Crypto; -import org.jclouds.date.internal.DateServiceDateCodecFactory; -import org.jclouds.date.internal.SimpleDateFormatDateService; -import org.jclouds.encryption.internal.JCECrypto; -import org.jclouds.http.HttpResponse; -import org.jclouds.io.ContentMetadataCodec.DefaultContentMetadataCodec; -import org.jclouds.util.Strings2; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; - -import com.google.appengine.api.urlfetch.HTTPHeader; -import com.google.appengine.api.urlfetch.HTTPResponse; -import com.google.common.base.Throwables; -import com.google.common.collect.Lists; -import com.google.common.net.HttpHeaders; - -@Test -public class ConvertToJcloudsResponseTest { - ConvertToJcloudsResponse req; - URI endPoint; - - protected static volatile Crypto crypto; - static { - try { - crypto = new JCECrypto(); - } catch (NoSuchAlgorithmException e) { - Throwables.propagate(e); - } catch (CertificateException e) { - Throwables.propagate(e); - } - } - - @BeforeTest - void setupClient() { - endPoint = URI.create("http://localhost:80/foo"); - req = new ConvertToJcloudsResponse(new DefaultContentMetadataCodec(new DateServiceDateCodecFactory( - new SimpleDateFormatDateService()))); - } - - @Test - void testConvertHostHeaderToEndPoint() { - // TODO - } - - @Test - void testConvertWithHeaders() throws IOException { - HTTPResponse gaeResponse = createMock(HTTPResponse.class); - expect(gaeResponse.getResponseCode()).andReturn(200); - List headers = Lists.newArrayList(); - headers.add(new HTTPHeader(HttpHeaders.CONTENT_TYPE, "text/xml")); - expect(gaeResponse.getHeaders()).andReturn(headers); - expect(gaeResponse.getContent()).andReturn(null).atLeastOnce(); - replay(gaeResponse); - HttpResponse response = req.apply(gaeResponse); - assertEquals(response.getStatusCode(), 200); - assertEquals(response.getPayload(), null); - assertEquals(response.getHeaders().size(), 0); - } - - @Test - void testConvertWithContent() throws IOException { - HTTPResponse gaeResponse = createMock(HTTPResponse.class); - expect(gaeResponse.getResponseCode()).andReturn(200); - List headers = Lists.newArrayList(); - headers.add(new HTTPHeader(HttpHeaders.CONTENT_TYPE, "text/xml")); - expect(gaeResponse.getHeaders()).andReturn(headers); - expect(gaeResponse.getContent()).andReturn("hello".getBytes()).atLeastOnce(); - replay(gaeResponse); - HttpResponse response = req.apply(gaeResponse); - assertEquals(response.getStatusCode(), 200); - assertEquals(Strings2.toStringAndClose(response.getPayload().openStream()), "hello"); - assertEquals(response.getHeaders().size(), 0); - assertEquals(response.getPayload().getContentMetadata().getContentType(), "text/xml"); - } - -} diff --git a/drivers/gae/src/test/java/org/jclouds/gae/GaeHttpCommandExecutorServiceIntegrationTest.java b/drivers/gae/src/test/java/org/jclouds/gae/GaeHttpCommandExecutorServiceIntegrationTest.java deleted file mode 100644 index c68451f29c..0000000000 --- a/drivers/gae/src/test/java/org/jclouds/gae/GaeHttpCommandExecutorServiceIntegrationTest.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * 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.gae; - -import java.io.IOException; -import java.util.Properties; - -import org.jclouds.gae.config.GoogleAppEngineConfigurationModule; -import org.jclouds.http.BaseHttpCommandExecutorServiceIntegrationTest; -import org.testng.SkipException; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import com.google.appengine.tools.development.testing.LocalServiceTestHelper; -import com.google.appengine.tools.development.testing.LocalURLFetchServiceTestConfig; -import com.google.inject.Module; - -/** - * - * Integration test for the URLFetchService - */ -@Test -public class GaeHttpCommandExecutorServiceIntegrationTest extends BaseHttpCommandExecutorServiceIntegrationTest { - - @BeforeMethod - public void setupApiProxy() { - LocalServiceTestHelper helper = new LocalServiceTestHelper(new LocalURLFetchServiceTestConfig()); - helper.setUp(); - } - - @Override - public void testPostAsInputStream() { - throw new SkipException("streams aren't supported"); - } - - @Override - public void testPostAsInputStreamDoesNotRetryOnFailure() throws Exception { - throw new SkipException("streams aren't supported"); - } - - @Override - public void testGetBigFile() { - throw new SkipException("test data is too big for GAE"); - } - - @Override - public void testUploadBigFile() throws IOException { - throw new SkipException("test data is too big for GAE"); - } - - protected Module createConnectionModule() { - setupApiProxy(); - return new GoogleAppEngineConfigurationModule(); - } - - @Override - protected void addOverrideProperties(Properties props) { - } -} diff --git a/drivers/gae/src/test/java/org/jclouds/gae/GaeSocketOpenTest.java b/drivers/gae/src/test/java/org/jclouds/gae/GaeSocketOpenTest.java deleted file mode 100644 index b2d8c408b2..0000000000 --- a/drivers/gae/src/test/java/org/jclouds/gae/GaeSocketOpenTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.gae; - -import static org.jclouds.providers.AnonymousProviderMetadata.forApiOnEndpoint; - -import org.jclouds.Context; -import org.jclouds.ContextBuilder; -import org.jclouds.gae.config.GoogleAppEngineConfigurationModule; -import org.jclouds.http.IntegrationTestClient; -import org.jclouds.predicates.SocketOpen; -import org.testng.annotations.Test; - -import com.google.common.collect.ImmutableSet; -import com.google.common.net.HostAndPort; - -public class GaeSocketOpenTest { - - @Test(expectedExceptions = UnsupportedOperationException.class) - public void testSocketOpenThrowsUnsupported() { - Context context = ContextBuilder.newBuilder(forApiOnEndpoint(IntegrationTestClient.class, "dummyurl")) - .modules(ImmutableSet.of(new GoogleAppEngineConfigurationModule())) - .build(); - - SocketOpen socketOpen = context.utils().injector().getInstance(SocketOpen.class); - socketOpen.apply(HostAndPort.fromParts("localhost", 22)); - } -} diff --git a/drivers/gae/src/test/resources/test.jks b/drivers/gae/src/test/resources/test.jks deleted file mode 100644 index e641fb5470345f3ca35830613ed9b69262d216ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1365 zcmezO_TO6u1_mY|W&~sQtmK^h(v)H#U+ewrt4%<;T?S1|+YI>FxU|_ASs1mL1Q{7w z8CaT_7X4Ljus&bM7w`G3R_(3u29fEzncQv)@!bD*c;iN|OyTaCv^yWbc>Mtj+(M{S-Vu20q*N)zqn_q`-X2 z8hMY*DUKKKZLNRXqHy-o*+{QNUpNXEurK%ZdFeV;*;k{=(Y{epu43Yo>AdUzt`Yk? zXWzDY78{gIO1x&Us2P_5b0D|`Qf~~ z56`1Z+rKVJQfT4&_ObWmKFt{p2U|5~->!Pel3)0dTXjiMN}|#;Cl)piCOP2dj)x3phObz8#Z{0-6N8|8mZvNl!Z;0Jv1*nFTXqw zCc=Rs!j2)rg(1R?A;Jt7F_07IH8e1=G_Wu*H8nRei2`zs3@nT+p*%u-MYn|K*vQGYLixsM| z56?Rk;-2c;(0P8(SLZqLiyj1Nsm3XYJUO*wd&7(w)4sUeYm}a1$i&RZz=-TTU}P}^ z-6ayRd0+pHZ##sz^PHWVg{8N?YfD*p@=y6r^9{%Ex+Dc~UUQ0zvukGjy7Sfd#6#iI zw?k@n)x4ERs&1;<{#*P+>;39$0aNG2@=iMNX5GbaetBlU`EGu-Haf&mV=2AJ;OAY9 zE;II>@59yw-#@nW_=iOu3#_hod~mte^}Wok#oapachehc bouncycastle enterprise - gae joda jsch log4j