diff --git a/.gitignore b/.gitignore
index 48d318594..99eac4480 100644
--- a/.gitignore
+++ b/.gitignore
@@ -376,3 +376,18 @@ jdk_8_maven/em/external/rest/spring-batch-rest/target
/jdk_8_maven/cs/rest/original/spring-ecommerce/target
/jdk_8_maven/em/embedded/rest/spring-ecommerce/target
/jdk_8_maven/em/external/rest/spring-ecommerce/target
+
+/jdk_21_maven/cs/rest-gui/microcks/target
+/jdk_21_maven/cs/rest-gui/microcks/commons/model/target
+/jdk_21_maven/cs/rest-gui/microcks/commons/util/target
+/jdk_21_maven/cs/rest-gui/microcks/commons/util-el/target
+/jdk_21_maven/cs/rest-gui/microcks/distro/uber/target
+/jdk_21_maven/cs/rest-gui/microcks/distro/uber-async-minion/target
+/jdk_21_maven/cs/rest-gui/microcks/webapp/target
+/jdk_21_maven/cs/rest-gui/microcks/minions/async/target
+/jdk_21_maven/cs/rest-gui/microcks/webapp/src/main/webapp/.angular
+/jdk_21_maven/cs/rest-gui/microcks/webapp/src/main/webapp/dist
+/jdk_21_maven/cs/rest-gui/microcks/webapp/src/main/webapp/node_modules
+
+/jdk_21_maven/em/embedded/rest-gui/microcks/target
+/jdk_21_maven/em/external/rest-gui/microcks/target
\ No newline at end of file
diff --git a/README.md b/README.md
index c7be7fd51..0f7f25588 100644
--- a/README.md
+++ b/README.md
@@ -70,7 +70,7 @@ For simplicity, all schemas are also available as JSON/YML files under the folde
> **IMPORTANT**: More details (e.g., #LOCs and used databases) on these APIs can be found [in this table](statistics/table_emb.md).
-### REST: Java/Kotlin (35)
+### REST: Java/Kotlin (36)
* **Bibliothek** (MIT), [jdk_17_gradle/cs/rest/bibliothek](jdk_17_gradle/cs/rest/bibliothek), from [https://github.com/PaperMC/bibliothek](https://github.com/PaperMC/bibliothek)
@@ -96,6 +96,8 @@ For simplicity, all schemas are also available as JSON/YML files under the folde
* **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)
+* **Microcks** (Apache), [jdk_21_maven/cs/rest-gui/microcks](jdk_21_maven/cs/rest-gui/microcks), from [https://github.com/microcks/microcks](https://github.com/microcks/microcks)
+
* **NCS**, [jdk_8_maven/cs/rest/artificial/ncs](jdk_8_maven/cs/rest/artificial/ncs), (not-known license, artificial numerical examples coming from different sources)
* **News** (LGPL), [jdk_8_maven/cs/rest/artificial/news](jdk_8_maven/cs/rest/artificial/news), from [https://github.com/arcuri82/testing_security_development_enterprise_systems](https://github.com/arcuri82/testing_security_development_enterprise_systems)
diff --git a/auth/microcks-auth.yaml b/auth/microcks-auth.yaml
new file mode 100644
index 000000000..dece86673
--- /dev/null
+++ b/auth/microcks-auth.yaml
@@ -0,0 +1,17 @@
+auth:
+ - name: "ADMIN_1"
+ loginEndpointAuth:
+ payloadRaw: "username=admin&password=microcks123&grant_type=password&client_id=microcks-serviceaccount&client_secret=ab54d329-e435-41ae-a900-ec6b3fe15c54"
+ - name: "ADMIN_2"
+ loginEndpointAuth:
+ payloadRaw: "username=admin2&password=microcks123&grant_type=password&client_id=microcks-serviceaccount&client_secret=ab54d329-e435-41ae-a900-ec6b3fe15c54"
+
+authTemplate:
+ loginEndpointAuth:
+ verb: POST
+ externalEndpointURL: "http://localhost:8081/realms/microcks/protocol/openid-connect/token"
+ contentType: application/x-www-form-urlencoded
+ token:
+ extractFromField: /access_token
+ httpHeaderName: Authorization
+ headerPrefix: "Bearer "
\ No newline at end of file
diff --git a/dockerfiles/microcks.dockerfile b/dockerfiles/microcks.dockerfile
new file mode 100644
index 000000000..9572bc8bd
--- /dev/null
+++ b/dockerfiles/microcks.dockerfile
@@ -0,0 +1,17 @@
+FROM amazoncorretto:21-alpine-jdk
+
+COPY ./dist/microcks-sut.jar .
+COPY ./dist/jacocoagent.jar .
+
+
+
+#ENV TOOL="undefined"
+#ENV RUN="0"
+
+ENTRYPOINT \
+ java \
+# unfortunately dumponexit is completely unreliable in Docker :(
+# -javaagent:jacocoagent.jar=destfile=./jacoco/microcks__${TOOL}__${RUN}__jacoco.exec,append=false,dumponexit=true \
+ -javaagent:jacocoagent.jar=output=tcpserver,address=*,port=6300,append=false,dumponexit=false \
+ -DPOSTMAN_RUNNER_URL=http://postman:3000 -DSERVICES_UPDATE_INTERVAL='0 0 0/2 * * *' -DKEYCLOAK_URL=http://keycloak:8080 -DKEYCLOAK_PUBLIC_URL=http://localhost:${HOST_PORT:-8081} -DENABLE_CORS_POLICY=false -DCORS_REST_ALLOW_CREDENTIALS=true -DTEST_CALLBACK_URL=http://localhost:${HOST_PORT:-8080} -jar microcks-sut.jar \
+ --server.port=8080 --spring.profiles.active=prod --grpc.server.port=0 --spring.data.mongodb.uri=mongodb://mongodb:27017/test --spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:${HOST_PORT:-8081}/realms/microcks --spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://keycloak:${HOST_PORT:-8080}/realms/microcks/protocol/openid-connect/certs
\ No newline at end of file
diff --git a/dockerfiles/microcks.yaml b/dockerfiles/microcks.yaml
new file mode 100644
index 000000000..c2a9e7c15
--- /dev/null
+++ b/dockerfiles/microcks.yaml
@@ -0,0 +1,80 @@
+services:
+ sut-microcks:
+ build:
+ dockerfile: ./dockerfiles/microcks.dockerfile
+ context: ..
+# environment:
+# TOOL: ${TOOL:-undefined}
+# RUN: ${RUN:-0}
+ ports:
+ - "${HOST_PORT:-8080}:8080"
+ - "${JACOCO_PORT:-6300}:6300"
+# volumes:
+ # default env does not work on volumes
+# - ${JACOCODIR}:/jacoco
+
+ mongodb:
+ image: mongo:7.0
+ tmpfs:
+ - '/data/db'
+
+
+ environment:
+ MONGODB_REPLICA_SET_MODE: primary
+ ALLOW_EMPTY_PASSWORD: yes
+
+
+
+
+
+
+
+
+ keycloak:
+ image: quay.io/keycloak/keycloak:26.0.0
+
+
+ environment:
+ KEYCLOAK_ADMIN: 'admin'
+ KEYCLOAK_ADMIN_PASSWORD: 'admin'
+ KC_HEALTH_ENABLED: 'true'
+ KC_METRICS_ENABLED: 'true'
+
+
+
+ volumes:
+ - ../scripts/dockerize/data/additional_files/microcks/microcks-realm-sample.json:/opt/keycloak/data/import/microcks-realm.json
+
+
+
+ healthcheck:
+ test: ['CMD', 'sh', '-c', "echo -e 'GET /health/live HTTP/1.1\r\nHost: localhost\r\n\r\n' > /dev/tcp/localhost/9000"]
+ interval: 30s
+ timeout: 30s
+ retries: 3
+
+
+ ports:
+ - '${HOST_PORT:-8081}:8080'
+
+
+
+ command: ['start-dev', '--hostname=http://localhost:${HOST_PORT:-8081}', '--import-realm', '--health-enabled=true']
+
+
+ postman:
+ image: quay.io/microcks/microcks-postman-runtime:0.6.0
+
+
+
+
+ healthcheck:
+ test: ['CMD', 'curl', '-f', 'http://localhost:3000/health']
+ interval: 30s
+ timeout: 30s
+ retries: 3
+
+
+
+
+
diff --git a/jdk_21_maven/cs/rest-gui/microcks/pom.xml b/jdk_21_maven/cs/rest-gui/microcks/pom.xml
index 61eddc6ca..3e566bba6 100644
--- a/jdk_21_maven/cs/rest-gui/microcks/pom.xml
+++ b/jdk_21_maven/cs/rest-gui/microcks/pom.xml
@@ -102,32 +102,34 @@
deploy
-
- com.diffplug.spotless
- spotless-maven-plugin
- 2.39.0
-
-
-
-
-
- ${multi-project.rootdir}/eclipse-formatter.xml
-
-
- true
- 3
-
-
-
-
-
-
- check
-
- compile
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jdk_21_maven/cs/rest-gui/microcks/webapp/pom.xml b/jdk_21_maven/cs/rest-gui/microcks/webapp/pom.xml
index da19e3e00..c7e76477b 100644
--- a/jdk_21_maven/cs/rest-gui/microcks/webapp/pom.xml
+++ b/jdk_21_maven/cs/rest-gui/microcks/webapp/pom.xml
@@ -50,6 +50,13 @@
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+ 2.2.0
+
+
io.github.microcks
microcks-util
@@ -408,6 +415,11 @@
prod
+
+
+ true
+
+
@@ -510,7 +522,11 @@
--spring.profiles.active=prod
- exec
+
+ microcks
+ sut
+
+
diff --git a/jdk_21_maven/cs/rest-gui/pom.xml b/jdk_21_maven/cs/rest-gui/pom.xml
index 1631896b3..7168da37e 100644
--- a/jdk_21_maven/cs/rest-gui/pom.xml
+++ b/jdk_21_maven/cs/rest-gui/pom.xml
@@ -14,6 +14,7 @@
webgoat
+ microcks
diff --git a/jdk_21_maven/em/embedded/rest-gui/microcks/pom.xml b/jdk_21_maven/em/embedded/rest-gui/microcks/pom.xml
new file mode 100644
index 000000000..f6691151e
--- /dev/null
+++ b/jdk_21_maven/em/embedded/rest-gui/microcks/pom.xml
@@ -0,0 +1,64 @@
+
+
+
+ 4.0.0
+
+
+ evomaster-benchmark-jdk21-em-embedded-rest-gui-microcks
+ jar
+
+
+ org.evomaster
+ evomaster-benchmark-jdk21-em-embedded-rest-gui
+ 3.4.1-SNAPSHOT
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.3.10
+ pom
+ import
+
+
+
+
+
+
+ io.github.microcks
+ microcks-app
+ 1.12.2-SNAPSHOT
+
+
+ org.mongodb
+ mongodb-driver-sync
+ 5.0.1
+
+
+ org.mongodb
+ mongodb-driver-core
+ 5.0.1
+
+
+ com.mongodb
+ java-spring-boot-mongodb-starter
+ 1.0.0
+
+
+ org.testcontainers
+ testcontainers
+ compile
+
+
+ junit
+ junit
+ compile
+ 4.11
+
+
+
+
+
\ No newline at end of file
diff --git a/jdk_21_maven/em/embedded/rest-gui/microcks/src/main/java/em/embedded/microcks/EmbeddedEvoMasterController.java b/jdk_21_maven/em/embedded/rest-gui/microcks/src/main/java/em/embedded/microcks/EmbeddedEvoMasterController.java
new file mode 100644
index 000000000..7174e6126
--- /dev/null
+++ b/jdk_21_maven/em/embedded/rest-gui/microcks/src/main/java/em/embedded/microcks/EmbeddedEvoMasterController.java
@@ -0,0 +1,216 @@
+package em.embedded.microcks;
+
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+import io.github.microcks.MicrocksApplication;
+import org.evomaster.client.java.controller.AuthUtils;
+import org.evomaster.client.java.controller.EmbeddedSutController;
+import org.evomaster.client.java.controller.InstrumentedSutStarter;
+import org.evomaster.client.java.controller.api.dto.auth.AuthenticationDto;
+import org.evomaster.client.java.controller.api.dto.SutInfoDto;
+import org.evomaster.client.java.sql.DbSpecification;
+import org.evomaster.client.java.controller.problem.ProblemInfo;
+import org.evomaster.client.java.controller.problem.RestProblem;
+import org.springframework.boot.SpringApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.testcontainers.containers.BindMode;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.utility.DockerImageName;
+
+import java.time.Duration;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * Class used to start/stop the SUT. This will be controller by the EvoMaster process
+ */
+
+
+/**
+ * Class used to start/stop the SUT. This will be controller by the EvoMaster process
+ */
+public class EmbeddedEvoMasterController extends EmbeddedSutController {
+
+ public static void main(String[] args) {
+
+ int port = 40100;
+ if (args.length > 0) {
+ port = Integer.parseInt(args[0]);
+ }
+
+ EmbeddedEvoMasterController controller = new EmbeddedEvoMasterController(port);
+ InstrumentedSutStarter starter = new InstrumentedSutStarter(controller);
+
+ starter.start();
+ }
+
+
+ private ConfigurableApplicationContext ctx;
+
+ private static final int MONGODB_PORT = 27017;
+ private static final int KEYCLOAK_PORT = 8080;
+ private static final String ADMIN_USER = "admin";
+ private static final String ADMIN_PASSWORD = "admin";
+ private static final String REALM_JSON_PATH = "/opt/keycloak/data/import/microcks-realm.json";
+ private static final String POSTMAN_IMAGE = "quay.io/microcks/microcks-postman-runtime:0.6.0";
+ private static final int POSTMAN_PORT = 3000;
+
+ private static final String MONGODB_VERSION = "7.0";
+
+ private static final String MONGODB_DATABASE_NAME = "test";
+
+ private static final GenericContainer mongodbContainer = new GenericContainer("mongo:" + MONGODB_VERSION)
+ .withTmpFs(Collections.singletonMap("/data/db", "rw"))
+ .withExposedPorts(MONGODB_PORT);
+
+ private static final GenericContainer keycloakContainer = new GenericContainer(
+ DockerImageName.parse("quay.io/keycloak/keycloak:26.0.0")
+ )
+ .withExposedPorts(KEYCLOAK_PORT)
+ .withEnv("KEYCLOAK_ADMIN", ADMIN_USER)
+ .withEnv("KEYCLOAK_ADMIN_PASSWORD", ADMIN_PASSWORD)
+ .withEnv("KC_HEALTH_ENABLED", "true")
+ .withEnv("KC_METRICS_ENABLED", "true")
+ .withCommand(
+ "start-dev",
+ "--hostname-strict=false",
+ "--import-realm",
+ "--health-enabled=true"
+ )
+ .withClasspathResourceMapping("microcks-realm-sample.json", REALM_JSON_PATH, BindMode.READ_ONLY)
+ .waitingFor(Wait.forListeningPort());
+
+ private static final GenericContainer> postmanContainer = new GenericContainer<>(DockerImageName.parse(POSTMAN_IMAGE))
+ .withExposedPorts(POSTMAN_PORT)
+ .waitingFor(Wait.forHttp("/health")
+ .forPort(POSTMAN_PORT)
+ .withStartupTimeout(Duration.ofSeconds(30)))
+ .withStartupTimeout(Duration.ofSeconds(30));
+
+ private MongoClient mongoClient;
+
+ public EmbeddedEvoMasterController() {
+ this(0);
+ }
+
+ public EmbeddedEvoMasterController(int port) {
+ setControllerPort(port);
+ }
+
+
+ @Override
+ public String startSut() {
+
+ mongodbContainer.start();
+ keycloakContainer.start();
+ postmanContainer.start();
+
+ mongoClient = MongoClients.create("mongodb://" + mongodbContainer.getContainerIpAddress() + ":" + mongodbContainer.getMappedPort(MONGODB_PORT));
+
+ System.setProperty("POSTMAN_RUNNER_URL", "http://" + postmanContainer.getContainerIpAddress() + ":" + postmanContainer.getMappedPort(POSTMAN_PORT));
+ System.setProperty("SERVICES_UPDATE_INTERVAL", "0 0 0/2 * * *");
+ System.setProperty("KEYCLOAK_URL", "http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT));
+ System.setProperty("KEYCLOAK_PUBLIC_URL", "http://localhost:" + keycloakContainer.getMappedPort(KEYCLOAK_PORT));
+ System.setProperty("ENABLE_CORS_POLICY", "false");
+ System.setProperty("CORS_REST_ALLOW_CREDENTIALS", "true");
+
+ ctx = SpringApplication.run(MicrocksApplication.class,
+ new String[]{"--server.port=0",
+ "--spring.profiles.active=prod",
+ "--grpc.server.port=0",
+ "--spring.data.mongodb.uri=" + "mongodb://" + mongodbContainer.getContainerIpAddress() + ":" + mongodbContainer.getMappedPort(MONGODB_PORT) + "/" + MONGODB_DATABASE_NAME,
+ "--spring.security.oauth2.resourceserver.jwt.issuer-uri=http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT) + "/realms/microcks",
+ "--spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT) + "/realms/microcks/protocol/openid-connect/certs"
+ });
+
+ System.setProperty("TEST_CALLBACK_URL", "http://localhost:" + getSutPort());
+
+ return "http://localhost:" + getSutPort();
+ }
+
+ protected int getSutPort() {
+ return (Integer) ((Map) ctx.getEnvironment()
+ .getPropertySources().get("server.ports").getSource())
+ .get("local.server.port");
+ }
+
+
+ @Override
+ public boolean isSutRunning() {
+ return ctx != null && ctx.isRunning();
+ }
+
+ @Override
+ public void stopSut() {
+ ctx.stop();
+ ctx.close();
+
+ mongodbContainer.stop();
+ keycloakContainer.stop();
+ postmanContainer.stop();
+
+ }
+
+ @Override
+ public String getPackagePrefixesToCover() {
+ return "io.github.microcks.";
+ }
+
+ @Override
+ public void resetStateOfSUT() {
+ mongoClient.getDatabase(MONGODB_DATABASE_NAME).drop();
+ }
+
+
+ @Override
+ public List getDbSpecifications() {
+ return null;
+ }
+
+
+ @Override
+ public List getInfoForAuthentication() {
+ //http://localhost:{port}/realms/microcks/protocol/openid-connect/token
+ String postEndpoint = "http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT) + "/realms/microcks/protocol/openid-connect/token";
+
+ String payloadTemplate = "username=%s&password=microcks123&grant_type=password&client_id=microcks-serviceaccount&client_secret=ab54d329-e435-41ae-a900-ec6b3fe15c54";
+
+ return Arrays.asList(
+ AuthUtils.getForJsonToken("ADMIN",
+ postEndpoint,
+ String.format(payloadTemplate, "admin"),
+ "/access_token",
+ "Bearer ",
+ "application/x-www-form-urlencoded"),
+ AuthUtils.getForJsonToken("ADMIN_2",
+ postEndpoint,
+ String.format(payloadTemplate, "admin2"),
+ "/access_token",
+ "Bearer ",
+ "application/x-www-form-urlencoded")
+ );
+ }
+
+
+ @Override
+ public ProblemInfo getProblemInfo() {
+ return new RestProblem(
+ "http://localhost:" + getSutPort() + "/v3/api-docs",
+ null
+ );
+ }
+
+ @Override
+ public SutInfoDto.OutputFormat getPreferredOutputFormat() {
+ return SutInfoDto.OutputFormat.JAVA_JUNIT_5;
+ }
+
+ @Override
+ public Object getMongoConnection() {
+ return mongoClient;
+ }
+}
diff --git a/jdk_21_maven/em/embedded/rest-gui/microcks/src/main/resources/microcks-realm-sample.json b/jdk_21_maven/em/embedded/rest-gui/microcks/src/main/resources/microcks-realm-sample.json
new file mode 100644
index 000000000..177a6ba45
--- /dev/null
+++ b/jdk_21_maven/em/embedded/rest-gui/microcks/src/main/resources/microcks-realm-sample.json
@@ -0,0 +1,176 @@
+{
+ "id": "microcks",
+ "realm": "microcks",
+ "displayName": "Microcks",
+ "enabled": true,
+ "sslRequired": "none",
+ "registrationAllowed": false,
+ "users" : [
+ {
+ "username" : "admin",
+ "enabled": true,
+ "credentials" : [
+ { "type" : "password",
+ "value" : "microcks123" }
+ ],
+ "realmRoles": [],
+ "applicationRoles": {
+ "realm-management": [ "manage-users", "manage-clients" ],
+ "account": [ "manage-account" ],
+ "microcks-app": [ "user", "manager", "admin"]
+ }
+ },
+ {
+ "username" : "admin2",
+ "enabled": true,
+ "credentials" : [
+ { "type" : "password",
+ "value" : "microcks123" }
+ ],
+ "realmRoles": [],
+ "applicationRoles": {
+ "realm-management": [ "manage-users", "manage-clients" ],
+ "account": [ "manage-account" ],
+ "microcks-app": [ "user", "manager", "admin"]
+ }
+ },
+ {
+ "username": "service-account-microcks-serviceaccount",
+ "enabled": true,
+ "serviceAccountClientId": "microcks-serviceaccount",
+ "clientRoles": {
+ "microcks-app": ["manager"]
+ }
+ }
+ ],
+ "roles": {
+ "realm": [],
+ "client": {
+ "microcks-app": [
+ {
+ "name": "user",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "microcks"
+ },
+ {
+ "name": "admin",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "microcks"
+ },
+ {
+ "name": "manager",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "microcks"
+ }
+ ]
+ }
+ },
+ "groups": [
+ {
+ "name": "microcks",
+ "path": "/microcks",
+ "attributes": {},
+ "realmRoles": [],
+ "clientRoles": {},
+ "subGroups": [
+ {
+ "name": "manager",
+ "path": "/microcks/manager",
+ "attributes": {},
+ "realmRoles": [],
+ "clientRoles": {},
+ "subGroups": []
+ }
+ ]
+ }
+ ],
+ "defaultRoles": [],
+ "requiredCredentials": [ "password" ],
+ "scopeMappings": [],
+ "clientScopeMappings": {
+ "microcks-app": [
+ {
+ "client": "microcks-app-js",
+ "roles": [
+ "manager",
+ "admin",
+ "user"
+ ]
+ }
+ ],
+ "realm-management": [
+ {
+ "client": "microcks-app-js",
+ "roles": [
+ "manage-users",
+ "manage-clients"
+ ]
+ }
+ ]
+ },
+ "clients": [
+ {
+ "clientId": "microcks-app-js",
+ "enabled": true,
+ "publicClient": true,
+ "redirectUris": [
+ "*"
+ ],
+ "webOrigins": [
+ "*"
+ ],
+ "fullScopeAllowed": false,
+ "protocolMappers": [
+ {
+ "name": "microcks-group-mapper",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-group-membership-mapper",
+ "consentRequired": false,
+ "config": {
+ "full.path": "true",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "microcks-groups",
+ "userinfo.token.claim": "true"
+ }
+ }
+ ]
+ }
+ ],
+ "applications": [
+ {
+ "name": "microcks-app",
+ "enabled": true,
+ "bearerOnly": true,
+ "defaultRoles": [
+ "user"
+ ]
+ },
+ {
+ "name": "microcks-serviceaccount",
+ "secret": "ab54d329-e435-41ae-a900-ec6b3fe15c54",
+ "enabled": true,
+ "bearerOnly": false,
+ "publicClient": false,
+ "standardFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": true,
+ "clientAuthenticatorType": "client-secret"
+ }
+ ],
+ "requiredActions": [
+ {
+ "alias": "VERIFY_PROFILE",
+ "name": "Verify Profile",
+ "providerId": "VERIFY_PROFILE",
+ "enabled": false,
+ "defaultAction": false,
+ "priority": 90,
+ "config": {}
+ }
+ ],
+ "keycloakVersion": "10.0.1"
+}
diff --git a/jdk_21_maven/em/embedded/rest-gui/pom.xml b/jdk_21_maven/em/embedded/rest-gui/pom.xml
index fcb11b60b..720eb346a 100644
--- a/jdk_21_maven/em/embedded/rest-gui/pom.xml
+++ b/jdk_21_maven/em/embedded/rest-gui/pom.xml
@@ -13,6 +13,7 @@
webgoat
+ microcks
diff --git a/jdk_21_maven/em/external/rest-gui/microcks/pom.xml b/jdk_21_maven/em/external/rest-gui/microcks/pom.xml
new file mode 100644
index 000000000..f4190e175
--- /dev/null
+++ b/jdk_21_maven/em/external/rest-gui/microcks/pom.xml
@@ -0,0 +1,76 @@
+
+
+
+ 4.0.0
+
+ evomaster-benchmark-jdk21-em-external-rest-gui-microcks
+ jar
+
+
+ org.evomaster
+ evomaster-benchmark-jdk21-em-external-rest-gui
+ 3.4.1-SNAPSHOT
+
+
+
+
+
+ org.testcontainers
+ testcontainers
+ compile
+
+
+ junit
+ junit
+ compile
+ 4.11
+
+
+ org.mongodb
+ mongodb-driver-sync
+ 5.0.1
+
+
+ org.mongodb
+ mongodb-driver-core
+ 5.0.1
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+
+
+ package
+
+ shade
+
+
+ microcks-evomaster-runner
+
+
+
+ em.external.microcks.ExternalEvoMasterController
+
+ org.evomaster.client.java.instrumentation.InstrumentingAgent
+
+ org.evomaster.client.java.instrumentation.InstrumentingAgent
+
+ true
+ true
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jdk_21_maven/em/external/rest-gui/microcks/src/main/java/em/external/microcks/ExternalEvoMasterController.java b/jdk_21_maven/em/external/rest-gui/microcks/src/main/java/em/external/microcks/ExternalEvoMasterController.java
new file mode 100644
index 000000000..ca7474f6d
--- /dev/null
+++ b/jdk_21_maven/em/external/rest-gui/microcks/src/main/java/em/external/microcks/ExternalEvoMasterController.java
@@ -0,0 +1,301 @@
+package em.external.microcks;
+
+
+import com.github.dockerjava.api.model.ExposedPort;
+import com.github.dockerjava.api.model.HostConfig;
+import com.github.dockerjava.api.model.PortBinding;
+import com.github.dockerjava.api.model.Ports;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+import org.evomaster.client.java.controller.AuthUtils;
+import org.evomaster.client.java.controller.ExternalSutController;
+import org.evomaster.client.java.controller.InstrumentedSutStarter;
+import org.evomaster.client.java.controller.api.dto.auth.AuthenticationDto;
+import org.evomaster.client.java.controller.api.dto.SutInfoDto;
+import org.evomaster.client.java.sql.DbSpecification;
+import org.evomaster.client.java.controller.problem.ProblemInfo;
+import org.evomaster.client.java.controller.problem.RestProblem;
+import org.testcontainers.containers.BindMode;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.utility.DockerImageName;
+
+import java.sql.Connection;
+import java.time.Duration;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+public class ExternalEvoMasterController extends ExternalSutController {
+
+ private static final int DEFAULT_CONTROLLER_PORT = 40100;
+
+ private static final int DEFAULT_SUT_PORT = 12345;
+
+ private static final String MONGODB_VERSION = "7.0";
+
+ private static final int KEYCLOAK_PORT = 8080;
+ private static final String ADMIN_USER = "admin";
+ private static final String ADMIN_PASSWORD = "admin";
+ private static final String REALM_JSON_PATH = "/opt/keycloak/data/import/microcks-realm.json";
+ private static final String POSTMAN_IMAGE = "quay.io/microcks/microcks-postman-runtime:0.6.0";
+ private static final int POSTMAN_PORT = 3000;
+ private static final int MONGODB_PORT = 27017;
+
+ private static final String MONGODB_DATABASE_NAME = "test";
+
+
+ public static void main(String[] args) {
+
+ int controllerPort = DEFAULT_CONTROLLER_PORT;
+ if (args.length > 0) {
+ controllerPort = Integer.parseInt(args[0]);
+ }
+ int sutPort = DEFAULT_SUT_PORT;
+ if (args.length > 1) {
+ sutPort = Integer.parseInt(args[1]);
+ }
+ String jarLocation = "cs/rest-gui/microcks/webapp/target";
+ if (args.length > 2) {
+ jarLocation = args[2];
+ }
+ if (!jarLocation.endsWith(".jar")) {
+ jarLocation += "/microcks-sut.jar";
+ }
+
+ int timeoutSeconds = 120;
+ if (args.length > 3) {
+ timeoutSeconds = Integer.parseInt(args[3]);
+ }
+
+ String command = "java";
+ if (args.length > 4) {
+ command = args[4];
+ }
+
+ ExternalEvoMasterController controller =
+ new ExternalEvoMasterController(controllerPort, jarLocation, sutPort, timeoutSeconds, command);
+ InstrumentedSutStarter starter = new InstrumentedSutStarter(controller);
+
+ starter.start();
+ }
+
+
+ private final int timeoutSeconds;
+
+ private final int sutPort;
+
+
+ private String jarLocation;
+ private Connection sqlConnection;
+ private List dbSpecification;
+
+ private MongoClient mongoClient;
+
+ private final GenericContainer> mongodb;
+ private final GenericContainer> keycloakContainer;
+ private final GenericContainer> postmanContainer;
+
+ public ExternalEvoMasterController() {
+ this(DEFAULT_CONTROLLER_PORT, "cs/rest-gui/microcks/webapp/target/microcks-sut.jar", DEFAULT_SUT_PORT, 120, "java");
+ }
+
+ public ExternalEvoMasterController(String jarLocation) {
+ this();
+ this.jarLocation = jarLocation;
+ }
+
+ public ExternalEvoMasterController(int controllerPort, String jarLocation, int sutPort, int timeoutSeconds, String command) {
+ this.sutPort = sutPort;
+ this.jarLocation = jarLocation;
+ this.timeoutSeconds = timeoutSeconds;
+ setControllerPort(controllerPort);
+
+ this.mongodb = new GenericContainer<>("mongo:" + MONGODB_VERSION)
+ .withTmpFs(Collections.singletonMap("/data/db", "rw"))
+ .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(
+ new HostConfig()
+ .withPortBindings(new PortBinding(
+ Ports.Binding.bindPort(sutPort + 3),
+ new ExposedPort(MONGODB_PORT)
+ ))
+ ))
+ .withExposedPorts(MONGODB_PORT);
+
+ this.keycloakContainer = new GenericContainer<>(
+ DockerImageName.parse("quay.io/keycloak/keycloak:26.0.0")
+ )
+ .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(
+ new HostConfig()
+ .withPortBindings(new PortBinding(
+ Ports.Binding.bindPort(sutPort + 2),
+ new ExposedPort(KEYCLOAK_PORT)
+ ))
+ ))
+ .withExposedPorts(KEYCLOAK_PORT)
+ .withEnv("KEYCLOAK_ADMIN", ADMIN_USER)
+ .withEnv("KEYCLOAK_ADMIN_PASSWORD", ADMIN_PASSWORD)
+ .withEnv("KC_HEALTH_ENABLED", "true")
+ .withEnv("KC_METRICS_ENABLED", "true")
+ .withCommand(
+ "start-dev",
+ "--hostname-strict=false",
+ "--import-realm",
+ "--health-enabled=true"
+ )
+ .withClasspathResourceMapping("microcks-realm-sample.json", REALM_JSON_PATH, BindMode.READ_ONLY)
+ .waitingFor(Wait.forListeningPort());
+
+ this.postmanContainer = new GenericContainer<>(DockerImageName.parse(POSTMAN_IMAGE))
+ .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(
+ new HostConfig()
+ .withPortBindings(new PortBinding(
+ Ports.Binding.bindPort(sutPort + 1),
+ new ExposedPort(POSTMAN_PORT)
+ ))
+ ))
+ .withExposedPorts(POSTMAN_PORT)
+ .waitingFor(Wait.forHttp("/health")
+ .forPort(POSTMAN_PORT)
+ .withStartupTimeout(Duration.ofSeconds(30)))
+ .withStartupTimeout(Duration.ofSeconds(30));
+ this.setNeedsJdk17Options(true);
+ setJavaCommand(command);
+ }
+
+ @Override
+ public String[] getInputParameters() {
+ return new String[]{"--server.port="+sutPort,
+ "--spring.profiles.active=prod",
+ "--grpc.server.port=0",
+ "--spring.data.mongodb.uri=" + "mongodb://" + mongodb.getContainerIpAddress() + ":" + mongodb.getMappedPort(MONGODB_PORT) + "/" + MONGODB_DATABASE_NAME,
+ "--spring.security.oauth2.resourceserver.jwt.issuer-uri=http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT) + "/realms/microcks",
+ "--spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT) + "/realms/microcks/protocol/openid-connect/certs"
+ };
+ }
+
+ @Override
+ public String[] getJVMParameters() {
+ return new String[]{
+ "-DPOSTMAN_RUNNER_URL="+"http://" + postmanContainer.getContainerIpAddress() + ":" + postmanContainer.getMappedPort(POSTMAN_PORT),
+ "-DSERVICES_UPDATE_INTERVAL='0 0 0/2 * * *'",
+ "-DKEYCLOAK_URL=" + "http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT),
+ "-DKEYCLOAK_PUBLIC_URL=" + "http://localhost:" + keycloakContainer.getMappedPort(KEYCLOAK_PORT),
+ "-DENABLE_CORS_POLICY=false",
+ "-DCORS_REST_ALLOW_CREDENTIALS=true",
+ "-DTEST_CALLBACK_URL=" + "http://localhost:" + sutPort
+ };
+ }
+
+
+ @Override
+ public String getBaseURL() {
+ return "http://localhost:" + sutPort;
+ }
+
+ @Override
+ public String getPathToExecutableJar() {
+ return jarLocation;
+ }
+
+ @Override
+ public String getLogMessageOfInitializedServer() {
+ return "Started MicrocksApplication in ";
+ }
+
+ @Override
+ public long getMaxAwaitForInitializationInSeconds() {
+ return timeoutSeconds;
+ }
+
+ @Override
+ public void preStart() {
+
+ mongodb.start();
+ postmanContainer.start();
+ keycloakContainer.start();
+
+ try {
+ mongoClient = MongoClients.create("mongodb://" + mongodb.getContainerIpAddress() + ":" + mongodb.getMappedPort(MONGODB_PORT));
+ } catch (Exception e) {
+ System.out.println("ERROR: " + e.getMessage());
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ @Override
+ public void postStart() {
+
+ }
+
+ @Override
+ public void preStop() {
+
+ }
+
+ @Override
+ public void postStop() {
+ mongodb.stop();
+ keycloakContainer.stop();
+ postmanContainer.stop();
+ }
+
+ @Override
+ public String getPackagePrefixesToCover() {
+ return "io.github.microcks.";
+ }
+
+ public void resetStateOfSUT() {
+ mongoClient.getDatabase(MONGODB_DATABASE_NAME).drop();
+ }
+
+ @Override
+ public ProblemInfo getProblemInfo() {
+ return new RestProblem(
+ getBaseURL() + "/v3/api-docs",
+ null
+ );
+ }
+
+ @Override
+ public SutInfoDto.OutputFormat getPreferredOutputFormat() {
+ return SutInfoDto.OutputFormat.JAVA_JUNIT_5;
+ }
+
+ @Override
+ public List getInfoForAuthentication() {
+ //http://localhost:{port}/realms/microcks/protocol/openid-connect/token
+ String postEndpoint = "http://" + keycloakContainer.getContainerIpAddress() + ":" + keycloakContainer.getMappedPort(KEYCLOAK_PORT) + "/realms/microcks/protocol/openid-connect/token";
+
+ String payloadTemplate = "username=%s&password=microcks123&grant_type=password&client_id=microcks-serviceaccount&client_secret=ab54d329-e435-41ae-a900-ec6b3fe15c54";
+
+ return Arrays.asList(
+ AuthUtils.getForJsonToken("ADMIN",
+ postEndpoint,
+ String.format(payloadTemplate, "admin"),
+ "/access_token",
+ "Bearer ",
+ "application/x-www-form-urlencoded"),
+ AuthUtils.getForJsonToken("ADMIN_2",
+ postEndpoint,
+ String.format(payloadTemplate, "admin2"),
+ "/access_token",
+ "Bearer ",
+ "application/x-www-form-urlencoded")
+ );
+ }
+
+
+ @Override
+ public List getDbSpecifications() {
+ return dbSpecification;
+ }
+
+ @Override
+ public Object getMongoConnection() {
+ return mongoClient;
+ }
+
+
+}
diff --git a/jdk_21_maven/em/external/rest-gui/microcks/src/main/resources/microcks-realm-sample.json b/jdk_21_maven/em/external/rest-gui/microcks/src/main/resources/microcks-realm-sample.json
new file mode 100644
index 000000000..177a6ba45
--- /dev/null
+++ b/jdk_21_maven/em/external/rest-gui/microcks/src/main/resources/microcks-realm-sample.json
@@ -0,0 +1,176 @@
+{
+ "id": "microcks",
+ "realm": "microcks",
+ "displayName": "Microcks",
+ "enabled": true,
+ "sslRequired": "none",
+ "registrationAllowed": false,
+ "users" : [
+ {
+ "username" : "admin",
+ "enabled": true,
+ "credentials" : [
+ { "type" : "password",
+ "value" : "microcks123" }
+ ],
+ "realmRoles": [],
+ "applicationRoles": {
+ "realm-management": [ "manage-users", "manage-clients" ],
+ "account": [ "manage-account" ],
+ "microcks-app": [ "user", "manager", "admin"]
+ }
+ },
+ {
+ "username" : "admin2",
+ "enabled": true,
+ "credentials" : [
+ { "type" : "password",
+ "value" : "microcks123" }
+ ],
+ "realmRoles": [],
+ "applicationRoles": {
+ "realm-management": [ "manage-users", "manage-clients" ],
+ "account": [ "manage-account" ],
+ "microcks-app": [ "user", "manager", "admin"]
+ }
+ },
+ {
+ "username": "service-account-microcks-serviceaccount",
+ "enabled": true,
+ "serviceAccountClientId": "microcks-serviceaccount",
+ "clientRoles": {
+ "microcks-app": ["manager"]
+ }
+ }
+ ],
+ "roles": {
+ "realm": [],
+ "client": {
+ "microcks-app": [
+ {
+ "name": "user",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "microcks"
+ },
+ {
+ "name": "admin",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "microcks"
+ },
+ {
+ "name": "manager",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "microcks"
+ }
+ ]
+ }
+ },
+ "groups": [
+ {
+ "name": "microcks",
+ "path": "/microcks",
+ "attributes": {},
+ "realmRoles": [],
+ "clientRoles": {},
+ "subGroups": [
+ {
+ "name": "manager",
+ "path": "/microcks/manager",
+ "attributes": {},
+ "realmRoles": [],
+ "clientRoles": {},
+ "subGroups": []
+ }
+ ]
+ }
+ ],
+ "defaultRoles": [],
+ "requiredCredentials": [ "password" ],
+ "scopeMappings": [],
+ "clientScopeMappings": {
+ "microcks-app": [
+ {
+ "client": "microcks-app-js",
+ "roles": [
+ "manager",
+ "admin",
+ "user"
+ ]
+ }
+ ],
+ "realm-management": [
+ {
+ "client": "microcks-app-js",
+ "roles": [
+ "manage-users",
+ "manage-clients"
+ ]
+ }
+ ]
+ },
+ "clients": [
+ {
+ "clientId": "microcks-app-js",
+ "enabled": true,
+ "publicClient": true,
+ "redirectUris": [
+ "*"
+ ],
+ "webOrigins": [
+ "*"
+ ],
+ "fullScopeAllowed": false,
+ "protocolMappers": [
+ {
+ "name": "microcks-group-mapper",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-group-membership-mapper",
+ "consentRequired": false,
+ "config": {
+ "full.path": "true",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "microcks-groups",
+ "userinfo.token.claim": "true"
+ }
+ }
+ ]
+ }
+ ],
+ "applications": [
+ {
+ "name": "microcks-app",
+ "enabled": true,
+ "bearerOnly": true,
+ "defaultRoles": [
+ "user"
+ ]
+ },
+ {
+ "name": "microcks-serviceaccount",
+ "secret": "ab54d329-e435-41ae-a900-ec6b3fe15c54",
+ "enabled": true,
+ "bearerOnly": false,
+ "publicClient": false,
+ "standardFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": true,
+ "clientAuthenticatorType": "client-secret"
+ }
+ ],
+ "requiredActions": [
+ {
+ "alias": "VERIFY_PROFILE",
+ "name": "Verify Profile",
+ "providerId": "VERIFY_PROFILE",
+ "enabled": false,
+ "defaultAction": false,
+ "priority": 90,
+ "config": {}
+ }
+ ],
+ "keycloakVersion": "10.0.1"
+}
diff --git a/jdk_21_maven/em/external/rest-gui/pom.xml b/jdk_21_maven/em/external/rest-gui/pom.xml
index a8d17d62e..c4028bd67 100644
--- a/jdk_21_maven/em/external/rest-gui/pom.xml
+++ b/jdk_21_maven/em/external/rest-gui/pom.xml
@@ -14,6 +14,7 @@
webgoat
+ microcks
\ No newline at end of file
diff --git a/scripts/dist.py b/scripts/dist.py
index 7171c03d8..6b0314ec9 100755
--- a/scripts/dist.py
+++ b/scripts/dist.py
@@ -292,6 +292,9 @@ def build_jdk_21_maven():
copy(folder + "/cs/rest-gui/webgoat/target/webgoat-sut.jar", DIST)
copy(folder + "/em/external/rest-gui/webgoat/target/webgoat-evomaster-runner.jar", DIST)
+ copy(folder + "/cs/rest-gui/microcks/webapp/target/microcks-sut.jar", DIST)
+ copy(folder + "/em/external/rest-gui/microcks/target/microcks-evomaster-runner.jar", DIST)
+
####################
def call_gradle(java_home, folder):
env_vars = os.environ.copy()
diff --git a/scripts/dockerize/data/additional_files/microcks/microcks-realm-sample.json b/scripts/dockerize/data/additional_files/microcks/microcks-realm-sample.json
new file mode 100644
index 000000000..177a6ba45
--- /dev/null
+++ b/scripts/dockerize/data/additional_files/microcks/microcks-realm-sample.json
@@ -0,0 +1,176 @@
+{
+ "id": "microcks",
+ "realm": "microcks",
+ "displayName": "Microcks",
+ "enabled": true,
+ "sslRequired": "none",
+ "registrationAllowed": false,
+ "users" : [
+ {
+ "username" : "admin",
+ "enabled": true,
+ "credentials" : [
+ { "type" : "password",
+ "value" : "microcks123" }
+ ],
+ "realmRoles": [],
+ "applicationRoles": {
+ "realm-management": [ "manage-users", "manage-clients" ],
+ "account": [ "manage-account" ],
+ "microcks-app": [ "user", "manager", "admin"]
+ }
+ },
+ {
+ "username" : "admin2",
+ "enabled": true,
+ "credentials" : [
+ { "type" : "password",
+ "value" : "microcks123" }
+ ],
+ "realmRoles": [],
+ "applicationRoles": {
+ "realm-management": [ "manage-users", "manage-clients" ],
+ "account": [ "manage-account" ],
+ "microcks-app": [ "user", "manager", "admin"]
+ }
+ },
+ {
+ "username": "service-account-microcks-serviceaccount",
+ "enabled": true,
+ "serviceAccountClientId": "microcks-serviceaccount",
+ "clientRoles": {
+ "microcks-app": ["manager"]
+ }
+ }
+ ],
+ "roles": {
+ "realm": [],
+ "client": {
+ "microcks-app": [
+ {
+ "name": "user",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "microcks"
+ },
+ {
+ "name": "admin",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "microcks"
+ },
+ {
+ "name": "manager",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "microcks"
+ }
+ ]
+ }
+ },
+ "groups": [
+ {
+ "name": "microcks",
+ "path": "/microcks",
+ "attributes": {},
+ "realmRoles": [],
+ "clientRoles": {},
+ "subGroups": [
+ {
+ "name": "manager",
+ "path": "/microcks/manager",
+ "attributes": {},
+ "realmRoles": [],
+ "clientRoles": {},
+ "subGroups": []
+ }
+ ]
+ }
+ ],
+ "defaultRoles": [],
+ "requiredCredentials": [ "password" ],
+ "scopeMappings": [],
+ "clientScopeMappings": {
+ "microcks-app": [
+ {
+ "client": "microcks-app-js",
+ "roles": [
+ "manager",
+ "admin",
+ "user"
+ ]
+ }
+ ],
+ "realm-management": [
+ {
+ "client": "microcks-app-js",
+ "roles": [
+ "manage-users",
+ "manage-clients"
+ ]
+ }
+ ]
+ },
+ "clients": [
+ {
+ "clientId": "microcks-app-js",
+ "enabled": true,
+ "publicClient": true,
+ "redirectUris": [
+ "*"
+ ],
+ "webOrigins": [
+ "*"
+ ],
+ "fullScopeAllowed": false,
+ "protocolMappers": [
+ {
+ "name": "microcks-group-mapper",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-group-membership-mapper",
+ "consentRequired": false,
+ "config": {
+ "full.path": "true",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "microcks-groups",
+ "userinfo.token.claim": "true"
+ }
+ }
+ ]
+ }
+ ],
+ "applications": [
+ {
+ "name": "microcks-app",
+ "enabled": true,
+ "bearerOnly": true,
+ "defaultRoles": [
+ "user"
+ ]
+ },
+ {
+ "name": "microcks-serviceaccount",
+ "secret": "ab54d329-e435-41ae-a900-ec6b3fe15c54",
+ "enabled": true,
+ "bearerOnly": false,
+ "publicClient": false,
+ "standardFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": true,
+ "clientAuthenticatorType": "client-secret"
+ }
+ ],
+ "requiredActions": [
+ {
+ "alias": "VERIFY_PROFILE",
+ "name": "Verify Profile",
+ "providerId": "VERIFY_PROFILE",
+ "enabled": false,
+ "defaultAction": false,
+ "priority": 90,
+ "config": {}
+ }
+ ],
+ "keycloakVersion": "10.0.1"
+}
diff --git a/scripts/dockerize/data/sut.csv b/scripts/dockerize/data/sut.csv
index eaf6dc3ce..40b4e1d75 100644
--- a/scripts/dockerize/data/sut.csv
+++ b/scripts/dockerize/data/sut.csv
@@ -34,3 +34,4 @@ swagger-petstore,TRUE,"",8080,http://localhost:8080/api/v3/openapi.json,http://l
http-patch-spring,TRUE,"",--server.port=8080,http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,FALSE,"",
spring-ecommerce,TRUE,-Dfile.encoding=ISO-8859-1,--server.port=8080 --spring.datasource.host=mongodb --spring.datasource.port=27017 --spring.datasource.database=test --spring.data.mongodb.uri=mongodb://mongodb:27017/test --spring.redis.host=redis --spring.redis.port=6379 --spring.data.elasticsearch.cluster-name=elasticsearch --spring.data.elasticsearch.cluster-nodes=elasticsearch:9300 --spring.elasticsearch.rest.uris=elasticsearch:9200 --spring.data.elasticsearch.host=elasticsearch --spring.data.elasticsearch.port=9300 --spring.cache.type=NONE,http://localhost:8080/v2/api-docs,http://localhost:8080,FALSE,FALSE,"","[{""name"": ""mongodb"", ""image_name"": ""mongo:7.0"", ""port"": 27017.0, ""tmp_fs"": ""/data/db"", ""environment"": ""MONGODB_REPLICA_SET_MODE: primary;ALLOW_EMPTY_PASSWORD: yes"", ""volume"": ""../scripts/dockerize/data/additional_files/spring-ecommerce/mongo_import.sh:/docker-entrypoint-initdb.d/mongo_import.sh;../scripts/dockerize/data/additional_files/spring-ecommerce/init.json:/fixtures/init.json"", ""health_check_command"": """"}, {""name"": ""redis"", ""image_name"": ""redis:7.0.11"", ""port"": 6379, ""tmp_fs"": """", ""environment"": """", ""volume"": """", ""health_check_command"": """"}, {""name"": ""elasticsearch"",""image_name"": ""docker.elastic.co/elasticsearch/elasticsearch:6.8.23"", ""port"": 9300, ""tmp_fs"": ""/usr/share/elasticsearch/data"", ""environment"": ""- discovery.type=single-node;- cluster.name=elasticsearch;- ES_JAVA_OPTS=-Xms512m -Xmx512m;- xpack.security.enabled=false"", ""volume"": """", ""health_check_command"": """"}]"
quartz-manager,TRUE,,--server.port=8080 --quartz-manager.security.accounts.in-memory.users[0].username=foo --quartz-manager.security.accounts.in-memory.users[0].password=bar --quartz-manager.security.accounts.in-memory.users[0].roles[0]=admin --quartz-manager.security.accounts.in-memory.users[1].username=foo2 --quartz-manager.security.accounts.in-memory.users[1].password=bar --quartz-manager.security.accounts.in-memory.users[1].roles[0]=admin,http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,FALSE,"",
+microcks,TRUE,-DPOSTMAN_RUNNER_URL=http://postman:3000 -DSERVICES_UPDATE_INTERVAL='0 0 0/2 * * *' -DKEYCLOAK_URL=http://keycloak:8080 -DKEYCLOAK_PUBLIC_URL=http://localhost:${HOST_PORT:-8081} -DENABLE_CORS_POLICY=false -DCORS_REST_ALLOW_CREDENTIALS=true -DTEST_CALLBACK_URL=http://localhost:${HOST_PORT:-8080},--server.port=8080 --spring.profiles.active=prod --grpc.server.port=0 --spring.data.mongodb.uri=mongodb://mongodb:27017/test --spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:${HOST_PORT:-8081}/realms/microcks --spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://keycloak:${HOST_PORT:-8080}/realms/microcks/protocol/openid-connect/certs,http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,FALSE,"","[{""name"": ""mongodb"", ""image_name"": ""mongo:7.0"", ""tmp_fs"": ""/data/db"", ""environment"": ""MONGODB_REPLICA_SET_MODE: primary;ALLOW_EMPTY_PASSWORD: yes"", ""volume"": """", ""health_check_command"": """"},{""name"": ""keycloak"",""image_name"": ""quay.io/keycloak/keycloak:26.0.0"", ""command"":[""start-dev"", ""--hostname=http://localhost:${HOST_PORT:-8081}"", ""--import-realm"", ""--health-enabled=true""], ""port"": ""${HOST_PORT:-8081}:8080"", ""tmp_fs"": """", ""environment"": ""KEYCLOAK_ADMIN: 'admin';KEYCLOAK_ADMIN_PASSWORD: 'admin';KC_HEALTH_ENABLED: 'true';KC_METRICS_ENABLED: 'true'"", ""volume"": ""../scripts/dockerize/data/additional_files/microcks/microcks-realm-sample.json:/opt/keycloak/data/import/microcks-realm.json"", ""health_check_command"": [""CMD"", ""sh"", ""-c"", ""echo -e 'GET /health/live HTTP/1.1\r\nHost: localhost\r\n\r\n' > /dev/tcp/localhost/9000""]},{""name"": ""postman"", ""image_name"": ""quay.io/microcks/microcks-postman-runtime:0.6.0"", ""tmp_fs"": """", ""environment"": """", ""volume"": """", ""health_check_command"": [""CMD"", ""curl"", ""-f"", ""http://localhost:3000/health""]}]"
diff --git a/scripts/dockerize/docker_generator.py b/scripts/dockerize/docker_generator.py
index 072975609..967587d87 100644
--- a/scripts/dockerize/docker_generator.py
+++ b/scripts/dockerize/docker_generator.py
@@ -136,12 +136,13 @@ def generate_docker_compose(self):
database_params = {
'name': db['name'] if 'name' in db else 'db',
'DATABASE_IMAGE_NAME': db['image_name'],
- 'DATABASE_PORT': db['port'],
+ 'DATABASE_PORT': db['port'] if 'port' in db else None,
'TMP_FS': db['tmp_fs'],
'DATABASE_ENVIRONMENT': str(db['environment']).split(';') if str(db['environment']) != '' else None,
'DATABASE_VOLUME': str(db['volume']).split(';') if str(db['volume']) != '' else None,
'HEALTH_CHECK': health_check_command != "",
- 'HEALTH_CHECK_COMMAND': health_check_command
+ 'HEALTH_CHECK_COMMAND': health_check_command,
+ 'COMMAND': db['command'] if 'command' in db else None,
}
database_image = database_template.render(database_params)
db_images.append(database_image)
diff --git a/scripts/dockerize/templates/db.template b/scripts/dockerize/templates/db.template
index cb03dadb0..f6ec48114 100644
--- a/scripts/dockerize/templates/db.template
+++ b/scripts/dockerize/templates/db.template
@@ -23,4 +23,11 @@
timeout: 30s
retries: 3
{% endif %}
+{% if DATABASE_PORT %}
+ ports:
+ - '{{DATABASE_PORT}}'
+{% endif %}
+{% if COMMAND %}
+ command: {{COMMAND}}
+{% endif %}
\ No newline at end of file
diff --git a/statistics/data.csv b/statistics/data.csv
index 79194b98b..fda7d2a02 100644
--- a/statistics/data.csv
+++ b/statistics/data.csv
@@ -33,6 +33,7 @@ TRUE,spring-rest-example,REST,Java,JDK 17,Maven,32,1426,MySQL,MIT,9,FALSE,https:
TRUE,swagger-petstore,REST,Java,JDK 8,Maven,23,1631,,Apache,19,FALSE,https://github.com/swagger-api/swagger-petstore
TRUE,genome-nexus,REST,Java,JDK 8,Maven,405,30004,MongoDB,MIT,23,FALSE,https://github.com/genome-nexus/genome-nexus
TRUE,market,REST,Java,JDK 11,Maven,124,9861,H2,MIT,13,TRUE,https://github.com/aleksey-lukyanets/market
+TRUE,microcks,REST,Java,JDK 21,Maven,471,66186,MongoDB,Apache,88,TRUE,https://github.com/microcks/microcks
TRUE,petclinic-graphql,GraphQL,Java,JDK 8,Maven,89,5212,PostgreSQL,Apache,15,FALSE,https://github.com/spring-petclinic/spring-petclinic-graphql
TRUE,patio-api,GraphQL,Java,JDK 11,Gradle,178,18048,PostgreSQL,GPL,20,TRUE,https://github.com/patio-team/patio-api
TRUE,timbuctoo,GraphQL,Java,JDK 11,Maven,1113,107729,Neo4j,GPL,18,TRUE,https://github.com/HuygensING/timbuctoo
diff --git a/statistics/table_emb.md b/statistics/table_emb.md
index 126979555..e1deed99e 100644
--- a/statistics/table_emb.md
+++ b/statistics/table_emb.md
@@ -6,6 +6,7 @@
|__graphql-scs__|GraphQL|577|13|11|Kotlin|JDK 8|Maven|||
|__graphql-ncs__|GraphQL|548|8|6|Kotlin|JDK 8|Maven|||
|__languagetool__|REST|174781|1385|2|Java|JDK 8|Maven|||
+|__microcks__|REST|66186|471|88|Java|JDK 21|Maven|MongoDB|✓|
|__ocvn__|REST|45521|526|258|Java|JDK 8|Maven|H2, MongoDB|✓|
|__pay-publicapi__|REST|34576|377|10|Java|JDK 11|Maven|Redis|✓|
|__genome-nexus__|REST|30004|405|23|Java|JDK 8|Maven|MongoDB||