Skip to content

Commit ed7cf3d

Browse files
committed
em driver for PayPublicApi
1 parent 3407c51 commit ed7cf3d

6 files changed

Lines changed: 271 additions & 4 deletions

File tree

.gitignore

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,4 +259,8 @@ dotnet_3/em/embedded/rest/ScsDriver/generated-tests/
259259
/jdk_8_maven/em/embedded/graphql/spring-petclinic-graphql/target/
260260
/jdk_17_gradle/cs/rest/bibliothek/build/
261261
/jdk_17_gradle/em/external/rest/bibliothek/build
262-
/jdk_17_maven/cs/grpc/signal-registration/target/
262+
/jdk_17_maven/cs/grpc/signal-registration/target/
263+
jdk_11_maven/cs/rest/pay-publicapi/target/
264+
jdk_11_maven/em/embedded/rest/pay-publicapi/target/
265+
266+
jdk_11_maven/em/external/rest/ind1/target/

jdk_11_maven/cs/rest/pay-publicapi/src/main/java/uk/gov/pay/api/app/PublicApi.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import io.prometheus.client.CollectorRegistry;
1616
import io.prometheus.client.dropwizard.DropwizardExports;
1717
import io.prometheus.client.exporter.MetricsServlet;
18+
import org.eclipse.jetty.server.AbstractNetworkConnector;
19+
import org.eclipse.jetty.server.Server;
1820
import org.glassfish.jersey.CommonProperties;
1921
import org.slf4j.Logger;
2022
import org.slf4j.LoggerFactory;
@@ -78,9 +80,19 @@
7880
public class PublicApi extends Application<PublicApiConfig> {
7981

8082
private static final Logger logger = LoggerFactory.getLogger(PublicApi.class);
81-
83+
8284
private static final String SERVICE_METRICS_NODE = "publicapi";
8385

86+
private Server jettyServer;
87+
88+
public int getJettyPort() {
89+
return ((AbstractNetworkConnector)jettyServer.getConnectors()[0]).getLocalPort();
90+
}
91+
92+
public Server getJettyServer() {
93+
return jettyServer;
94+
}
95+
8496
@Override
8597
public void initialize(Bootstrap<PublicApiConfig> bootstrap) {
8698
bootstrap.setConfigurationSourceProvider(
@@ -129,7 +141,7 @@ public void run(PublicApiConfig configuration, Environment environment) {
129141

130142
/*
131143
Turn off 'FilteringJacksonJaxbJsonProvider' which overrides dropwizard JacksonMessageBodyProvider.
132-
Fails on Integration tests if not disabled.
144+
Fails on Integration tests if not disabled.
133145
- https://github.com/dropwizard/dropwizard/issues/1341
134146
*/
135147
environment.jersey().property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, Boolean.TRUE);
@@ -153,6 +165,8 @@ public void run(PublicApiConfig configuration, Environment environment) {
153165
environment.admin().addServlet("prometheusMetrics", new MetricsServlet(collectorRegistry)).addMapping("/metrics");
154166

155167
environment.lifecycle().manage(injector.getInstance(RedisClientManager.class));
168+
169+
environment.lifecycle().addServerLifecycleListener(server -> jettyServer = server);
156170
}
157171

158172
/**
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<parent>
7+
<groupId>org.evomaster</groupId>
8+
<artifactId>evomaster-benchmark-jdk11-em-embedded-rest</artifactId>
9+
<version>2.0.1-SNAPSHOT</version>
10+
</parent>
11+
12+
<artifactId>evomaster-benchmark-jdk11-em-embedded-rest.pay-publicapi</artifactId>
13+
14+
<properties>
15+
<maven.compiler.source>17</maven.compiler.source>
16+
<maven.compiler.target>17</maven.compiler.target>
17+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
18+
</properties>
19+
20+
<dependencies>
21+
<dependency>
22+
<groupId>uk.gov.pay</groupId>
23+
<artifactId>pay-publicapi</artifactId>
24+
<version>0.1-SNAPSHOT</version>
25+
<scope>compile</scope>
26+
</dependency>
27+
28+
<dependency>
29+
<groupId>org.testcontainers</groupId>
30+
<artifactId>testcontainers</artifactId>
31+
<scope>compile</scope>
32+
</dependency>
33+
</dependencies>
34+
35+
</project>
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
package em.embedded.uk.gov.pay.api.app;
2+
3+
import org.evomaster.client.java.controller.EmbeddedSutController;
4+
import org.evomaster.client.java.controller.InstrumentedSutStarter;
5+
import org.evomaster.client.java.controller.api.dto.AuthenticationDto;
6+
import org.evomaster.client.java.controller.api.dto.SutInfoDto;
7+
import org.evomaster.client.java.controller.problem.ProblemInfo;
8+
import org.evomaster.client.java.controller.problem.RestProblem;
9+
import org.evomaster.client.java.sql.DbSpecification;
10+
import org.testcontainers.containers.GenericContainer;
11+
import uk.gov.pay.api.app.PublicApi;
12+
13+
import java.io.File;
14+
import java.util.List;
15+
16+
public class EmbeddedEvoMasterController extends EmbeddedSutController {
17+
18+
private static final int REDIS_PORT = 6379;
19+
20+
private static final String REDIS_VERSION = "7.2.3";
21+
22+
private static final GenericContainer redisContainer = new GenericContainer("redis:" + REDIS_VERSION)
23+
.withExposedPorts(REDIS_PORT);
24+
25+
public static void main(String[] args) {
26+
int port = 40100;
27+
if (args.length > 0) {
28+
port = Integer.parseInt(args[0]);
29+
}
30+
31+
EmbeddedEvoMasterController controller = new EmbeddedEvoMasterController(port);
32+
InstrumentedSutStarter starter = new InstrumentedSutStarter(controller);
33+
34+
starter.start();
35+
}
36+
37+
private PublicApi application;
38+
39+
public EmbeddedEvoMasterController() {
40+
this(40100);
41+
}
42+
43+
public EmbeddedEvoMasterController(int port) {
44+
setControllerPort(port);
45+
}
46+
47+
@Override
48+
public boolean isSutRunning() {
49+
if (application == null) {
50+
return false;
51+
}
52+
53+
return application.getJettyServer().isRunning();
54+
}
55+
56+
@Override
57+
public String getPackagePrefixesToCover() {
58+
return "uk.gov.pay.api.app.";
59+
}
60+
61+
@Override
62+
public List<AuthenticationDto> getInfoForAuthentication() {
63+
return null;
64+
}
65+
66+
@Override
67+
public ProblemInfo getProblemInfo() {
68+
return new RestProblem(
69+
"http://localhost:" + application.getJettyPort() + "/api/swagger.json",
70+
null
71+
);
72+
}
73+
74+
@Override
75+
public SutInfoDto.OutputFormat getPreferredOutputFormat() {
76+
return SutInfoDto.OutputFormat.JAVA_JUNIT_5;
77+
}
78+
79+
@Override
80+
public String startSut() {
81+
82+
redisContainer.start();
83+
84+
// REDIS_URL
85+
application = new PublicApi();
86+
87+
//Dirty hack for DW...
88+
System.setProperty("dw.server.connector.port", "0");
89+
System.setProperty("REDIS_URL", "localhost:" + REDIS_PORT);
90+
91+
try {
92+
application.run("server", "/src/main/resources/em_config.yaml");
93+
} catch (Exception e) {
94+
e.printStackTrace();
95+
return null;
96+
}
97+
98+
try {
99+
Thread.sleep(3_000);
100+
} catch (InterruptedException e) {
101+
102+
}
103+
while (!application.getJettyServer().isStarted()) {
104+
try {
105+
Thread.sleep(1_000);
106+
} catch (InterruptedException e) {
107+
}
108+
}
109+
110+
int p = application.getJettyPort();
111+
return "http://localhost:" + application.getJettyPort();
112+
}
113+
114+
@Override
115+
public void stopSut() {
116+
if (application != null) {
117+
try {
118+
application.getJettyServer().stop();
119+
} catch (Exception e) {
120+
e.printStackTrace();
121+
}
122+
}
123+
124+
redisContainer.stop();
125+
}
126+
127+
@Override
128+
public void resetStateOfSUT() {
129+
deleteDir(new File("./target/temp"));
130+
}
131+
132+
@Override
133+
public List<DbSpecification> getDbSpecifications() {
134+
return null;
135+
}
136+
137+
private void deleteDir(File file) {
138+
File[] contents = file.listFiles();
139+
if (contents != null) {
140+
for (File f : contents) {
141+
deleteDir(f);
142+
}
143+
}
144+
file.delete();
145+
}
146+
147+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
server:
2+
applicationConnectors:
3+
- type: http
4+
port: ${PORT:-8080}
5+
adminConnectors:
6+
- type: http
7+
port: ${ADMIN_PORT:-8081}
8+
requestLog:
9+
appenders:
10+
- type: console
11+
layout:
12+
type: govuk-pay-access-json
13+
additionalFields:
14+
container: "publicapi"
15+
environment: ${ENVIRONMENT}
16+
17+
logging:
18+
level: INFO
19+
appenders:
20+
- type: logstash-console
21+
threshold: ALL
22+
target: stdout
23+
customFields:
24+
container: "publicapi"
25+
environment: ${ENVIRONMENT}
26+
- type: sentry
27+
threshold: ERROR
28+
dsn: ${SENTRY_DSN:-https://example.com@dummy/1}
29+
environment: ${ENVIRONMENT}
30+
31+
baseUrl: ${PUBLICAPI_BASE}
32+
connectorUrl: ${CONNECTOR_URL}
33+
publicAuthUrl: ${PUBLIC_AUTH_URL}
34+
ledgerUrl: ${LEDGER_URL}
35+
36+
jerseyClientConfig:
37+
disabledSecureConnection: ${DISABLE_INTERNAL_HTTPS:-false}
38+
39+
rateLimiter: # rate = noOfReq per perMillis
40+
noOfReq: ${RATE_LIMITER_VALUE:-75} # for requests except POST and across all publicapi instances.
41+
noOfReqForPost: ${RATE_LIMITER_VALUE_POST:-15} # for POST requests across all publicapi instances.
42+
elevatedAccounts: ${RATE_LIMITER_ELEVATED_ACCOUNTS}
43+
noOfReqForElevatedAccounts: ${RATE_LIMITER_ELEVATED_VALUE_GET:-100}
44+
noOfPostReqForElevatedAccounts: ${RATE_LIMITER_ELEVATED_VALUE_POST:-40}
45+
noOfReqPerNode: ${RATE_LIMITER_VALUE_PER_NODE:-25} # per public api instance, if Redis is unavailable
46+
noOfReqForPostPerNode: ${RATE_LIMITER_VALUE_PER_NODE_POST:-5} # per public api instance, if Redis is unavailable
47+
perMillis: ${RATE_LIMITER_PER_MILLIS:-1000}
48+
lowTrafficAccounts: ${RATE_LIMITER_LOW_TRAFFIC_ACCOUNTS}
49+
noOfReqForLowTrafficAccounts: ${RATE_LIMITER_LOW_TRAFFIC_VALUE_GET:-4500}
50+
noOfPostReqForLowTrafficAccounts: ${RATE_LIMITER_LOW_TRAFFIC_VALUE_POST:-1}
51+
intervalInMillisForLowTrafficAccounts: ${RATE_LIMITER_LOW_TRAFFIC_PER_MILLIS:-60000}
52+
53+
redis:
54+
endpoint: ${REDIS_URL:-localhost:6379}
55+
ssl: false
56+
commandTimeout: ${REDIS_COMMAND_TIMEOUT:-250ms}
57+
connectTimeout: ${REDIS_CONNECT_TIMEOUT:-500ms}
58+
59+
allowHttpForReturnUrl: ${ALLOW_HTTP_FOR_RETURN_URL:-false}
60+
61+
apiKeyHmacSecret: ${TOKEN_API_HMAC_SECRET}
62+
63+
# Caching authenticator.
64+
authenticationCachePolicy: expireAfterWrite=1m
65+
66+
ecsContainerMetadataUriV4: ${ECS_CONTAINER_METADATA_URI_V4:-}

jdk_11_maven/em/embedded/rest/pom.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<modules>
1616
<module>cwa-verification</module>
1717
<module>market</module>
18+
<module>pay-publicapi</module>
1819
</modules>
1920

20-
</project>
21+
</project>

0 commit comments

Comments
 (0)