diff --git a/.gitignore b/.gitignore index f787dd454..33f3182b8 100644 --- a/.gitignore +++ b/.gitignore @@ -423,6 +423,9 @@ 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_8_maven/cs/rest/original/notebook-manager/target/ +/jdk_8_maven/em/embedded/rest/notebook-manager/target/ +/jdk_8_maven/em/external/rest/notebook-manager/target/ /jdk_21_maven/cs/rest-gui/microcks/target /jdk_21_maven/cs/rest-gui/microcks/commons/model/target diff --git a/README.md b/README.md index 31e94118d..05e97cb79 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 (53) +### REST: Java/Kotlin (54) * **AdoptMe** (not-known license), [jdk_21_maven/cs/rest/adoptme](jdk_21_maven/cs/rest/adoptme), from [https://github.com/daanimelian/Programacion3-TPO](https://github.com/daanimelian/Programacion3-TPO) @@ -143,6 +143,8 @@ Auth configuration files can found in the [auth](auth) folder. * **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) +* **NoteBook Manager** (not-known license), [jdk_8_maven/cs/rest/original/notebook-manager](jdk_8_maven/cs/rest/original/notebook-manager), from [https://github.com/birddevelper/NoteBookManager](https://github.com/birddevelper/NoteBookManager) + * **OCVN** (MIT), [jdk_8_maven/cs/rest-gui/ocvn](jdk_8_maven/cs/rest-gui/ocvn), from [https://github.com/devgateway/ocvn](https://github.com/devgateway/ocvn) * **Ohsome API** (AGPL-3.0), [jdk_17_maven/cs/rest/ohsome-api](jdk_17_maven/cs/rest/ohsome-api), from [https://github.com/GIScience/ohsome-api](https://github.com/GIScience/ohsome-api) diff --git a/dockerfiles/notebook-manager.dockerfile b/dockerfiles/notebook-manager.dockerfile new file mode 100644 index 000000000..7af7028d6 --- /dev/null +++ b/dockerfiles/notebook-manager.dockerfile @@ -0,0 +1,13 @@ +FROM amazoncorretto:8-alpine-jdk + +COPY ./dist/notebook-manager-sut.jar . +COPY ./dist/jacocoagent.jar . + + + + +ENTRYPOINT \ + java \ + -javaagent:jacocoagent.jar=output=tcpserver,address=*,port=6300,append=false,dumponexit=false \ + -jar notebook-manager-sut.jar \ + --server.port=8080 --spring.datasource.url="jdbc:mysql://db:3306/notebook_manager?useSSL=false&allowPublicKeyRetrieval=true" --spring.datasource.username=root --spring.datasource.password=root \ No newline at end of file diff --git a/dockerfiles/notebook-manager.yaml b/dockerfiles/notebook-manager.yaml new file mode 100644 index 000000000..109a4c4e7 --- /dev/null +++ b/dockerfiles/notebook-manager.yaml @@ -0,0 +1,45 @@ +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-notebook-manager: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-notebook-manager + sut-notebook-manager: + image: webfuzzing/wfd-notebook-manager:FINAL +# build: +# dockerfile: ./dockerfiles/notebook-manager.dockerfile +# context: .. + environment: + AUTH_PORT: ${AUTH_PORT:-8081} + ports: + - "${JACOCO_PORT:-6300}:6300" + depends_on: + db: + condition: service_healthy + db: + image: mysql:8.0 + tmpfs: + - '/var/lib/mysql' + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: notebook_manager + healthcheck: + test: ['CMD', 'mysqladmin', 'ping', '-h', 'localhost'] + interval: 30s + timeout: 30s + retries: 3 \ No newline at end of file diff --git a/experiments/bb-exp.py b/experiments/bb-exp.py index 99a9f6ce3..ba2809a93 100644 --- a/experiments/bb-exp.py +++ b/experiments/bb-exp.py @@ -151,6 +151,7 @@ def __init__(self, name, auth, sleep, schemaformat, classfiles): "jdk_21_maven/cs/rest-gui/microcks/minions/async/target/classes", "jdk_21_maven/cs/rest-gui/microcks/webapp/target/classes"]), Sut("movies-xml",False,SLEEP,JSON,["jdk_21_maven/cs/rest/movies-xml/target/classes"]), + Sut("notebook-manager",False,SLEEP,JSON,["jdk_8_maven/cs/rest/original/notebook-manager/target/classes"]), Sut("ocvn",True,SLEEP,JSON,["jdk_8_maven/cs/rest-gui/ocvn/persistence/target/classes", "jdk_8_maven/cs/rest-gui/ocvn/persistence-mongodb/target/classes", "jdk_8_maven/cs/rest-gui/ocvn/web/target/classes"]), diff --git a/experiments/wb-exp.py b/experiments/wb-exp.py index a7d89d6a9..e8ea762ff 100644 --- a/experiments/wb-exp.py +++ b/experiments/wb-exp.py @@ -209,6 +209,7 @@ def __init__(self, name, platform): Sut("market", JDK_11), Sut("microcks", JDK_21), Sut("movies-xml", JDK_21), + Sut("notebook-manager", JDK_8), Sut("ocvn", JDK_8), Sut("ohsome-api", JDK_17), Sut("pay-publicapi",JDK_11), diff --git a/jacoco.dockerfile b/jacoco.dockerfile index 1fe52af9b..975907358 100644 --- a/jacoco.dockerfile +++ b/jacoco.dockerfile @@ -86,6 +86,7 @@ COPY jdk_21_maven/cs/rest-gui/microcks/distro/uber-async-minion/target/classes COPY jdk_21_maven/cs/rest-gui/microcks/minions/async/target/classes ${CLASS_FILES}/jdk_21_maven/cs/rest-gui/microcks/minions/async/target/classes COPY jdk_21_maven/cs/rest-gui/microcks/webapp/target/classes ${CLASS_FILES}/jdk_21_maven/cs/rest-gui/microcks/webapp/target/classes COPY jdk_21_maven/cs/rest/movies-xml/target/classes ${CLASS_FILES}/jdk_21_maven/cs/rest/movies-xml/target/classes +COPY jdk_8_maven/cs/rest/original/notebook-manager/target/classes ${CLASS_FILES}/jdk_8_maven/cs/rest/original/notebook-manager/target/classes COPY jdk_8_maven/cs/rest-gui/ocvn/persistence/target/classes ${CLASS_FILES}/jdk_8_maven/cs/rest-gui/ocvn/persistence/target/classes COPY jdk_8_maven/cs/rest-gui/ocvn/persistence-mongodb/target/classes ${CLASS_FILES}/jdk_8_maven/cs/rest-gui/ocvn/persistence-mongodb/target/classes COPY jdk_8_maven/cs/rest-gui/ocvn/web/target/classes ${CLASS_FILES}/jdk_8_maven/cs/rest-gui/ocvn/web/target/classes diff --git a/jdk_21_maven/cs/rest/flight-search-api/pom.xml b/jdk_21_maven/cs/rest/flight-search-api/pom.xml index 9057e3104..2466b2b5b 100644 --- a/jdk_21_maven/cs/rest/flight-search-api/pom.xml +++ b/jdk_21_maven/cs/rest/flight-search-api/pom.xml @@ -162,11 +162,15 @@ ${openapi.version} + + + org.springframework.boot diff --git a/jdk_8_maven/cs/rest/original/notebook-manager/pom.xml b/jdk_8_maven/cs/rest/original/notebook-manager/pom.xml index ae42ab9ee..8a924dbf3 100644 --- a/jdk_8_maven/cs/rest/original/notebook-manager/pom.xml +++ b/jdk_8_maven/cs/rest/original/notebook-manager/pom.xml @@ -72,6 +72,10 @@ org.springframework.boot spring-boot-maven-plugin + + notebook-manager + sut + org.projectlombok diff --git a/jdk_8_maven/cs/rest/original/pom.xml b/jdk_8_maven/cs/rest/original/pom.xml index c7206d241..0eddb3b24 100644 --- a/jdk_8_maven/cs/rest/original/pom.xml +++ b/jdk_8_maven/cs/rest/original/pom.xml @@ -27,6 +27,7 @@ spring-actuator-demo swagger-petstore spring-ecommerce + notebook-manager diff --git a/jdk_8_maven/em/embedded/rest/notebook-manager/pom.xml b/jdk_8_maven/em/embedded/rest/notebook-manager/pom.xml new file mode 100644 index 000000000..67d075e9a --- /dev/null +++ b/jdk_8_maven/em/embedded/rest/notebook-manager/pom.xml @@ -0,0 +1,48 @@ + + + + 4.0.0 + + evomaster-benchmark-em-embedded-rest-notebook-manager + jar + + + org.evomaster + evomaster-benchmark-em-embedded-rest + 4.3.1-SNAPSHOT + + + + + + org.springframework.boot + spring-boot-dependencies + 2.6.3 + pom + import + + + + + + + bdp.sample + NoteBookManagerRest + 0.0.1-SNAPSHOT + + + org.testcontainers + testcontainers + compile + + + junit + junit + 4.12 + compile + + + + + diff --git a/jdk_8_maven/em/embedded/rest/notebook-manager/src/main/java/em/embedded/bdp/sample/notebookmanager/EmbeddedEvoMasterController.java b/jdk_8_maven/em/embedded/rest/notebook-manager/src/main/java/em/embedded/bdp/sample/notebookmanager/EmbeddedEvoMasterController.java new file mode 100644 index 000000000..b213bc4a4 --- /dev/null +++ b/jdk_8_maven/em/embedded/rest/notebook-manager/src/main/java/em/embedded/bdp/sample/notebookmanager/EmbeddedEvoMasterController.java @@ -0,0 +1,156 @@ +package em.embedded.bdp.sample.notebookmanager; + + +import bdp.sample.notebookmanager.NoteBookApplication; +import org.evomaster.client.java.controller.EmbeddedSutController; +import org.evomaster.client.java.controller.InstrumentedSutStarter; +import org.evomaster.client.java.controller.api.dto.SutInfoDto; +import org.evomaster.client.java.controller.api.dto.auth.AuthenticationDto; +import org.evomaster.client.java.controller.api.dto.database.schema.DatabaseType; +import org.evomaster.client.java.controller.problem.ProblemInfo; +import org.evomaster.client.java.controller.problem.RestProblem; +import org.evomaster.client.java.sql.DbSpecification; +import org.springframework.boot.SpringApplication; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.jdbc.core.JdbcTemplate; +import org.testcontainers.containers.GenericContainer; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.*; + +/** + * Class used to start/stop the SUT. + */ +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 static final String DB_NAME = "notebook_manager"; + + private static final GenericContainer mysql = new GenericContainer("mysql:8.0") + .withEnv(new HashMap(){{ + put("MYSQL_ROOT_PASSWORD", "root"); + put("MYSQL_DATABASE", DB_NAME); + }}) + .withExposedPorts(3306) + .withTmpFs(Collections.singletonMap("/var/lib/mysql", "rw")); + + private ConfigurableApplicationContext ctx; + private Connection sqlConnection; + private List dbSpecification; + + public EmbeddedEvoMasterController() { + this(40100); + } + + public EmbeddedEvoMasterController(int port) { + setControllerPort(port); + } + + @Override + public String startSut() { + + mysql.start(); + + String url = "jdbc:mysql://" + mysql.getHost() + ":" + mysql.getMappedPort(3306) + "/" + DB_NAME + + "?useSSL=false&allowPublicKeyRetrieval=true"; + + ctx = SpringApplication.run(NoteBookApplication.class, new String[]{ + "--server.port=0", + "--spring.datasource.url=" + url, + "--spring.datasource.username=root", + "--spring.datasource.password=root" + }); + + closeDataBaseConnection(); + JdbcTemplate jdbc = ctx.getBean(JdbcTemplate.class); + try { + sqlConnection = jdbc.getDataSource().getConnection(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + + dbSpecification = Arrays.asList(new DbSpecification(DatabaseType.MYSQL, sqlConnection)); + + 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() { + closeDataBaseConnection(); + if (ctx != null) { + ctx.stop(); + ctx.close(); + } + mysql.stop(); + } + + private void closeDataBaseConnection() { + if (sqlConnection != null) { + try { + sqlConnection.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + sqlConnection = null; + } + } + + @Override + public String getPackagePrefixesToCover() { + return "bdp.sample.notebookmanager."; + } + + @Override + public void resetStateOfSUT() { + } + + @Override + public List getInfoForAuthentication() { + return null; + } + + + @Override + public ProblemInfo getProblemInfo() { + return new RestProblem( + "http://localhost:" + getSutPort() + "/v3/api-docs", + null + ); + } + + @Override + public SutInfoDto.OutputFormat getPreferredOutputFormat() { + return SutInfoDto.OutputFormat.JAVA_JUNIT_4; + } + + @Override + public List getDbSpecifications() { + return dbSpecification; + } + +} diff --git a/jdk_8_maven/em/embedded/rest/pom.xml b/jdk_8_maven/em/embedded/rest/pom.xml index 8b7fa1cb7..8b1b2ab33 100644 --- a/jdk_8_maven/em/embedded/rest/pom.xml +++ b/jdk_8_maven/em/embedded/rest/pom.xml @@ -33,6 +33,7 @@ spring-actuator-demo swagger-petstore spring-ecommerce + notebook-manager \ No newline at end of file diff --git a/jdk_8_maven/em/external/rest/notebook-manager/pom.xml b/jdk_8_maven/em/external/rest/notebook-manager/pom.xml new file mode 100644 index 000000000..9ce7e2ba4 --- /dev/null +++ b/jdk_8_maven/em/external/rest/notebook-manager/pom.xml @@ -0,0 +1,89 @@ + + + + 4.0.0 + + evomaster-benchmark-em-external-rest-notebook-manager + jar + + + org.evomaster + evomaster-benchmark-em-external-rest + 4.3.1-SNAPSHOT + + + + + + org.testcontainers + testcontainers + compile + + + junit + junit + 4.12 + compile + + + mysql + mysql-connector-java + 8.0.33 + + + + + + + org.apache.maven.plugins + maven-shade-plugin + + 3.6.2 + + + package + + shade + + + notebook-manager-evomaster-runner + + + + em.external.bdp.sample.notebookmanager.ExternalEvoMasterController + + org.evomaster.client.java.instrumentation.InstrumentingAgent + + org.evomaster.client.java.instrumentation.InstrumentingAgent + + true + true + + + + + + + javax.validation + shaded.emb.javax.validation + + + org.slf4j + shaded.emb.org.slf4j + + + com.fasterxml.jackson.annotation + shaded.emb.com.fasterxml.jackson.annotation + + + + + + + + + diff --git a/jdk_8_maven/em/external/rest/notebook-manager/src/main/java/em/external/bdp/sample/notebookmanager/ExternalEvoMasterController.java b/jdk_8_maven/em/external/rest/notebook-manager/src/main/java/em/external/bdp/sample/notebookmanager/ExternalEvoMasterController.java new file mode 100644 index 000000000..5139efd24 --- /dev/null +++ b/jdk_8_maven/em/external/rest/notebook-manager/src/main/java/em/external/bdp/sample/notebookmanager/ExternalEvoMasterController.java @@ -0,0 +1,212 @@ +package em.external.bdp.sample.notebookmanager; + +import org.evomaster.client.java.controller.ExternalSutController; +import org.evomaster.client.java.controller.InstrumentedSutStarter; +import org.evomaster.client.java.controller.api.dto.SutInfoDto; +import org.evomaster.client.java.controller.api.dto.auth.AuthenticationDto; +import org.evomaster.client.java.controller.api.dto.database.schema.DatabaseType; +import org.evomaster.client.java.controller.problem.ProblemInfo; +import org.evomaster.client.java.controller.problem.RestProblem; +import org.evomaster.client.java.sql.DbSpecification; +import org.testcontainers.containers.GenericContainer; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +public class ExternalEvoMasterController extends ExternalSutController { + + + public static void main(String[] args) { + + int controllerPort = 40100; + if (args.length > 0) { + controllerPort = Integer.parseInt(args[0]); + } + int sutPort = 12345; + if (args.length > 1) { + sutPort = Integer.parseInt(args[1]); + } + String jarLocation = "cs/rest/original/notebook-manager/target"; + if (args.length > 2) { + jarLocation = args[2]; + } + if(! jarLocation.endsWith(".jar")) { + jarLocation += "/notebook-manager-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 static final String DB_NAME = "notebook_manager"; + + private final int timeoutSeconds; + private final int sutPort; + private String jarLocation; + private Connection sqlConnection; + + private List dbSpecification; + + private static final GenericContainer mysql = new GenericContainer("mysql:8.0") + .withEnv(new HashMap(){{ + put("MYSQL_ROOT_PASSWORD", "root"); + put("MYSQL_DATABASE", DB_NAME); + }}) + .withExposedPorts(3306) + .withTmpFs(Collections.singletonMap("/var/lib/mysql", "rw")); + + public ExternalEvoMasterController(){ + this(40100, "cs/rest/original/notebook-manager/target/notebook-manager-sut.jar", 12345, 120, "java"); + } + + public ExternalEvoMasterController(String jarLocation) { + this(); + this.jarLocation = jarLocation; + } + + public ExternalEvoMasterController( + int controllerPort, String jarLocation, int sutPort, int timeoutSeconds, String command + ) { + + if(jarLocation==null || jarLocation.isEmpty()){ + throw new IllegalArgumentException("Missing jar location"); + } + + + this.sutPort = sutPort; + this.jarLocation = jarLocation; + this.timeoutSeconds = timeoutSeconds; + setControllerPort(controllerPort); + setJavaCommand(command); + } + + + @Override + public String[] getInputParameters() { + return new String[]{ + "--server.port=" + sutPort, + "--spring.datasource.url=" + dbUrl(), + "--spring.datasource.username=root", + "--spring.datasource.password=root" + }; + } + + public String[] getJVMParameters() { + return new String[]{}; + } + + private String dbUrl() { + return "jdbc:mysql://" + mysql.getHost() + ":" + mysql.getMappedPort(3306) + "/" + DB_NAME + + "?useSSL=false&allowPublicKeyRetrieval=true"; + } + + @Override + public String getBaseURL() { + return "http://localhost:" + sutPort; + } + + @Override + public String getPathToExecutableJar() { + return jarLocation; + } + + @Override + public String getLogMessageOfInitializedServer() { + return "Started NoteBookApplication in"; + } + + @Override + public long getMaxAwaitForInitializationInSeconds() { + return timeoutSeconds; + } + + @Override + public void preStart() { + mysql.start(); + } + + @Override + public void postStart() { + closeDataBaseConnection(); + + try { + sqlConnection = DriverManager.getConnection(dbUrl(), "root", "root"); + dbSpecification = Arrays.asList(new DbSpecification(DatabaseType.MYSQL, sqlConnection)); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public void resetStateOfSUT() { + } + + @Override + public void preStop() { + closeDataBaseConnection(); + } + + @Override + public void postStop() { + mysql.stop(); + } + + private void closeDataBaseConnection() { + if (sqlConnection != null) { + try { + sqlConnection.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + sqlConnection = null; + } + } + + @Override + public String getPackagePrefixesToCover() { + return "bdp.sample.notebookmanager."; + } + + @Override + public ProblemInfo getProblemInfo() { + return new RestProblem( + getBaseURL() + "/v3/api-docs", + null + ); + } + + @Override + public SutInfoDto.OutputFormat getPreferredOutputFormat() { + return SutInfoDto.OutputFormat.JAVA_JUNIT_4; + } + + + @Override + public List getInfoForAuthentication() { + return null; + } + + @Override + public List getDbSpecifications() { + return dbSpecification; + } +} diff --git a/jdk_8_maven/em/external/rest/pom.xml b/jdk_8_maven/em/external/rest/pom.xml index 09762a8ff..64d9bcbcb 100644 --- a/jdk_8_maven/em/external/rest/pom.xml +++ b/jdk_8_maven/em/external/rest/pom.xml @@ -34,6 +34,7 @@ spring-actuator-demo swagger-petstore spring-ecommerce + notebook-manager \ No newline at end of file diff --git a/openapi/notebook-manager.json b/openapi/notebook-manager.json new file mode 100644 index 000000000..7c2762c9b --- /dev/null +++ b/openapi/notebook-manager.json @@ -0,0 +1,291 @@ +{ + "openapi": "3.0.1", + "info": { + "title": "OpenAPI definition", + "version": "v0" + }, + "servers": [ + { + "url": "http://localhost:8080", + "description": "Generated server url" + } + ], + "paths": { + "/api/notebooks": { + "get": { + "tags": [ + "note-book-controller" + ], + "summary": "Get list of notebooks (Ordered by Id in ascending order), you must specify page number and page size", + "operationId": "getnotebooks", + "parameters": [ + { + "name": "page", + "in": "query", + "description": "Page index (start from 0)", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "pageSize", + "in": "query", + "description": "Number of records per page", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "500": { + "description": "Internal Error" + }, + "400": { + "description": "Invalid parameters supplied" + }, + "200": { + "description": "Successful Operation", + "content": { + "application/json": {} + } + } + } + }, + "post": { + "tags": [ + "note-book-controller" + ], + "summary": "Create a new notebook", + "operationId": "createnotebook", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NoteBook" + } + } + }, + "required": true + }, + "responses": { + "500": { + "description": "Internal Error" + }, + "404": { + "description": "notebook not found" + }, + "409": { + "description": "Duplicate notebook name" + }, + "201": { + "description": "notebook created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NoteBook" + } + } + } + }, + "400": { + "description": "Invalid id supplied" + } + } + } + }, + "/api/notebooks/{notebookId}": { + "get": { + "tags": [ + "note-book-controller" + ], + "summary": "Get a notebook by its id", + "operationId": "getnotebookById", + "parameters": [ + { + "name": "notebookId", + "in": "path", + "description": "id of notebook to be retrieved", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "500": { + "description": "Internal Error" + }, + "404": { + "description": "notebook not found" + }, + "200": { + "description": "Found the notebook", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NoteBook" + } + } + } + }, + "400": { + "description": "Invalid id supplied" + } + } + }, + "delete": { + "tags": [ + "note-book-controller" + ], + "summary": "Delete a notebook by its id", + "operationId": "deletenotebook", + "parameters": [ + { + "name": "notebookId", + "in": "path", + "description": "id of notebook to be deleted", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "500": { + "description": "Internal Error" + }, + "404": { + "description": "notebook not found" + }, + "202": { + "description": "notebook deleted" + }, + "400": { + "description": "Invalid id supplied" + } + } + }, + "patch": { + "tags": [ + "note-book-controller" + ], + "summary": "Update a notebook by its id", + "operationId": "updatenotebook", + "parameters": [ + { + "name": "notebookId", + "in": "path", + "description": "id of notebook to be updated", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NoteBook" + } + } + }, + "required": true + }, + "responses": { + "500": { + "description": "Internal Error" + }, + "404": { + "description": "notebook not found" + }, + "409": { + "description": "Duplicate notebook name" + }, + "400": { + "description": "Invalid id supplied" + }, + "202": { + "description": "notebook updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NoteBook" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Link": { + "type": "object", + "properties": { + "rel": { + "type": "string" + }, + "href": { + "type": "string" + }, + "hreflang": { + "type": "string" + }, + "media": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "deprecation": { + "type": "string" + }, + "profile": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "NoteBook": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "currentPrice": { + "type": "number", + "format": "double" + }, + "lastUpdate": { + "type": "string", + "format": "date-time" + }, + "id": { + "type": "integer", + "format": "int32" + }, + "links": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Link" + } + } + } + } + } + } +} diff --git a/scripts/build/docker-compose.build.yml b/scripts/build/docker-compose.build.yml index 9d1936296..fc76eb66b 100644 --- a/scripts/build/docker-compose.build.yml +++ b/scripts/build/docker-compose.build.yml @@ -39,6 +39,7 @@ services: cp cs/rest/original/spring-actuator-demo/target/spring-actuator-demo-sut.jar /dist/ cp cs/rest/original/swagger-petstore/target/swagger-petstore-sut.jar /dist/ cp cs/rest/original/spring-ecommerce/target/spring-ecommerce-sut.jar /dist/ + cp cs/rest/original/notebook-manager/target/notebook-manager-sut.jar /dist/ cp cs/graphql/petclinic-graphql/target/petclinic-graphql-sut.jar /dist/ cp cs/graphql/graphql-ncs/target/graphql-ncs-sut.jar /dist/ cp cs/graphql/graphql-scs/target/graphql-scs-sut.jar /dist/ @@ -67,6 +68,7 @@ services: cp em/external/rest/spring-actuator-demo/target/spring-actuator-demo-evomaster-runner.jar /dist/ cp em/external/rest/swagger-petstore/target/swagger-petstore-evomaster-runner.jar /dist/ cp em/external/rest/spring-ecommerce/target/spring-ecommerce-evomaster-runner.jar /dist/ + cp em/external/rest/notebook-manager/target/notebook-manager-evomaster-runner.jar /dist/ cp em/external/graphql/petclinic-graphql/target/petclinic-graphql-evomaster-runner.jar /dist/ cp em/external/graphql/graphql-ncs/target/graphql-ncs-evomaster-runner.jar /dist/ cp em/external/graphql/graphql-scs/target/graphql-scs-evomaster-runner.jar /dist/ diff --git a/scripts/dist-wb.py b/scripts/dist-wb.py index 9f882f45e..3185d5695 100644 --- a/scripts/dist-wb.py +++ b/scripts/dist-wb.py @@ -195,6 +195,9 @@ def build_jdk_8_maven(): copy(folder + "/cs/rest/original/spring-ecommerce/target/spring-ecommerce-sut.jar", DIST) copy(folder + "/em/external/rest/spring-ecommerce/target/spring-ecommerce-evomaster-runner.jar", DIST) + copy(folder + "/cs/rest/original/notebook-manager/target/notebook-manager-sut.jar", DIST) + copy(folder + "/em/external/rest/notebook-manager/target/notebook-manager-evomaster-runner.jar", DIST) + # graphql copy(folder + "/cs/graphql/petclinic-graphql/target/petclinic-graphql-sut.jar", DIST) diff --git a/scripts/dockerize/data/sut.csv b/scripts/dockerize/data/sut.csv index 496c0f728..fa844e835 100644 --- a/scripts/dockerize/data/sut.csv +++ b/scripts/dockerize/data/sut.csv @@ -52,3 +52,4 @@ management-cassandra,TRUE,-Dmgmtapi.cql.tcp=cassandra:9999,-K true -H tcp://0.0. petclinic-rest,TRUE,,--server.port=8080 --spring.jpa.show-sql=false,http://localhost:8080/petclinic/v3/api-docs,http://localhost:8080,FALSE,, traccar,TRUE,,traccar.xml,,http://localhost:8080,TRUE,, flight-search-api,TRUE,,--server.port=8080 --spring.data.mongodb.host=db --spring.data.mongodb.port=27017 --spring.data.mongodb.database=flightdatabase,http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,db,"[{""image_name"": ""mongo:7"", ""tmp_fs"": """", ""environment"": """", ""volume"": ""./additional_files/flight-search-api/flight-search-api-mongo-seed.js:/docker-entrypoint-initdb.d/flight-search-api-mongo-seed.js"", ""health_check_command"": ""mongosh --quiet --eval \""db.adminCommand('ping')\""""}]" +notebook-manager,TRUE,,"--server.port=8080 --spring.datasource.url=""jdbc:mysql://db:3306/notebook_manager?useSSL=false&allowPublicKeyRetrieval=true"" --spring.datasource.username=root --spring.datasource.password=root",http://localhost:8080/v3/api-docs,http://localhost:8080,FALSE,db,"[{""image_name"": ""mysql:8.0"", ""tmp_fs"": ""/var/lib/mysql"", ""environment"": ""MYSQL_ROOT_PASSWORD: root;MYSQL_DATABASE: notebook_manager"", ""volume"": """", ""health_check_command"": [""CMD"", ""mysqladmin"", ""ping"", ""-h"", ""localhost""]}]" diff --git a/statistics/data.csv b/statistics/data.csv index c355ee423..bf28a3f6e 100644 --- a/statistics/data.csv +++ b/statistics/data.csv @@ -64,4 +64,5 @@ TRUE,management-cassandra,REST,Java,JDK 11,Maven,225,35096,Cassandra,Apache,63,F TRUE,petclinic-rest,REST,Java,JDK 17,Maven,109,8675,H2,Apache,43,FALSE,https://github.com/spring-petclinic/spring-petclinic-rest TRUE,traccar,REST,Java,JDK 21,Gradle,1478,141962,H2,Apache,117,TRUE,https://github.com/traccar/traccar TRUE,flight-search-api,REST,Java,JDK 21,Maven,194,14440,MongoDB,MIT,40,TRUE,https://github.com/Rapter1990/flightsearchapi +TRUE,notebook-manager,REST,Java,JDK 8,Maven,10,826,MySQL,UNDEFINED,5,FALSE,https://github.com/birddevelper/NoteBookManager diff --git a/statistics/http-verbs.csv b/statistics/http-verbs.csv index de086bdf9..358f77da0 100644 --- a/statistics/http-verbs.csv +++ b/statistics/http-verbs.csv @@ -25,6 +25,7 @@ management-cassandra,20,1,38,4,0,0,0,0,0,0 market,7,3,2,1,0,0,0,0,0,0 microcks,47,9,20,6,2,2,2,0,0,0 movies-xml,3,1,1,1,0,0,1,0,0,0 +notebook-manager,2,0,1,1,0,0,1,0,0,0 ocvn,96,0,96,0,0,0,0,0,0,0 ohsome-api,67,0,67,0,0,0,0,0,0,0 pay-publicapi,9,0,7,0,0,0,0,0,0,0 diff --git a/statistics/http-verbs.md b/statistics/http-verbs.md index e68c1e34c..6082cfad6 100644 --- a/statistics/http-verbs.md +++ b/statistics/http-verbs.md @@ -26,6 +26,7 @@ | market | 7 | 3 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 13 | | microcks | 47 | 9 | 20 | 6 | 2 | 2 | 2 | 0 | 0 | 0 | 88 | | movies-xml | 3 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 7 | +| notebook-manager | 2 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 5 | | ocvn | 96 | 0 | 96 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 192 | | ohsome-api | 67 | 0 | 67 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 134 | | pay-publicapi | 9 | 0 | 7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 16 | @@ -53,4 +54,4 @@ | user-management | 7 | 2 | 7 | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 21 | | webgoat | 50 | 10 | 112 | 8 | 8 | 8 | 8 | 0 | 0 | 0 | 204 | | youtube-mock | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| Total | 1053 | 176 | 763 | 175 | 21 | 20 | 53 | 0 | 0 | 0 | 2261 | +| Total | 1055 | 176 | 764 | 176 | 21 | 20 | 54 | 0 | 0 | 0 | 2266 | diff --git a/statistics/table_wfd.md b/statistics/table_wfd.md index 3da16b539..fba51cc9d 100644 --- a/statistics/table_wfd.md +++ b/statistics/table_wfd.md @@ -34,6 +34,7 @@ |REST|__market__|9861|124|13|Java|JDK 11|Maven|H2|✓| |REST|__microcks__|66186|471|88|Java|JDK 21|Maven|MongoDB|✓| |REST|__movies-xml__|2502|22|7|Java|JDK 21|Maven|H2|| +|REST|__notebook-manager__|826|10|5|Java|JDK 8|Maven|MySQL|| |REST|__ocvn__|45521|526|258|Java|JDK 8|Maven|H2, MongoDB|✓| |REST|__ohsome-api__|14166|87|134|Java|JDK 17|Maven|OSHDB|| |REST|__pay-publicapi__|34576|377|10|Java|JDK 11|Maven|Redis|✓|