Skip to content

Commit

Permalink
Create a test that compile native using graalVM
Browse files Browse the repository at this point in the history
  • Loading branch information
velo committed Jun 30, 2019
1 parent 9e94130 commit 88071e6
Show file tree
Hide file tree
Showing 13 changed files with 347 additions and 48 deletions.
49 changes: 49 additions & 0 deletions apt-generator/docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#
# Copyright 2012-2019 The Feign Authors
#
# Licensed 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.
#

# build native image
FROM oracle/graalvm-ce:19.0.0
LABEL vendor="The Last Pickle"

RUN gu install native-image

COPY reflectconfig.json .
COPY ${project.artifactId}-${project.version}.jar .

RUN native-image --verbose \
--no-fallback \
-H:ReflectionConfigurationFiles=reflectconfig.json \
-H:EnableURLProtocols=https \
-jar ${project.artifactId}-${project.version}.jar \
-cp ${project.artifactId}-${project.version}.jar



# test the native image
FROM ubuntu

COPY --from=0 /opt/graalvm-ce-19.0.0/jre/lib/amd64/libsunec.so /
COPY --from=0 /${project.artifactId}-${project.version} /

RUN /${project.artifactId}-${project.version}



# create docker image with native
FROM ubuntu

COPY --from=0 /opt/graalvm-ce-19.0.0/jre/lib/amd64/libsunec.so /
COPY --from=0 /${project.artifactId}-${project.version} /

CMD /${project.artifactId}-${project.version}
41 changes: 41 additions & 0 deletions apt-generator/docker/reflectconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
[
{
"name" : "example.github.Repository",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true
},
{
"name" : "example.github.Repository",
"fields" : [
{ "name" : "name" }
]
},
{
"name" : "example.github.Contributor",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true
},
{
"name" : "example.github.Contributor",
"fields" : [
{ "name" : "login" }
]
},
{
"name" : "example.github.GitHubClientError",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true
},
{
"name" : "example.github.GitHubClientError",
"fields" : [
{ "name" : "message" }
]
}
]
106 changes: 105 additions & 1 deletion apt-generator/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,118 @@
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-gson</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-example-github</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-exec</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<resources>
<resource>
<targetPath>docker</targetPath>
<filtering>true</filtering>
<!-- Replace maven properties in the docker file so we can get artifacts etc -->
<directory>${project.basedir}/docker</directory>
</resource>
<!-- need to manually specify the resources to copy because we have a manual setting above -->
<resource>
<directory>${basedir}/src/main/resources</directory>
</resource>
</resources>

<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>feign.aptgenerator.github.GitHubFactoryExample</mainClass>
</transformer>
</transformers>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.skife.maven</groupId>
<artifactId>really-executable-jar-maven-plugin</artifactId>
<version>1.5.0</version>
<configuration>
<programFile>github</programFile>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>really-executable-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>

<plugin>
<!-- used to create docker images -->
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<!-- docker file copied here after maven replaces properties -->
<dockerDirectory>${project.build.directory}/classes/docker/</dockerDirectory>

<!-- Pull image before build, otherwise end up with image not found if it was never downloaded before -->
<pullOnBuild>true</pullOnBuild>

<serverId>docker-hub</serverId>
<registryUrl>https://index.docker.io/v1/</registryUrl>
<imageName>feign-apt-generator/test</imageName>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.artifactId}-${project.version}.jar</include>
</resource>
</resources>
</configuration>
<executions>
<!-- see definition of how this runs above -->
<execution>
<phase>post-integration-test</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@

import java.util.Arrays;
import java.util.List;
import example.github.Contributor;
import example.github.GitHubExample.*;
import example.github.Issue;
import example.github.Repository;
import feign.*;
import feign.InvocationHandlerFactory.MethodHandler;
import feign.Request.HttpMethod;
Expand All @@ -27,7 +30,7 @@ public class GitHubFactory implements GitHub {
static {
final MethodMetadata md = new MethodMetadata();
__repos_metadata = md;
md.returnType(new TypeReference<List<GitHub.Repository>>() {}.getType());
md.returnType(new TypeReference<List<Repository>>() {}.getType());
md.configKey("GitHub#repos(String)");

md.template().method(HttpMethod.GET);
Expand All @@ -43,7 +46,7 @@ public class GitHubFactory implements GitHub {
static {
final MethodMetadata md = new MethodMetadata();
__contributors_metadata = md;
md.returnType(new TypeReference<List<GitHub.Contributor>>() {}.getType());
md.returnType(new TypeReference<List<Contributor>>() {}.getType());
md.configKey("GitHub#contributors(String,String)");

md.template().method(HttpMethod.GET);
Expand All @@ -62,7 +65,7 @@ public class GitHubFactory implements GitHub {
static {
final MethodMetadata md = new MethodMetadata();
__createIssue_metadata = md;
md.returnType(new TypeReference<List<GitHub.Contributor>>() {}.getType());
md.returnType(new TypeReference<List<Contributor>>() {}.getType());
md.configKey("GitHub#createIssue(Issue,String,String)");

md.template().method(HttpMethod.POST);
Expand Down Expand Up @@ -106,7 +109,7 @@ public GitHubFactory(FeignConfig feignConfig) {
}

@Override
public List<GitHub.Repository> repos(String owner) {
public List<Repository> repos(String owner) {
try {
return __repos_handler.invoke(owner);
} catch (final FeignException e) {
Expand All @@ -117,7 +120,7 @@ public List<GitHub.Repository> repos(String owner) {
}

@Override
public List<GitHub.Contributor> contributors(String owner, String repo) {
public List<Contributor> contributors(String owner, String repo) {
try {
return __contributors_handler.invoke(owner, repo);
} catch (final RuntimeException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@
*/
package feign.aptgenerator.github;

import com.google.gson.GsonBuilder;
import java.util.List;
import example.github.GitHubClientError;
import example.github.GitHubExample.GitHub;
import example.github.GitHubExample.GitHubClientError;
import example.github.GitHubExample.GitHubErrorDecoder;
import feign.FeignConfig;
import feign.Logger;
Expand All @@ -28,17 +29,18 @@
public class GitHubFactoryExample {

static FeignConfig config() {
final Decoder decoder = new GsonDecoder();
final Decoder decoder = new GsonDecoder(new GsonBuilder()
.create());
return FeignConfig.builder()
.decoder(decoder)
.errorDecoder(new GitHubErrorDecoder(decoder))
.logger(new Logger.ErrorLogger())
.logLevel(Logger.Level.BASIC)
.logLevel(Logger.Level.FULL)
.url("https://api.github.com")
.build();
}

public static void main(String... args) {
public static void main(String[] args) {
final GitHub github = new GitHubFactory(config());

System.out.println("Let's fetch and print a list of the contributors to this org.");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/**
* Copyright 2012-2019 The Feign Authors
*
* Licensed 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 feign.aptgenerator.github;

import static org.junit.Assert.assertThat;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.hamcrest.CoreMatchers;
import org.junit.Test;
import java.io.File;
import java.util.Arrays;

/**
* Run main for {@link GitHubFactoryExample}
*/
public class GitHubFactoryExampleIT {

@Test
public void runMain() throws Exception {
final String jar = Arrays.stream(new File("target").listFiles())
.filter(file -> file.getName().startsWith("feign-apt-generator")
&& file.getName().endsWith(".jar"))
.findFirst()
.map(File::getAbsolutePath)
.get();

final String line = "java -jar " + jar;
final CommandLine cmdLine = CommandLine.parse(line);
final int exitValue = new DefaultExecutor().execute(cmdLine);

assertThat(exitValue, CoreMatchers.equalTo(0));
}

}
18 changes: 18 additions & 0 deletions example-github/src/main/java/example/github/Contributor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/**
* Copyright 2012-2019 The Feign Authors
*
* Licensed 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 example.github;

public class Contributor {
public String login;
}
23 changes: 23 additions & 0 deletions example-github/src/main/java/example/github/GitHubClientError.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/**
* Copyright 2012-2019 The Feign Authors
*
* Licensed 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 example.github;

public class GitHubClientError extends RuntimeException {
private String message; // parsed from json

@Override
public String getMessage() {
return message;
}
}
Loading

0 comments on commit 88071e6

Please sign in to comment.