Skip to content

Commit 4a1218e

Browse files
committed
working on external driver
1 parent 35f1177 commit 4a1218e

6 files changed

Lines changed: 297 additions & 1 deletion

File tree

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ More details (e.g., #LOCs and used databases) on these APIs can be found [in thi
7272

7373
### REST: Java/Kotlin
7474

75+
* Reservations API (not-known license), [jdk_11_gradle/cs/rest/reservations-api](jdk_11_gradle/cs/rest/reservations-api) , from [https://github.com/cyrilgavala/reservations-api](https://github.com/cyrilgavala/reservations-api)
76+
7577
* Genome Nexus (MIT), [jdk_8_maven/cs/rest-gui/genome-nexus](jdk_8_maven/cs/rest-gui/genome-nexus), from [https://github.com/genome-nexus/genome-nexus](https://github.com/genome-nexus/genome-nexus)
7678

7779
* Market (MIT), [jdk_11_maven/cs/rest-gui/market](jdk_11_maven/cs/rest-gui/market), from [https://github.com/aleksey-lukyanets/market](https://github.com/aleksey-lukyanets/market)

jdk_11_gradle/cs/rest/reservations-api/build.gradle

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,12 @@ jacocoTestCoverageVerification {
9797
}
9898

9999
check.dependsOn jacocoTestCoverageVerification
100+
101+
102+
tasks.named("bootJar") {
103+
archiveClassifier = 'sut'
104+
}
105+
106+
tasks.named("jar") {
107+
archiveClassifier = 'plain'
108+
}

jdk_11_gradle/em/embedded/rest/reservations-api/src/main/java/em/embedded/reservationsapi/EmbeddedEvoMasterController.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ public List<DbSpecification> getDbSpecifications() {
119119

120120
@Override
121121
public List<AuthenticationDto> getInfoForAuthentication() {
122+
//TODO might need to setup JWT headers here
122123
return null;
123124
}
124125

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import org.gradle.jvm.tasks.Jar
2+
3+
4+
repositories {
5+
mavenLocal()
6+
mavenCentral()
7+
maven( url ="https://jcenter.bintray.com")
8+
}
9+
10+
11+
plugins {
12+
`java-library`
13+
// id("io.spring.dependency-management") version "1.0.6.RELEASE"
14+
application
15+
// id("com.github.johnrengelman.shadow") version "4.0.2"
16+
}
17+
18+
configurations {
19+
implementation {
20+
resolutionStrategy.failOnVersionConflict()
21+
}
22+
}
23+
24+
java {
25+
sourceCompatibility = JavaVersion.VERSION_11
26+
targetCompatibility = JavaVersion.VERSION_11
27+
}
28+
29+
30+
//dependencyManagement {
31+
// imports {
32+
// mavenBom("io.micronaut:micronaut-bom:1.3.4")
33+
// }
34+
//}
35+
36+
val EVOMASTER_VERSION = "1.6.2-SNAPSHOT"
37+
38+
dependencies{
39+
implementation("org.evomaster:evomaster-client-java-controller:$EVOMASTER_VERSION")
40+
implementation("org.evomaster:evomaster-client-java-instrumentation:$EVOMASTER_VERSION")
41+
implementation("org.evomaster:evomaster-client-java-dependencies:$EVOMASTER_VERSION")
42+
implementation("org.mongodb:mongodb-driver-sync:4.4.2")
43+
}
44+
45+
46+
47+
val fatJar = task("fatJar", type = Jar::class) {
48+
baseName = "${project.name}-evomaster-runner"
49+
isZip64 = true
50+
manifest {
51+
attributes["Implementation-Title"] = "EM"
52+
attributes["Implementation-Version"] = "1.0"
53+
attributes["Main-Class"] = "em.external.reservationsapi.ExternalEvoMasterController"
54+
attributes["Premain-Class"] = "org.evomaster.client.java.instrumentation.InstrumentingAgent"
55+
attributes["Agent-Class"] = "org.evomaster.client.java.instrumentation.InstrumentingAgent"
56+
attributes["Can-Redefine-Classes"] = "true"
57+
attributes["Can-Retransform-Classes"] = "true"
58+
}
59+
from(configurations.runtimeClasspath.get().map{ if (it.isDirectory) it else zipTree(it) })
60+
with(tasks.jar.get() as CopySpec)
61+
}
62+
63+
tasks {
64+
"build" {
65+
dependsOn(fatJar)
66+
}
67+
}
Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
package em.external.reservationsapi;
2+
3+
import org.evomaster.client.java.controller.ExternalSutController;
4+
import org.evomaster.client.java.controller.InstrumentedSutStarter;
5+
import org.evomaster.client.java.controller.api.dto.AuthenticationDto;
6+
import org.evomaster.client.java.controller.api.dto.JsonTokenPostLoginDto;
7+
import org.evomaster.client.java.controller.api.dto.SutInfoDto;
8+
import org.evomaster.client.java.controller.api.dto.database.schema.DatabaseType;
9+
import org.evomaster.client.java.controller.db.DbCleaner;
10+
import org.evomaster.client.java.controller.db.SqlScriptRunnerCached;
11+
import org.evomaster.client.java.controller.internal.db.DbSpecification;
12+
import org.evomaster.client.java.controller.problem.GraphQlProblem;
13+
import org.evomaster.client.java.controller.problem.ProblemInfo;
14+
import org.evomaster.client.java.controller.problem.RestProblem;
15+
import org.testcontainers.containers.GenericContainer;
16+
17+
import java.sql.Connection;
18+
import java.sql.DriverManager;
19+
import java.sql.SQLException;
20+
import java.util.Arrays;
21+
import java.util.Collections;
22+
import java.util.List;
23+
24+
public class ExternalEvoMasterController extends ExternalSutController {
25+
26+
27+
public static void main(String[] args) {
28+
29+
int controllerPort = 40100;
30+
if (args.length > 0) {
31+
controllerPort = Integer.parseInt(args[0]);
32+
}
33+
int sutPort = 12345;
34+
if (args.length > 1) {
35+
sutPort = Integer.parseInt(args[1]);
36+
}
37+
String jarLocation = "cs/rest/reservations-api/build/libs";
38+
if (args.length > 2) {
39+
jarLocation = args[2];
40+
}
41+
if(! jarLocation.endsWith(".jar")) {
42+
jarLocation += "/reservations-api-sut.jar";
43+
}
44+
45+
int timeoutSeconds = 120;
46+
if(args.length > 3){
47+
timeoutSeconds = Integer.parseInt(args[3]);
48+
}
49+
String command = "java";
50+
if(args.length > 4){
51+
command = args[4];
52+
}
53+
54+
55+
ExternalEvoMasterController controller =
56+
new ExternalEvoMasterController(controllerPort, jarLocation,
57+
sutPort, timeoutSeconds, command);
58+
InstrumentedSutStarter starter = new InstrumentedSutStarter(controller);
59+
60+
starter.start();
61+
}
62+
63+
private final int timeoutSeconds;
64+
private final int sutPort;
65+
private String jarLocation;
66+
private static final int MONGODB_PORT = 27017;
67+
68+
//https://www.mongodb.com/docs/drivers/java/sync/current/compatibility/
69+
private static final String MONGODB_VERSION = "4.4";
70+
71+
private static final String MONGODB_DATABASE_NAME = "Reservations";
72+
73+
private static final GenericContainer mongodbContainer = new GenericContainer("mongo:" + MONGODB_VERSION)
74+
.withExposedPorts(MONGODB_PORT);
75+
76+
private String mongoDbUrl;
77+
78+
private MongoClient mongoClient;
79+
80+
81+
public ExternalEvoMasterController(){
82+
this(40100, "../core/target", 12345, 120, "java");
83+
}
84+
85+
public ExternalEvoMasterController(String jarLocation) {
86+
this();
87+
this.jarLocation = jarLocation;
88+
}
89+
90+
public ExternalEvoMasterController(
91+
int controllerPort, String jarLocation, int sutPort, int timeoutSeconds, String command
92+
) {
93+
94+
if(jarLocation==null || jarLocation.isEmpty()){
95+
throw new IllegalArgumentException("Missing jar location");
96+
}
97+
98+
99+
this.sutPort = sutPort;
100+
this.jarLocation = jarLocation;
101+
this.timeoutSeconds = timeoutSeconds;
102+
setControllerPort(controllerPort);
103+
setJavaCommand(command);
104+
}
105+
106+
107+
@Override
108+
public String[] getInputParameters() {
109+
return new String[]{
110+
"-micronaut.server.port="+sutPort,
111+
"-datasources.default.url=" + dbUrl()
112+
};
113+
}
114+
115+
public String[] getJVMParameters() {
116+
return new String[]{};
117+
}
118+
119+
private String dbUrl() {
120+
121+
String host = postgres.getContainerIpAddress();
122+
int port = postgres.getMappedPort(5432);
123+
124+
String url = "jdbc";
125+
url += ":postgresql://"+host+":"+port+"/patio";
126+
127+
return url;
128+
}
129+
130+
@Override
131+
public String getBaseURL() {
132+
return "http://localhost:" + sutPort;
133+
}
134+
135+
@Override
136+
public String getPathToExecutableJar() {
137+
return jarLocation;
138+
}
139+
140+
@Override
141+
public String getLogMessageOfInitializedServer() {
142+
return "Startup completed in";
143+
}
144+
145+
@Override
146+
public long getMaxAwaitForInitializationInSeconds() {
147+
return timeoutSeconds;
148+
}
149+
150+
@Override
151+
public void preStart() {
152+
postgres.start();
153+
}
154+
155+
@Override
156+
public void postStart() {
157+
closeDataBaseConnection();
158+
159+
try {
160+
sqlConnection = DriverManager.getConnection(dbUrl(), "patio", "patio");
161+
dbSpecification = Arrays.asList(new DbSpecification(DatabaseType.POSTGRES,sqlConnection)
162+
.withSchemas("public").withDisabledSmartClean());
163+
// initSqlOnResourcePath = "/initDb.sql";
164+
165+
} catch (Exception e) {
166+
throw new RuntimeException(e);
167+
}
168+
}
169+
170+
@Override
171+
public void resetStateOfSUT() {
172+
mongoClient.getDatabase(MONGODB_DATABASE_NAME).drop();
173+
}
174+
175+
@Override
176+
public void preStop() {
177+
closeDataBaseConnection();
178+
}
179+
180+
@Override
181+
public void postStop() {
182+
postgres.stop();
183+
}
184+
185+
186+
187+
@Override
188+
public String getPackagePrefixesToCover() {
189+
return "sk.cyrilgavala.reservationsApi.";
190+
}
191+
192+
@Override
193+
public ProblemInfo getProblemInfo() {
194+
return new RestProblem(
195+
"http://localhost:" + getSutPort() + "/v3/api-docs",
196+
null
197+
);
198+
}
199+
200+
@Override
201+
public SutInfoDto.OutputFormat getPreferredOutputFormat() {
202+
return SutInfoDto.OutputFormat.JAVA_JUNIT_5;
203+
}
204+
205+
206+
207+
@Override
208+
public List<AuthenticationDto> getInfoForAuthentication() {
209+
return null;
210+
}
211+
212+
@Override
213+
public List<DbSpecification> getDbSpecifications() {
214+
return null;
215+
}
216+
}

jdk_11_gradle/settings.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ include("em:embedded:graphql:patio-api")
55
include("em:external:graphql:patio-api")
66

77
include("cs:rest:reservations-api")
8-
include("em:embedded:rest:reservations-api")
8+
include("em:embedded:rest:reservations-api")
9+
include("em:external:rest:reservations-api")

0 commit comments

Comments
 (0)