From f7662fc0b1230e664d9b8923ad8867d33ecdd20d Mon Sep 17 00:00:00 2001 From: Omur Sahin Date: Fri, 28 Aug 2026 17:10:31 +0300 Subject: [PATCH 1/3] digitalbanking drivers --- .gitignore | 3 + README.md | 8 +- dockerfiles/digitalbanking.dockerfile | 17 + dockerfiles/digitalbanking.yaml | 70 + experiments/wb-exp.py | 1 + jdk_17_maven/cs/rest/digitalbanking/pom.xml | 8 + jdk_17_maven/cs/rest/pom.xml | 1 + .../em/embedded/rest/digitalbanking/pom.xml | 59 + .../EmbeddedEvoMasterController.java | 227 ++ jdk_17_maven/em/embedded/rest/pom.xml | 1 + .../em/external/rest/digitalbanking/pom.xml | 91 + .../ExternalEvoMasterController.java | 279 +++ jdk_17_maven/em/external/rest/pom.xml | 1 + openapi-swagger/digitalbanking.json | 2209 +++++++++++++++++ scripts/build/docker-compose.build.yml | 2 + scripts/dist.py | 3 + scripts/dockerize/data/sut.csv | 1 + statistics/data.csv | 1 + statistics/table_emb.md | 1 + 19 files changed, 2982 insertions(+), 1 deletion(-) create mode 100644 dockerfiles/digitalbanking.dockerfile create mode 100644 dockerfiles/digitalbanking.yaml create mode 100644 jdk_17_maven/em/embedded/rest/digitalbanking/pom.xml create mode 100644 jdk_17_maven/em/embedded/rest/digitalbanking/src/main/java/em/embedded/digitalbanking/EmbeddedEvoMasterController.java create mode 100644 jdk_17_maven/em/external/rest/digitalbanking/pom.xml create mode 100644 jdk_17_maven/em/external/rest/digitalbanking/src/main/java/em/external/digitalbanking/ExternalEvoMasterController.java create mode 100644 openapi-swagger/digitalbanking.json diff --git a/.gitignore b/.gitignore index 6243070d1..59888c3df 100644 --- a/.gitignore +++ b/.gitignore @@ -353,6 +353,9 @@ jdk_8_maven/em/external/rest/spring-batch-rest/target /jdk_17_maven/em/external/rest/ohsome-api/target/ /jdk_17_maven/cs/rest/spring-rest-example/target/ +/jdk_17_maven/cs/rest/digitalbanking/target/ +/jdk_17_maven/em/embedded/rest/digitalbanking/target/ +/jdk_17_maven/em/external/rest/digitalbanking/target/ /jdk_17_maven/em/embedded/rest/spring-rest-example/target/ /jdk_17_maven/em/external/rest/spring-rest-example/target/ diff --git a/README.md b/README.md index 60e1dc27b..8b87a3b38 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ How to setup authentication information, based on the current content of the ini Auth configuration files can found in the [auth](auth) folder. -### REST: Java/Kotlin (39) +### REST: Java/Kotlin (40) * **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) @@ -97,6 +97,8 @@ Auth configuration files can found in the [auth](auth) folder. * **CWA-Verification-Server** (Apache), [jdk_11_maven/cs/rest/cwa-verification-server](jdk_11_maven/cs/rest/cwa-verification-server), from [https://github.com/corona-warn-app/cwa-verification-server](https://github.com/corona-warn-app/cwa-verification-server) +* **Digital Banking** (not-known license), [jdk_17_maven/cs/rest/digitalbanking](jdk_17_maven/cs/rest/digitalbanking), from [https://github.com/jphaugla/Redisearch-Digital-Banking-redisTemplate](https://github.com/jphaugla/Redisearch-Digital-Banking-redisTemplate) + * **ERC20 Rest Service** (not-known license), [jdk_8_gradle/cs/rest/erc20-rest-service](jdk_8_gradle/cs/rest/erc20-rest-service), from [https://github.com/web3labs/erc20-rest-service](https://github.com/web3labs/erc20-rest-service) * **Familie Ba Sak** (MIT), [jdk_17_maven/cs/rest/familie-ba-sak](jdk_17_maven/cs/rest/familie-ba-sak), from [https://github.com/navikt/familie-ba-sak](https://github.com/navikt/familie-ba-sak) @@ -268,6 +270,10 @@ _Black-box_ testing: you can build all the SUTs via Docker using `scripts/dist- docker-compose -f dockerfiles/reservations-api.yaml up ``` +Note: for `digitalbanking`, run the fuzzer with `--endpointExclude "/generateData"`. +That endpoint loops on its request parameters with no upper bound, and a large value makes the SUT unresponsive for the rest of the experiment. +The white-box drivers already skip it. + _White-box_ testing: everything can be setup by running the script `scripts/dist.py`. Note that you will need installed at least Maven, Gradle, JDK 8, JDK 11, JDK 17, JDK 21, JDK 25, NPM, as well as Docker. Also, you will need to setup environment variables like `JAVA_HOME_8`, `JAVA_HOME_11`, `JAVA_HOME_17`, `JAVA_HOME_21` and `JAVA_HOME_25`. diff --git a/dockerfiles/digitalbanking.dockerfile b/dockerfiles/digitalbanking.dockerfile new file mode 100644 index 000000000..541e67dde --- /dev/null +++ b/dockerfiles/digitalbanking.dockerfile @@ -0,0 +1,17 @@ +FROM amazoncorretto:17-alpine-jdk + +COPY ./dist/digitalbanking-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/digitalbanking__${TOOL}__${RUN}__jacoco.exec,append=false,dumponexit=true \ + -javaagent:jacocoagent.jar=output=tcpserver,address=*,port=6300,append=false,dumponexit=false \ + -jar digitalbanking-sut.jar \ + --server.port=8080 --REDIS_HOST=db --REDIS_PORT=6379 --REDIS_PASSWORD=jasonrocks --redis.host=db --redis.port=6379 --KAFKA_HOST=kafka --KAFKA_PORT=9092 --SPRING_CASSANDRA_HOST=cassandra --SPRING_CASSANDRA_PORT=9042 --SPRING_CASSANDRA_CLUSTER=test --SPRING_CASSANDRA_DATACENTER=datacenter1 \ No newline at end of file diff --git a/dockerfiles/digitalbanking.yaml b/dockerfiles/digitalbanking.yaml new file mode 100644 index 000000000..484bc6592 --- /dev/null +++ b/dockerfiles/digitalbanking.yaml @@ -0,0 +1,70 @@ +services: + mitmproxy: + image: mitmproxy/mitmproxy:10.2.4 + user: "0:0" + environment: + MITM_LOG_DIR: /custom-logs + MITM_LOG_FILE: ${MITM_LOG_FILE:-minlog.csv} + command: > + mitmdump + --mode reverse:http://sut-digitalbanking:8080 + --listen-host 0.0.0.0 + --listen-port 8080 + --set keep_host_header=true + -s /addons/minlog.py + volumes: + - ${HOST_LOG_DIR:-./mitm-logs}:/custom-logs + - ./addons:/addons:ro + ports: + - "${HOST_PORT:-8080}:8080" + depends_on: + - sut-digitalbanking + sut-digitalbanking: + build: + dockerfile: ./dockerfiles/digitalbanking.dockerfile + context: .. + environment: + AUTH_PORT: ${AUTH_PORT:-8081} + ports: + - "${JACOCO_PORT:-6300}:6300" + depends_on: + db: + condition: service_healthy + cassandra: + condition: service_healthy + db: + image: redis/redis-stack-server:7.4.0-v1 + environment: + REDIS_ARGS: --requirepass jasonrocks + healthcheck: + test: redis-cli -a jasonrocks ping | grep PONG + interval: 30s + timeout: 30s + retries: 3 + cassandra: + image: cassandra:4.1 + environment: + CASSANDRA_CLUSTER_NAME: test + CASSANDRA_DC: datacenter1 + CASSANDRA_ENDPOINT_SNITCH: SimpleSnitch + HEAP_NEWSIZE: 128M + MAX_HEAP_SIZE: 512M + healthcheck: + test: cqlsh -e "CREATE KEYSPACE IF NOT EXISTS banking WITH replication = {'class':'SimpleStrategy','replication_factor':1};CREATE TABLE IF NOT EXISTS banking.transaction (tranid text, accountno text, amounttype text, merchant text, referencekeytype text, referencekeyvalue text, originalamount text, amount text, trancd text, description text, initialdate text, settlementdate text, postingdate text, status text, disputeid text, transactionreturn text, location text, transactiontags text, primary key (tranid));" + interval: 30s + timeout: 30s + retries: 3 + kafka: + image: apache/kafka:3.8.1 + environment: + KAFKA_NODE_ID: 1 + KAFKA_PROCESS_ROLES: broker,controller + KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 + KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT + KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093 + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 + KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 + KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 + KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 \ No newline at end of file diff --git a/experiments/wb-exp.py b/experiments/wb-exp.py index f4afaa39a..8b6922353 100644 --- a/experiments/wb-exp.py +++ b/experiments/wb-exp.py @@ -187,6 +187,7 @@ def __init__(self, name, platform): Sut("catwatch", JDK_8), Sut("commafeed", JDK_25), Sut("cwa-verification", JDK_11), + Sut("digitalbanking", JDK_17), Sut("erc20-rest-service", JDK_8), Sut("familie-ba-sak",JDK_17), Sut("features-service", JDK_8), diff --git a/jdk_17_maven/cs/rest/digitalbanking/pom.xml b/jdk_17_maven/cs/rest/digitalbanking/pom.xml index 22e523324..9d3defcab 100644 --- a/jdk_17_maven/cs/rest/digitalbanking/pom.xml +++ b/jdk_17_maven/cs/rest/digitalbanking/pom.xml @@ -84,6 +84,14 @@ org.springframework.boot spring-boot-maven-plugin + + + + digitalbanking + sut + + diff --git a/jdk_17_maven/cs/rest/pom.xml b/jdk_17_maven/cs/rest/pom.xml index 8991efea6..dbe35d4bc 100644 --- a/jdk_17_maven/cs/rest/pom.xml +++ b/jdk_17_maven/cs/rest/pom.xml @@ -17,6 +17,7 @@ tiltaksgjennomforing ohsome-api spring-rest-example + digitalbanking diff --git a/jdk_17_maven/em/embedded/rest/digitalbanking/pom.xml b/jdk_17_maven/em/embedded/rest/digitalbanking/pom.xml new file mode 100644 index 000000000..b1af7bba1 --- /dev/null +++ b/jdk_17_maven/em/embedded/rest/digitalbanking/pom.xml @@ -0,0 +1,59 @@ + + + + 4.0.0 + + evomaster-benchmark-jdk17-em-embedded-rest-digitalbanking + jar + + + org.evomaster + evomaster-benchmark-jdk17-em-embedded-rest + 4.3.1-SNAPSHOT + + + + + + + org.springframework.boot + spring-boot-dependencies + 3.1.4 + pom + import + + + + + + + + com.jphaugla + redis + 0.0.1-SNAPSHOT + + + + org.testcontainers + testcontainers + compile + + + org.testcontainers + kafka + ${testcontainers.version} + compile + + + + + redis.clients + jedis + 4.4.3 + + + + diff --git a/jdk_17_maven/em/embedded/rest/digitalbanking/src/main/java/em/embedded/digitalbanking/EmbeddedEvoMasterController.java b/jdk_17_maven/em/embedded/rest/digitalbanking/src/main/java/em/embedded/digitalbanking/EmbeddedEvoMasterController.java new file mode 100644 index 000000000..a33dc42d8 --- /dev/null +++ b/jdk_17_maven/em/embedded/rest/digitalbanking/src/main/java/em/embedded/digitalbanking/EmbeddedEvoMasterController.java @@ -0,0 +1,227 @@ +package em.embedded.digitalbanking; + +import com.jphaugla.DemoApplication; +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.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.kafka.KafkaContainer; +import redis.clients.jedis.JedisPooled; +import redis.clients.jedis.UnifiedJedis; + +import java.time.Duration; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Class used to start/stop the SUT. + */ +public class EmbeddedEvoMasterController extends EmbeddedSutController { + + /* + The SUT uses RediSearch (FT.CREATE), so it needs Redis Stack and not plain Redis. + */ + private static final String REDIS_VERSION = "7.4.0-v1"; + + private static final int REDIS_PORT = 6379; + + private static final String REDIS_PASSWORD = "jasonrocks"; + + private static final String CASSANDRA_VERSION = "4.1"; + + private static final int CASSANDRA_PORT = 9042; + + private static final String CASSANDRA_CLUSTER = "test"; + + private static final String CASSANDRA_DATACENTER = "datacenter1"; + + private static final String KAFKA_VERSION = "3.8.1"; + + private static final int KAFKA_PORT = 9092; + + /* + The SUT connects to an existing keyspace, and the "transaction" table is the one + scripts/trans.cql creates. Neither is created by the application itself. + */ + private static final String INIT_CQL = + "CREATE KEYSPACE IF NOT EXISTS banking WITH replication = " + + "{'class':'SimpleStrategy','replication_factor':1};" + + "CREATE TABLE IF NOT EXISTS banking.transaction (tranid text, accountno text," + + " amounttype text, merchant text, referencekeytype text, referencekeyvalue text," + + " originalamount text, amount text, trancd text, description text, initialdate text," + + " settlementdate text, postingdate text, status text, disputeid text," + + " transactionreturn text, location text, transactiontags text, primary key (tranid));"; + + /* + /generateData loops on its request parameters with no upper bound. Fuzzed with a large + value, it drives the SUT into a GC death-spiral it never recovers from. + */ + private static final List ENDPOINTS_TO_SKIP = Arrays.asList("/generateData"); + + private static final GenericContainer redis = new GenericContainer("redis/redis-stack-server:" + REDIS_VERSION) + .withEnv("REDIS_ARGS", "--requirepass " + REDIS_PASSWORD) + .withExposedPorts(REDIS_PORT); + + private static final GenericContainer cassandra = new GenericContainer("cassandra:" + CASSANDRA_VERSION) + .withEnv("CASSANDRA_CLUSTER_NAME", CASSANDRA_CLUSTER) + .withEnv("CASSANDRA_DC", CASSANDRA_DATACENTER) + .withEnv("CASSANDRA_ENDPOINT_SNITCH", "SimpleSnitch") + .withEnv("HEAP_NEWSIZE", "128M") + .withEnv("MAX_HEAP_SIZE", "512M") + .withExposedPorts(CASSANDRA_PORT) + .waitingFor(Wait.forLogMessage(".*Startup complete.*", 1)) + .withStartupTimeout(Duration.ofMinutes(5)); + + private static final KafkaContainer kafka = new KafkaContainer("apache/kafka:" + KAFKA_VERSION); + + + 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 UnifiedJedis redisClient; + + public EmbeddedEvoMasterController() { + this(0); + } + + public EmbeddedEvoMasterController(int port) { + setControllerPort(port); + } + + + @Override + public String startSut() { + + redis.start(); + kafka.start(); + cassandra.start(); + initCassandraSchema(); + redisClient = new JedisPooled("redis://:" + REDIS_PASSWORD + "@" + + redis.getHost() + ":" + redis.getMappedPort(REDIS_PORT)); + + ctx = SpringApplication.run(DemoApplication.class, new String[]{ + "--server.port=0", + "--REDIS_HOST=" + redis.getHost(), + "--REDIS_PORT=" + redis.getMappedPort(REDIS_PORT), + "--REDIS_PASSWORD=" + REDIS_PASSWORD, + // the index creation runner reads these two instead of the spring.redis ones + "--redis.host=" + redis.getHost(), + "--redis.port=" + redis.getMappedPort(REDIS_PORT), + "--KAFKA_HOST=" + kafka.getHost(), + "--KAFKA_PORT=" + kafka.getMappedPort(KAFKA_PORT), + "--SPRING_CASSANDRA_HOST=" + cassandra.getHost(), + "--SPRING_CASSANDRA_PORT=" + cassandra.getMappedPort(CASSANDRA_PORT), + "--SPRING_CASSANDRA_CLUSTER=" + CASSANDRA_CLUSTER, + "--SPRING_CASSANDRA_DATACENTER=" + CASSANDRA_DATACENTER + }); + + return "http://localhost:" + getSutPort(); + } + + private void initCassandraSchema() { + try { + cassandra.execInContainer("cqlsh", "-e", INIT_CQL); + } catch (Exception e) { + throw new RuntimeException("Failed to create the Cassandra schema", e); + } + } + + 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() { + + if (ctx != null) { + ctx.stop(); + ctx.close(); + ctx = null; + } + + if (redisClient != null) { + redisClient.close(); + redisClient = null; + } + + cassandra.stop(); + kafka.stop(); + redis.stop(); + } + + @Override + public String getPackagePrefixesToCover() { + return "com.jphaugla."; + } + + /* + Redis is the only store that keeps state across tests. FLUSHALL would drop the + RediSearch indexes, which the SUT creates only at startup. + */ + @Override + public void resetStateOfSUT() { + if (redisClient == null) { + return; + } + Set keys = redisClient.keys("*"); + if (!keys.isEmpty()) { + redisClient.del(keys.toArray(new String[0])); + } + } + + + @Override + public List getDbSpecifications() { + return null; + } + + + @Override + public List getInfoForAuthentication() { + return null; + } + + + @Override + public ProblemInfo getProblemInfo() { + return new RestProblem( + "http://localhost:" + getSutPort() + "/v3/api-docs", + ENDPOINTS_TO_SKIP + ); + } + + @Override + public SutInfoDto.OutputFormat getPreferredOutputFormat() { + return SutInfoDto.OutputFormat.JAVA_JUNIT_5; + } +} diff --git a/jdk_17_maven/em/embedded/rest/pom.xml b/jdk_17_maven/em/embedded/rest/pom.xml index 82cb6185d..dc184594d 100644 --- a/jdk_17_maven/em/embedded/rest/pom.xml +++ b/jdk_17_maven/em/embedded/rest/pom.xml @@ -16,6 +16,7 @@ tiltaksgjennomforing ohsome-api spring-rest-example + digitalbanking diff --git a/jdk_17_maven/em/external/rest/digitalbanking/pom.xml b/jdk_17_maven/em/external/rest/digitalbanking/pom.xml new file mode 100644 index 000000000..3779f6a31 --- /dev/null +++ b/jdk_17_maven/em/external/rest/digitalbanking/pom.xml @@ -0,0 +1,91 @@ + + + + 4.0.0 + + evomaster-benchmark-jdk17-em-external-rest-digitalbanking + jar + + + org.evomaster + evomaster-benchmark-jdk17-em-external-rest + 4.3.1-SNAPSHOT + + + + + + + org.testcontainers + testcontainers + compile + + + org.testcontainers + kafka + ${testcontainers.version} + compile + + + + + redis.clients + jedis + 4.4.3 + + + + + + + + org.apache.maven.plugins + maven-shade-plugin + + 3.6.2 + + + package + + shade + + + digitalbanking-evomaster-runner + + + + em.external.digitalbanking.ExternalEvoMasterController + + org.evomaster.client.java.instrumentation.InstrumentingAgent + + org.evomaster.client.java.instrumentation.InstrumentingAgent + + true + true + + + + + + + org.slf4j + shaded.emb.org.slf4j + + + com.fasterxml.jackson.annotation + shaded.emb.com.fasterxml.jackson.annotation + + + + + + + + + diff --git a/jdk_17_maven/em/external/rest/digitalbanking/src/main/java/em/external/digitalbanking/ExternalEvoMasterController.java b/jdk_17_maven/em/external/rest/digitalbanking/src/main/java/em/external/digitalbanking/ExternalEvoMasterController.java new file mode 100644 index 000000000..99e369043 --- /dev/null +++ b/jdk_17_maven/em/external/rest/digitalbanking/src/main/java/em/external/digitalbanking/ExternalEvoMasterController.java @@ -0,0 +1,279 @@ +package em.external.digitalbanking; + + +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.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.kafka.KafkaContainer; +import redis.clients.jedis.JedisPooled; +import redis.clients.jedis.UnifiedJedis; + +import java.time.Duration; +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +public class ExternalEvoMasterController extends ExternalSutController { + + private static final int DEFAULT_CONTROLLER_PORT = 40100; + + private static final int DEFAULT_SUT_PORT = 12345; + + /* + The SUT uses RediSearch (FT.CREATE), so it needs Redis Stack and not plain Redis. + */ + private static final String REDIS_VERSION = "7.4.0-v1"; + + private static final int REDIS_PORT = 6379; + + private static final String REDIS_PASSWORD = "jasonrocks"; + + private static final String CASSANDRA_VERSION = "4.1"; + + private static final int CASSANDRA_PORT = 9042; + + private static final String CASSANDRA_CLUSTER = "test"; + + private static final String CASSANDRA_DATACENTER = "datacenter1"; + + private static final String KAFKA_VERSION = "3.8.1"; + + private static final int KAFKA_PORT = 9092; + + /* + The SUT connects to an existing keyspace, and the "transaction" table is the one + scripts/trans.cql creates. Neither is created by the application itself. + */ + private static final String INIT_CQL = + "CREATE KEYSPACE IF NOT EXISTS banking WITH replication = " + + "{'class':'SimpleStrategy','replication_factor':1};" + + "CREATE TABLE IF NOT EXISTS banking.transaction (tranid text, accountno text," + + " amounttype text, merchant text, referencekeytype text, referencekeyvalue text," + + " originalamount text, amount text, trancd text, description text, initialdate text," + + " settlementdate text, postingdate text, status text, disputeid text," + + " transactionreturn text, location text, transactiontags text, primary key (tranid));"; + + /* + /generateData loops on its request parameters with no upper bound. Fuzzed with a large + value, it drives the SUT into a GC death-spiral it never recovers from. + */ + private static final List ENDPOINTS_TO_SKIP = Arrays.asList("/generateData"); + + private static final GenericContainer redis = new GenericContainer("redis/redis-stack-server:" + REDIS_VERSION) + .withEnv("REDIS_ARGS", "--requirepass " + REDIS_PASSWORD) + .withExposedPorts(REDIS_PORT); + + private static final GenericContainer cassandra = new GenericContainer("cassandra:" + CASSANDRA_VERSION) + .withEnv("CASSANDRA_CLUSTER_NAME", CASSANDRA_CLUSTER) + .withEnv("CASSANDRA_DC", CASSANDRA_DATACENTER) + .withEnv("CASSANDRA_ENDPOINT_SNITCH", "SimpleSnitch") + .withEnv("HEAP_NEWSIZE", "128M") + .withEnv("MAX_HEAP_SIZE", "512M") + .withExposedPorts(CASSANDRA_PORT) + .waitingFor(Wait.forLogMessage(".*Startup complete.*", 1)) + .withStartupTimeout(Duration.ofMinutes(5)); + + private static final KafkaContainer kafka = new KafkaContainer("apache/kafka:" + KAFKA_VERSION); + + + 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/digitalbanking/target"; + if (args.length > 2) { + jarLocation = args[2]; + } + if (!jarLocation.endsWith(".jar")) { + jarLocation += "/digitalbanking-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); + + controller.setNeedsJdk17Options(true); + + InstrumentedSutStarter starter = new InstrumentedSutStarter(controller); + + starter.start(); + } + + + private final int timeoutSeconds; + + private final int sutPort; + + private String jarLocation; + + private UnifiedJedis redisClient; + + public ExternalEvoMasterController() { + this(DEFAULT_CONTROLLER_PORT, "../target/digitalbanking-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); + setJavaCommand(command); + } + + @Override + public String[] getInputParameters() { + return new String[]{ + "--server.port=" + sutPort, + "--REDIS_HOST=" + redis.getHost(), + "--REDIS_PORT=" + redis.getMappedPort(REDIS_PORT), + "--REDIS_PASSWORD=" + REDIS_PASSWORD, + // the index creation runner reads these two instead of the spring.redis ones + "--redis.host=" + redis.getHost(), + "--redis.port=" + redis.getMappedPort(REDIS_PORT), + "--KAFKA_HOST=" + kafka.getHost(), + "--KAFKA_PORT=" + kafka.getMappedPort(KAFKA_PORT), + "--SPRING_CASSANDRA_HOST=" + cassandra.getHost(), + "--SPRING_CASSANDRA_PORT=" + cassandra.getMappedPort(CASSANDRA_PORT), + "--SPRING_CASSANDRA_CLUSTER=" + CASSANDRA_CLUSTER, + "--SPRING_CASSANDRA_DATACENTER=" + CASSANDRA_DATACENTER + }; + } + + @Override + public String[] getJVMParameters() { + return new String[]{}; + } + + + @Override + public String getBaseURL() { + return "http://localhost:" + sutPort; + } + + @Override + public String getPathToExecutableJar() { + return jarLocation; + } + + /* + Spring logs "Started ... in" before the CommandLineRunners, and the SUT is unusable until + the RediSearch indexes exist. This is the last line that runner writes. + */ + @Override + public String getLogMessageOfInitializedServer() { + return "rebuilding index on Disp"; + } + + @Override + public long getMaxAwaitForInitializationInSeconds() { + return timeoutSeconds; + } + + @Override + public void preStart() { + redis.start(); + kafka.start(); + cassandra.start(); + initCassandraSchema(); + redisClient = new JedisPooled("redis://:" + REDIS_PASSWORD + "@" + + redis.getHost() + ":" + redis.getMappedPort(REDIS_PORT)); + } + + private void initCassandraSchema() { + try { + cassandra.execInContainer("cqlsh", "-e", INIT_CQL); + } catch (Exception e) { + throw new RuntimeException("Failed to create the Cassandra schema", e); + } + } + + @Override + public void postStart() { + } + + @Override + public void preStop() { + } + + @Override + public void postStop() { + if (redisClient != null) { + redisClient.close(); + redisClient = null; + } + cassandra.stop(); + kafka.stop(); + redis.stop(); + } + + @Override + public String getPackagePrefixesToCover() { + return "com.jphaugla."; + } + + @Override + public ProblemInfo getProblemInfo() { + return new RestProblem( + getBaseURL() + "/v3/api-docs", + ENDPOINTS_TO_SKIP + ); + } + + @Override + public SutInfoDto.OutputFormat getPreferredOutputFormat() { + return SutInfoDto.OutputFormat.JAVA_JUNIT_5; + } + + @Override + public List getInfoForAuthentication() { + return null; + } + + /* + Redis is the only store that keeps state across tests. FLUSHALL would drop the + RediSearch indexes, which the SUT creates only at startup. + */ + @Override + public void resetStateOfSUT() { + if (redisClient == null) { + return; + } + Set keys = redisClient.keys("*"); + if (!keys.isEmpty()) { + redisClient.del(keys.toArray(new String[0])); + } + } + + @Override + public List getDbSpecifications() { + return null; + } + +} diff --git a/jdk_17_maven/em/external/rest/pom.xml b/jdk_17_maven/em/external/rest/pom.xml index 0bef9c678..a687cd75a 100644 --- a/jdk_17_maven/em/external/rest/pom.xml +++ b/jdk_17_maven/em/external/rest/pom.xml @@ -17,6 +17,7 @@ tiltaksgjennomforing ohsome-api spring-rest-example + digitalbanking \ No newline at end of file diff --git a/openapi-swagger/digitalbanking.json b/openapi-swagger/digitalbanking.json new file mode 100644 index 000000000..638184cfa --- /dev/null +++ b/openapi-swagger/digitalbanking.json @@ -0,0 +1,2209 @@ +{ + "openapi": "3.0.1", + "info": { + "title": "OpenAPI definition", + "version": "v0" + }, + "servers": [ + { + "url": "http://localhost:12345", + "description": "Generated server url" + } + ], + "paths": { + "/profile": { + "get": { + "tags": [ + "profile-controller" + ], + "operationId": "listAllFormsOfMetadata_1", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/RepresentationModelObject" + } + } + } + } + } + } + }, + "/profile/transactions": { + "get": { + "tags": [ + "profile-controller" + ], + "operationId": "descriptor_1_1_1", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "string" + } + }, + "application/alps+json": { + "schema": { + "type": "string" + } + }, + "application/schema+json": { + "schema": { + "$ref": "#/components/schemas/JsonSchema" + } + } + } + } + } + } + }, + "/transactions": { + "get": { + "tags": [ + "transaction-entity-controller" + ], + "description": "get-transaction", + "operationId": "getCollectionResource-transaction-get_1", + "parameters": [ + { + "name": "page", + "in": "query", + "description": "Zero-based page index (0..N)", + "required": false, + "schema": { + "minimum": 0, + "type": "integer", + "default": 0 + } + }, + { + "name": "size", + "in": "query", + "description": "The size of the page to be returned", + "required": false, + "schema": { + "minimum": 1, + "type": "integer", + "default": 20 + } + }, + { + "name": "sort", + "in": "query", + "description": "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/PagedModelEntityModelTransaction" + } + }, + "application/x-spring-data-compact+json": { + "schema": { + "$ref": "#/components/schemas/PagedModelEntityModelTransaction" + } + }, + "text/uri-list": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "post": { + "tags": [ + "transaction-entity-controller" + ], + "description": "create-transaction", + "operationId": "postCollectionResource-transaction-post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TransactionRequestBody" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/EntityModelTransaction" + } + } + } + } + } + } + }, + "/transactions/{id}": { + "get": { + "tags": [ + "transaction-entity-controller" + ], + "description": "get-transaction", + "operationId": "getItemResource-transaction-get", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/EntityModelTransaction" + } + } + } + }, + "404": { + "description": "Not Found" + } + } + }, + "put": { + "tags": [ + "transaction-entity-controller" + ], + "description": "update-transaction", + "operationId": "putItemResource-transaction-put", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TransactionRequestBody" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/EntityModelTransaction" + } + } + } + }, + "201": { + "description": "Created", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/EntityModelTransaction" + } + } + } + }, + "204": { + "description": "No Content" + } + } + }, + "delete": { + "tags": [ + "transaction-entity-controller" + ], + "description": "delete-transaction", + "operationId": "deleteItemResource-transaction-delete", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "404": { + "description": "Not Found" + } + } + }, + "patch": { + "tags": [ + "transaction-entity-controller" + ], + "description": "patch-transaction", + "operationId": "patchItemResource-transaction-patch", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TransactionRequestBody" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/EntityModelTransaction" + } + } + } + }, + "204": { + "description": "No Content" + } + } + } + }, + "/resolvedDispute": { + "put": { + "tags": [ + "banking-controller" + ], + "operationId": "resolvedDispute", + "parameters": [ + { + "name": "disputeId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/putDisputeChargeBackReason": { + "put": { + "tags": [ + "banking-controller" + ], + "operationId": "putDisputeChargeBackReason", + "parameters": [ + { + "name": "disputeId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "reasonCode", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/acceptDispute": { + "put": { + "tags": [ + "banking-controller" + ], + "operationId": "acceptDisputeChargeBack", + "parameters": [ + { + "name": "disputeId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/postDispute": { + "post": { + "tags": [ + "banking-controller" + ], + "operationId": "postDispute", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Dispute" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/postCustomer": { + "post": { + "tags": [ + "banking-controller" + ], + "operationId": "postCustomer", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Customer" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/transactionStatusReport": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "transactionStatusReport", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": { + "type": "object" + } + } + } + } + } + } + } + } + }, + "/testPipeline": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "testPipeline", + "parameters": [ + { + "name": "noOfRecords", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/send": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "send", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/returned_transactions": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "getReturnedTransaction", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/SearchResult" + } + } + } + } + } + } + }, + "/mostRecentTransactions": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "mostRecentTransactions", + "parameters": [ + { + "name": "accountNo", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/SearchResult" + } + } + } + } + } + } + }, + "/merchantTransactions": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "getMerchantTransactions", + "parameters": [ + { + "name": "merchant", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "account", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date-time" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/SearchResult" + } + } + } + } + } + } + }, + "/merchantCategoryTransactions": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "getMerchantCategoryTransactions", + "parameters": [ + { + "name": "merchantCategory", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "account", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date-time" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/SearchResult" + } + } + } + } + } + } + }, + "/getTransaction": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "getTransaction", + "parameters": [ + { + "name": "transactionID", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/Transaction" + } + } + } + } + } + } + }, + "/getTags": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "getTransactionTagList", + "parameters": [ + { + "name": "transactionID", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "uniqueItems": true, + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "/getTaggedTransactions": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "getTaggedTransactions", + "parameters": [ + { + "name": "accountNo", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "tag", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/SearchResult" + } + } + } + } + } + } + }, + "/getDispute": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "getDispute", + "parameters": [ + { + "name": "disputeId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/Dispute" + } + } + } + } + } + } + }, + "/generateData": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "generateData", + "parameters": [ + { + "name": "noOfCustomers", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "noOfTransactions", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "noOfDays", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "key_suffix", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "doKafka", + "in": "query", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/deleteCustomer": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "deleteCustomer", + "parameters": [ + { + "name": "customerString", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "integer", + "format": "int32" + } + } + } + } + } + } + }, + "/deleteCustomerEmail": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "deleteCustomerEmail", + "parameters": [ + { + "name": "customerId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "integer", + "format": "int32" + } + } + } + } + } + } + }, + "/customer": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "getCustomer", + "parameters": [ + { + "name": "customerId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/Customer" + } + } + } + } + } + } + }, + "/customerByZipcodeLastname": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "getCustomerIdsbyZipcodeLastname", + "parameters": [ + { + "name": "zipcode", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "lastname", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/SearchResult" + } + } + } + } + } + } + }, + "/customerByStateCity": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "getCustomerByStateCity", + "parameters": [ + { + "name": "state", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "city", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/SearchResult" + } + } + } + } + } + } + }, + "/customerByPhone": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "getCustomerByPhone", + "parameters": [ + { + "name": "phoneString", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/Customer" + } + } + } + } + } + } + }, + "/customerByEmail": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "getCustomerByEmail", + "parameters": [ + { + "name": "email", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/Customer" + } + } + } + } + } + } + }, + "/creditCardTransactions": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "getCreditCardTransactions", + "parameters": [ + { + "name": "creditCard", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date-time" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/SearchResult" + } + } + } + } + } + } + }, + "/addTag": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "addTag", + "parameters": [ + { + "name": "transactionID", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "tag", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "operation", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/accountTransactions": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "getAccountTransactions", + "parameters": [ + { + "name": "accountNo", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "required": true, + "schema": { + "type": "string", + "format": "date-time" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "$ref": "#/components/schemas/SearchResult" + } + } + } + } + } + } + }, + "/save_transaction": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "saveTransaction", + "parameters": [ + { + "name": "doKafka", + "in": "query", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "put": { + "tags": [ + "banking-controller" + ], + "operationId": "saveTransaction_3", + "parameters": [ + { + "name": "doKafka", + "in": "query", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "post": { + "tags": [ + "banking-controller" + ], + "operationId": "saveTransaction_2", + "parameters": [ + { + "name": "doKafka", + "in": "query", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "delete": { + "tags": [ + "banking-controller" + ], + "operationId": "saveTransaction_5", + "parameters": [ + { + "name": "doKafka", + "in": "query", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "options": { + "tags": [ + "banking-controller" + ], + "operationId": "saveTransaction_6", + "parameters": [ + { + "name": "doKafka", + "in": "query", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "head": { + "tags": [ + "banking-controller" + ], + "operationId": "saveTransaction_1", + "parameters": [ + { + "name": "doKafka", + "in": "query", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "patch": { + "tags": [ + "banking-controller" + ], + "operationId": "saveTransaction_4", + "parameters": [ + { + "name": "doKafka", + "in": "query", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/save_customer": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "saveCustomer", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "put": { + "tags": [ + "banking-controller" + ], + "operationId": "saveCustomer_3", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "post": { + "tags": [ + "banking-controller" + ], + "operationId": "saveCustomer_2", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "delete": { + "tags": [ + "banking-controller" + ], + "operationId": "saveCustomer_5", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "options": { + "tags": [ + "banking-controller" + ], + "operationId": "saveCustomer_6", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "head": { + "tags": [ + "banking-controller" + ], + "operationId": "saveCustomer_1", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "patch": { + "tags": [ + "banking-controller" + ], + "operationId": "saveCustomer_4", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/save_account": { + "get": { + "tags": [ + "banking-controller" + ], + "operationId": "saveAccount", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "put": { + "tags": [ + "banking-controller" + ], + "operationId": "saveAccount_3", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "post": { + "tags": [ + "banking-controller" + ], + "operationId": "saveAccount_2", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "delete": { + "tags": [ + "banking-controller" + ], + "operationId": "saveAccount_5", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "options": { + "tags": [ + "banking-controller" + ], + "operationId": "saveAccount_6", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "head": { + "tags": [ + "banking-controller" + ], + "operationId": "saveAccount_1", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + }, + "patch": { + "tags": [ + "banking-controller" + ], + "operationId": "saveAccount_4", + "responses": { + "200": { + "description": "OK", + "content": { + "application/hal+json": { + "schema": { + "type": "string" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "AbstractJsonSchemaPropertyObject": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "readOnly": { + "type": "boolean" + } + } + }, + "Item": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "properties": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/AbstractJsonSchemaPropertyObject" + } + }, + "requiredProperties": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "JsonSchema": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "properties": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/AbstractJsonSchemaPropertyObject" + } + }, + "requiredProperties": { + "type": "array", + "items": { + "type": "string" + } + }, + "definitions": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/Item" + } + }, + "type": { + "type": "string" + }, + "$schema": { + "type": "string" + } + } + }, + "Links": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/Link" + } + }, + "RepresentationModelObject": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/components/schemas/Links" + } + } + }, + "EntityModelTransaction": { + "type": "object", + "properties": { + "accountno": { + "type": "string" + }, + "amounttype": { + "type": "string" + }, + "merchant": { + "type": "string" + }, + "referencekeytype": { + "type": "string" + }, + "referencekeyvalue": { + "type": "string" + }, + "originalamount": { + "type": "string" + }, + "amount": { + "type": "string" + }, + "trancd": { + "type": "string" + }, + "description": { + "type": "string" + }, + "initialdate": { + "type": "string" + }, + "settlementdate": { + "type": "string" + }, + "postingdate": { + "type": "string" + }, + "status": { + "type": "string" + }, + "disputeid": { + "type": "string" + }, + "transactionreturn": { + "type": "string" + }, + "location": { + "type": "string" + }, + "transactiontags": { + "type": "string" + }, + "_links": { + "$ref": "#/components/schemas/Links" + } + } + }, + "Transaction": { + "type": "object", + "properties": { + "tranid": { + "type": "string" + }, + "accountno": { + "type": "string" + }, + "amounttype": { + "type": "string" + }, + "merchant": { + "type": "string" + }, + "referencekeytype": { + "type": "string" + }, + "referencekeyvalue": { + "type": "string" + }, + "originalamount": { + "type": "string" + }, + "amount": { + "type": "string" + }, + "trancd": { + "type": "string" + }, + "description": { + "type": "string" + }, + "initialdate": { + "type": "string" + }, + "settlementdate": { + "type": "string" + }, + "postingdate": { + "type": "string" + }, + "status": { + "type": "string" + }, + "disputeid": { + "type": "string" + }, + "transactionreturn": { + "type": "string" + }, + "location": { + "type": "string" + }, + "transactiontags": { + "type": "string" + } + } + }, + "PageMetadata": { + "type": "object", + "properties": { + "size": { + "type": "integer", + "format": "int64" + }, + "totalElements": { + "type": "integer", + "format": "int64" + }, + "totalPages": { + "type": "integer", + "format": "int64" + }, + "number": { + "type": "integer", + "format": "int64" + } + } + }, + "PagedModelEntityModelTransaction": { + "type": "object", + "properties": { + "_embedded": { + "type": "object", + "properties": { + "transactions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EntityModelTransaction" + } + } + } + }, + "_links": { + "$ref": "#/components/schemas/Links" + }, + "page": { + "$ref": "#/components/schemas/PageMetadata" + } + } + }, + "TransactionRequestBody": { + "type": "object", + "properties": { + "tranid": { + "type": "string" + }, + "accountno": { + "type": "string" + }, + "amounttype": { + "type": "string" + }, + "merchant": { + "type": "string" + }, + "referencekeytype": { + "type": "string" + }, + "referencekeyvalue": { + "type": "string" + }, + "originalamount": { + "type": "string" + }, + "amount": { + "type": "string" + }, + "trancd": { + "type": "string" + }, + "description": { + "type": "string" + }, + "initialdate": { + "type": "string" + }, + "settlementdate": { + "type": "string" + }, + "postingdate": { + "type": "string" + }, + "status": { + "type": "string" + }, + "disputeid": { + "type": "string" + }, + "transactionreturn": { + "type": "string" + }, + "location": { + "type": "string" + }, + "transactiontags": { + "type": "string" + } + } + }, + "Dispute": { + "type": "object", + "properties": { + "disputeId": { + "type": "string" + }, + "tranId": { + "type": "string" + }, + "filingDate": { + "type": "string" + }, + "reviewDate": { + "type": "string" + }, + "reasonCode": { + "type": "string" + }, + "acceptanceChargeBackDate": { + "type": "string" + }, + "resolutionDate": { + "type": "string" + }, + "lastUpdateDate": { + "type": "string" + }, + "status": { + "type": "string" + }, + "chargeBackAmount": { + "type": "string" + } + } + }, + "Customer": { + "type": "object", + "properties": { + "customerId": { + "type": "string" + }, + "addressLine1": { + "type": "string" + }, + "addressLine2": { + "type": "string" + }, + "addressType": { + "type": "string" + }, + "billPayEnrolled": { + "type": "string" + }, + "city": { + "type": "string" + }, + "countryCode": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "createdDatetime": { + "type": "string" + }, + "customerOriginSystem": { + "type": "string" + }, + "customerStatus": { + "type": "string" + }, + "customerType": { + "type": "string" + }, + "dateOfBirth": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "fullName": { + "type": "string" + }, + "gender": { + "type": "string" + }, + "governmentId": { + "type": "string" + }, + "governmentIdType": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "lastUpdated": { + "type": "string" + }, + "lastUpdatedBy": { + "type": "string" + }, + "middleName": { + "type": "string" + }, + "prefix": { + "type": "string" + }, + "queryHelperColumn": { + "type": "string" + }, + "stateAbbreviation": { + "type": "string" + }, + "zipcode": { + "type": "string" + }, + "zipcode4": { + "type": "string" + } + } + }, + "Document": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "score": { + "type": "number", + "format": "double" + }, + "payload": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + } + }, + "properties": { + "type": "object" + } + } + }, + "SearchResult": { + "type": "object", + "properties": { + "totalResults": { + "type": "integer", + "format": "int64" + }, + "documents": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Document" + } + } + } + }, + "Link": { + "type": "object", + "properties": { + "href": { + "type": "string" + }, + "hreflang": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "deprecation": { + "type": "string" + }, + "profile": { + "type": "string" + }, + "name": { + "type": "string" + }, + "templated": { + "type": "boolean" + } + } + } + } + } +} diff --git a/scripts/build/docker-compose.build.yml b/scripts/build/docker-compose.build.yml index 645dfd930..fdae98cb3 100644 --- a/scripts/build/docker-compose.build.yml +++ b/scripts/build/docker-compose.build.yml @@ -197,6 +197,7 @@ services: cp cs/rest/tiltaksgjennomforing/target/tiltaksgjennomforing-sut.jar /dist/ cp cs/rest/ohsome-api/target/ohsome-api-sut.jar /dist/ cp cs/rest/spring-rest-example/target/spring-rest-example-sut.jar /dist/ + cp cs/rest/digitalbanking/target/digitalbanking-sut.jar /dist/ if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then cp em/external/web/spring-petclinic/target/spring-petclinic-evomaster-runner.jar /dist/ cp em/external/grpc/signal-registration/target/signal-registration-evomaster-runner.jar /dist/ @@ -204,6 +205,7 @@ services: cp em/external/rest/tiltaksgjennomforing/target/tiltaksgjennomforing-evomaster-runner.jar /dist/ cp em/external/rest/ohsome-api/target/ohsome-api-evomaster-runner.jar /dist/ cp em/external/rest/spring-rest-example/target/spring-rest-example-evomaster-runner.jar /dist/ + cp em/external/rest/digitalbanking/target/digitalbanking-evomaster-runner.jar /dist/ fi echo 'JDK 17 Maven build completed' diff --git a/scripts/dist.py b/scripts/dist.py index 55a7aaa8b..b836565e5 100755 --- a/scripts/dist.py +++ b/scripts/dist.py @@ -286,6 +286,9 @@ def build_jdk_17_maven(): copy(folder + "/cs/rest/spring-rest-example/target/spring-rest-example-sut.jar", DIST) copy(folder + "/em/external/rest/spring-rest-example/target/spring-rest-example-evomaster-runner.jar", DIST) + copy(folder + "/cs/rest/digitalbanking/target/digitalbanking-sut.jar", DIST) + copy(folder + "/em/external/rest/digitalbanking/target/digitalbanking-evomaster-runner.jar", DIST) + #################### def build_jdk_21_maven(): folder = "jdk_21_maven" diff --git a/scripts/dockerize/data/sut.csv b/scripts/dockerize/data/sut.csv index 43c907bce..7766223d3 100644 --- a/scripts/dockerize/data/sut.csv +++ b/scripts/dockerize/data/sut.csv @@ -38,3 +38,4 @@ microcks,TRUE,-DPOSTMAN_RUNNER_URL=http://postman:3000 -DSERVICES_UPDATE_INTERVA commafeed,TRUE,"-Dquarkus.http.port=8080 -Dquarkus.datasource.db-kind=h2 -Dquarkus.datasource.jdbc.url=""jdbc:h2:mem:commafeed;DB_CLOSE_DELAY=-1"" -Dquarkus.datasource.username=sa -Dquarkus.datasource.password=sa","",http://localhost:8080/openapi?format=json,http://localhost:8080,FALSE,"","" jasper,TRUE,,--server.port=8080 --spring.profiles.active=api-docs --spring.datasource.url=jdbc:postgresql://db:5432/jasper --spring.datasource.username=postgres --spring.datasource.password=password --spring.datasource.hikari.auto-commit=false --spring.jpa.database-platform=jasper.config.PostgreSQLDialect --springdoc.api-docs.path=/api/v3/api-docs --jasper.allow-user-tag-header=true --jasper.allow-user-role-header=true --jasper.allow-auth-headers=true,http://localhost:8080/api/v3/api-docs/jasper,http://localhost:8080,FALSE,,"[{""image_name"": ""postgres:18"", ""tmp_fs"": ""/var/lib/postgresql"", ""environment"": ""POSTGRES_PASSWORD: password;POSTGRES_HOST_AUTH_METHOD: trust;POSTGRES_DB: jasper"", ""volume"": """", ""health_check_command"": """"}]" redis-sample,TRUE,"",--server.port=8080 --spring.data.redis.host=db --spring.data.redis.port=6379 --spring.data.redis.password=53cret --spring.autoconfigure.exclude=org.springframework.boot.security.autoconfigure.web.servlet.ServletWebSecurityAutoConfiguration --app.numberOfRatings=5000 --app.ratingStars=5,http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,"","[{""image_name"": ""redis:7.4-alpine"", ""tmp_fs"": """", ""environment"": """", ""volume"": """", ""health_check_command"": """", ""command"": ""redis-server --requirepass 53cret""}]" +digitalbanking,TRUE,,--server.port=8080 --REDIS_HOST=db --REDIS_PORT=6379 --REDIS_PASSWORD=jasonrocks --redis.host=db --redis.port=6379 --KAFKA_HOST=kafka --KAFKA_PORT=9092 --SPRING_CASSANDRA_HOST=cassandra --SPRING_CASSANDRA_PORT=9042 --SPRING_CASSANDRA_CLUSTER=test --SPRING_CASSANDRA_DATACENTER=datacenter1,http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,db;cassandra,"[{""image_name"": ""redis/redis-stack-server:7.4.0-v1"", ""tmp_fs"": """", ""environment"": ""REDIS_ARGS: --requirepass jasonrocks"", ""volume"": """", ""health_check_command"": ""redis-cli -a jasonrocks ping | grep PONG""}, {""name"": ""cassandra"", ""image_name"": ""cassandra:4.1"", ""tmp_fs"": """", ""environment"": ""CASSANDRA_CLUSTER_NAME: test;CASSANDRA_DC: datacenter1;CASSANDRA_ENDPOINT_SNITCH: SimpleSnitch;HEAP_NEWSIZE: 128M;MAX_HEAP_SIZE: 512M"", ""volume"": """", ""health_check_command"": ""cqlsh -e \""CREATE KEYSPACE IF NOT EXISTS banking WITH replication = {'class':'SimpleStrategy','replication_factor':1};CREATE TABLE IF NOT EXISTS banking.transaction (tranid text, accountno text, amounttype text, merchant text, referencekeytype text, referencekeyvalue text, originalamount text, amount text, trancd text, description text, initialdate text, settlementdate text, postingdate text, status text, disputeid text, transactionreturn text, location text, transactiontags text, primary key (tranid));\""""}, {""name"": ""kafka"", ""image_name"": ""apache/kafka:3.8.1"", ""tmp_fs"": """", ""environment"": ""KAFKA_NODE_ID: 1;KAFKA_PROCESS_ROLES: broker,controller;KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093;KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092;KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER;KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT;KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093;KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1;KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1;KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1;KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0"", ""volume"": """", ""health_check_command"": """"}]" diff --git a/statistics/data.csv b/statistics/data.csv index 80b1fbd4a..427fa1b7c 100644 --- a/statistics/data.csv +++ b/statistics/data.csv @@ -48,6 +48,7 @@ TRUE,webgoat,REST,Java,JDK 21,Maven,355,27638,H2,GPL,204,TRUE,https://github.com TRUE,commafeed,REST,Java,JDK 25,Maven,201,21287,H2,Apache,44,TRUE,https://github.com/Athou/commafeed TRUE,jasper,REST,Java,JDK 25,Maven,337,46791,PostgreSQL,MIT,61,TRUE,https://github.com/cjmalloy/jasper TRUE,redis-sample,REST,Java,JDK 21,Maven,18,1006,Redis,UNDEFINED,4,FALSE,https://github.com/hendisantika/spring-boot-redis-sample +TRUE,digitalbanking,REST,Java,JDK 17,Maven,27,2835,Redis;Cassandra,UNDEFINED,56,FALSE,https://github.com/jphaugla/Redisearch-Digital-Banking-redisTemplate FALSE,ind0,REST,Java,JDK 8,Gradle,103,17039,PostgreSQL,Proprietary,20,FALSE,UNDEFINED FALSE,ind1,REST,Java;Kotlin,JDK 11,Gradle,163,15240,PostgreSQL,Proprietary,53,FALSE,UNDEFINED diff --git a/statistics/table_emb.md b/statistics/table_emb.md index de751d2e8..3b413bbef 100644 --- a/statistics/table_emb.md +++ b/statistics/table_emb.md @@ -13,6 +13,7 @@ |REST|__catwatch__|9636|106|14|Java|JDK 8|Maven|H2|| |REST|__commafeed__|21287|201|44|Java|JDK 25|Maven|H2|✓| |REST|__cwa-verification__|3955|47|5|Java|JDK 11|Maven|H2|| +|REST|__digitalbanking__|2835|27|56|Java|JDK 17|Maven|Redis, Cassandra|| |REST|__erc20-rest-service__|1378|7|13|Java|JDK 8|Gradle||| |REST|__familie-ba-sak__|143556|1089|183|Kotlin|JDK 17|Maven|PostgreSQL|✓| |REST|__features-service__|2275|39|18|Java|JDK 8|Maven|H2|| From 1e8779343ede38c9db7d8a2b8512456a8f1f2e37 Mon Sep 17 00:00:00 2001 From: Omur Sahin Date: Mon, 31 Aug 2026 18:21:37 +0300 Subject: [PATCH 2/3] rename dist file --- scripts/{dist.py => dist-wb.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename scripts/{dist.py => dist-wb.py} (100%) mode change 100755 => 100644 diff --git a/scripts/dist.py b/scripts/dist-wb.py old mode 100755 new mode 100644 similarity index 100% rename from scripts/dist.py rename to scripts/dist-wb.py From 2e3328ad15563acdc3503ef406ae2b2db9140c2d Mon Sep 17 00:00:00 2001 From: Omur Sahin Date: Mon, 31 Aug 2026 19:34:51 +0300 Subject: [PATCH 3/3] regenerate dockerfile --- dockerfiles/digitalbanking.dockerfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/dockerfiles/digitalbanking.dockerfile b/dockerfiles/digitalbanking.dockerfile index 541e67dde..5e11d1fdd 100644 --- a/dockerfiles/digitalbanking.dockerfile +++ b/dockerfiles/digitalbanking.dockerfile @@ -5,13 +5,9 @@ COPY ./dist/jacocoagent.jar . -#ENV TOOL="undefined" -#ENV RUN="0" ENTRYPOINT \ java \ -# unfortunately dumponexit is completely unreliable in Docker :( -# -javaagent:jacocoagent.jar=destfile=./jacoco/digitalbanking__${TOOL}__${RUN}__jacoco.exec,append=false,dumponexit=true \ -javaagent:jacocoagent.jar=output=tcpserver,address=*,port=6300,append=false,dumponexit=false \ -jar digitalbanking-sut.jar \ --server.port=8080 --REDIS_HOST=db --REDIS_PORT=6379 --REDIS_PASSWORD=jasonrocks --redis.host=db --redis.port=6379 --KAFKA_HOST=kafka --KAFKA_PORT=9092 --SPRING_CASSANDRA_HOST=cassandra --SPRING_CASSANDRA_PORT=9042 --SPRING_CASSANDRA_CLUSTER=test --SPRING_CASSANDRA_DATACENTER=datacenter1 \ No newline at end of file