Skip to content

Commit b4d0eeb

Browse files
test framework and tests (#376)
1 parent 997ea2f commit b4d0eeb

15 files changed

+721
-3
lines changed

grabdish/observability/createMonitorsAndExporters.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ cd db-metrics-exporter
1818
cd ../
1919
#echo
2020
#echo create deployments and services for db log exporters...
21-
cd db-log-exporter
22-
./deploy.sh
23-
cd ../
21+
#cd db-log-exporter
22+
#./deploy.sh
23+
#cd ../

tests/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Tests can be run with either `./test.sh` or `./testIncludingPolyglot.sh`
2+
The only assumption is that the core microservices have been deployed (eg by running grabdish/deploy.sh)

tests/build.gradle

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
plugins {
2+
id 'java'
3+
}
4+
5+
repositories {
6+
mavenCentral()
7+
}
8+
9+
dependencies {
10+
testImplementation('org.junit.jupiter:junit-jupiter:5.8.2')
11+
}
12+
13+
test {
14+
useJUnitPlatform()
15+
testLogging {
16+
showStandardStreams = true
17+
}
18+
}

tests/gradle.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
sourceCompatibility = 1.8
2+
targetCompatibility = 1.8

tests/pom.xml

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<groupId>oracle.modernappdev</groupId>
5+
<artifactId>running-unit-tests</artifactId>
6+
<version>0.1</version>
7+
<name>Running Unit Tests</name>
8+
<description>
9+
This example demonstrates how you can run unit tests which use JUnit 5.
10+
</description>
11+
12+
<properties>
13+
<jdk.version>1.8</jdk.version>
14+
<junit.jupiter.version>5.8.2</junit.jupiter.version>
15+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
16+
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
17+
</properties>
18+
19+
<dependencies>
20+
<dependency>
21+
<groupId>org.junit.jupiter</groupId>
22+
<artifactId>junit-jupiter</artifactId>
23+
<version>${junit.jupiter.version}</version>
24+
<scope>test</scope>
25+
</dependency>
26+
<dependency>
27+
<groupId>org.apache.httpcomponents</groupId>
28+
<artifactId>httpclient</artifactId>
29+
<version>4.5.13</version>
30+
</dependency>
31+
<dependency>
32+
<groupId>com.fasterxml.jackson.core</groupId>
33+
<artifactId>jackson-core</artifactId>
34+
<version>2.13.2</version>
35+
</dependency>
36+
<dependency>
37+
<groupId>javax.json.bind</groupId>
38+
<artifactId>javax.json.bind-api</artifactId>
39+
<version>1.0</version>
40+
</dependency>
41+
<dependency>
42+
<groupId>com.fasterxml.jackson.core</groupId>
43+
<artifactId>jackson-databind</artifactId>
44+
<version>2.13.2.2</version>
45+
</dependency>
46+
<dependency>
47+
<groupId>org.hamcrest</groupId>
48+
<artifactId>hamcrest-library</artifactId>
49+
<version>2.2</version>
50+
<scope>test</scope>
51+
</dependency>
52+
<dependency>
53+
<groupId>io.kubernetes</groupId>
54+
<artifactId>client-java</artifactId>
55+
<version>15.0.0</version>
56+
</dependency>
57+
</dependencies>
58+
<build>
59+
<finalName>running-unit-tests</finalName>
60+
<plugins>
61+
<plugin>
62+
<groupId>org.apache.maven.plugins</groupId>
63+
<artifactId>maven-compiler-plugin</artifactId>
64+
<version>3.8.0</version>
65+
<configuration>
66+
<source>${jdk.version}</source>
67+
<target>${jdk.version}</target>
68+
<encoding>${project.build.sourceEncoding}</encoding>
69+
</configuration>
70+
</plugin>
71+
<plugin>
72+
<groupId>org.apache.maven.plugins</groupId>
73+
<artifactId>maven-surefire-plugin</artifactId>
74+
<version>2.22.2</version>
75+
</plugin>
76+
</plugins>
77+
</build>
78+
</project>
79+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
** Copyright (c) 2022 Oracle and/or its affiliates.
3+
** Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
4+
*/
5+
package oracle.modernappdev;
6+
7+
public class Command {
8+
9+
public String serviceName; //order, inventory, or supplier
10+
public String commandName;
11+
public int orderId = -1;//only applies to placeorder and showorder, all others -1
12+
public String orderItem = "sushi";
13+
public String deliverTo = "deliver to test address";
14+
15+
public Command() {}
16+
17+
}
18+
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package oracle.modernappdev;
2+
3+
import org.apache.http.HttpResponse;
4+
import org.apache.http.HttpStatus;
5+
import org.apache.http.impl.client.CloseableHttpClient;
6+
import org.apache.http.util.EntityUtils;
7+
import org.junit.jupiter.api.Test;
8+
9+
import static org.hamcrest.MatcherAssert.assertThat;
10+
import static org.hamcrest.Matchers.containsString;
11+
import static org.hamcrest.Matchers.equalTo;
12+
13+
public class CrashAfterInventoryMessageReceivedTest extends TransactionalTests {
14+
15+
/**
16+
* Transactional lab of "simplify microservices"
17+
* Crash the order service after inventory status message is received
18+
* Order should be successful.
19+
* @throws Exception
20+
*/
21+
@Test
22+
void testCrashAfterInventoryMessageReceived() throws Exception {
23+
CloseableHttpClient httpClient = getCloseableHttpClientAndDeleteAllOrders();
24+
setInventoryToOne();
25+
HttpResponse httpResponse1 = setCrashType(crashAfterInventoryMessageReceived);
26+
//assert success of request
27+
assertThat(httpResponse1.getStatusLine().getStatusCode(), equalTo(HttpStatus.SC_OK));
28+
placeOrder(httpClient, false);
29+
//show the order (use clean/new http client)
30+
HttpResponse httpResponse = showorder(getHttpClient());
31+
//assert success of request
32+
assertThat(httpResponse.getStatusLine().getStatusCode(), equalTo(HttpStatus.SC_OK));
33+
//confirm successful order
34+
String jsonFromResponse = EntityUtils.toString(httpResponse.getEntity());
35+
System.out.println("testCrashAfterInventoryMessageReceived jsonFromResponse:" + jsonFromResponse);
36+
while (jsonFromResponse.contains("Connection refused") || jsonFromResponse.contains("pending") ) {
37+
Thread.sleep(1000 * 1);
38+
httpResponse = showorder(getHttpClient());
39+
jsonFromResponse = EntityUtils.toString(httpResponse.getEntity());
40+
System.out.println("testCrashAfterInventoryMessageReceived jsonFromResponse:" + jsonFromResponse);
41+
}
42+
assertThat(jsonFromResponse, containsString("beer"));
43+
assertInventoryCount(0);
44+
}
45+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package oracle.modernappdev;
2+
3+
import org.apache.http.HttpResponse;
4+
import org.apache.http.HttpStatus;
5+
import org.apache.http.impl.client.CloseableHttpClient;
6+
import org.apache.http.util.EntityUtils;
7+
import org.junit.jupiter.api.Test;
8+
9+
import static org.hamcrest.MatcherAssert.assertThat;
10+
import static org.hamcrest.Matchers.equalTo;
11+
12+
public class CrashAfterOrderInsertedBeforeMessageSentTest extends TransactionalTests {
13+
14+
/**
15+
* Transactional lab of "simplify microservices"
16+
* Crash the order service after order is inserted and before message is sent to inventory service
17+
* Order should rollback.
18+
* @throws Exception
19+
*/
20+
@Test
21+
void testCrashAfterOrderInsertedBeforeMessageSent() throws Exception {
22+
CloseableHttpClient httpClient = getCloseableHttpClientAndDeleteAllOrders();
23+
setInventoryToOne();
24+
//set the "crashAfterInsert" failure case
25+
HttpResponse httpResponse = setCrashType(crashAfterInsert);
26+
//assert success of request
27+
assertThat(httpResponse.getStatusLine().getStatusCode(), equalTo(HttpStatus.SC_OK));
28+
//place and order async, expecting hang due to order service crash
29+
placeOrder(httpClient, true);
30+
//sleep so that the next request is after order service restarts
31+
System.out.println("CrashAfterOrderInsertedBeforeMessageSentTest.testCrashAfterOrderInsertedBeforeMessageSent sleep for a minute");
32+
Thread.sleep(60 * 1000); // non-deterministic but if exceed also indicates and issue we should look into
33+
//show the order (use clean/new http client)
34+
httpResponse = showorder(getHttpClient());
35+
//assert success of request
36+
assertThat(httpResponse.getStatusLine().getStatusCode(), equalTo(HttpStatus.SC_OK));
37+
//confirm the order is null (doesnt exist) because it was rolledback
38+
String jsonFromResponse = EntityUtils.toString(httpResponse.getEntity());
39+
while (jsonFromResponse.contains("Connection refused")) {
40+
Thread.sleep(1000 * 1);
41+
httpResponse = showorder(getHttpClient());
42+
jsonFromResponse = EntityUtils.toString(httpResponse.getEntity());
43+
System.out.println("testCrashAfterOrderMessageReceived jsonFromResponse:" + jsonFromResponse);
44+
}
45+
System.out.println("CrashAfterOrderInsertedBeforeMessageSentTest.testCrashAfterOrderInsertedBeforeMessageSent jsonFromResponse:" + jsonFromResponse);
46+
assertThat(jsonFromResponse, equalTo("null")); // null means rolledback
47+
assertInventoryCount(1);
48+
}
49+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package oracle.modernappdev;
2+
3+
import org.apache.http.HttpResponse;
4+
import org.apache.http.HttpStatus;
5+
import org.apache.http.impl.client.CloseableHttpClient;
6+
import org.apache.http.util.EntityUtils;
7+
import org.junit.jupiter.api.Test;
8+
9+
import static org.hamcrest.MatcherAssert.assertThat;
10+
import static org.hamcrest.Matchers.containsString;
11+
import static org.hamcrest.Matchers.equalTo;
12+
13+
public class CrashAfterOrderMessageProcessedTest extends TransactionalTests {
14+
15+
/**
16+
* Transactional lab of "simplify microservices" workshop
17+
* Crash the inventory service after order message is processed
18+
* Order should be successful.
19+
* @throws Exception
20+
*/
21+
@Test
22+
void testCrashAfterOrderMessageProcessed() throws Exception {
23+
CloseableHttpClient httpClient = getCloseableHttpClientAndDeleteAllOrders();
24+
setInventoryToOne();
25+
HttpResponse httpResponse1 = setCrashType(crashAfterOrderMessageProcessed);
26+
//assert success of request
27+
assertThat(httpResponse1.getStatusLine().getStatusCode(), equalTo(HttpStatus.SC_OK));
28+
placeOrder(httpClient, false);
29+
//show the order (use clean/new http client)
30+
HttpResponse httpResponse = showorder(getHttpClient());
31+
//assert success of request
32+
assertThat(httpResponse.getStatusLine().getStatusCode(), equalTo(HttpStatus.SC_OK));
33+
//confirm successful order
34+
String jsonFromResponse = EntityUtils.toString(httpResponse.getEntity());
35+
System.out.println("testCrashAfterOrderMessageProcessed jsonFromResponse:" + jsonFromResponse);
36+
while (jsonFromResponse.contains("pending")) {
37+
Thread.sleep(1000 * 1);
38+
httpResponse = showorder(getHttpClient());
39+
jsonFromResponse = EntityUtils.toString(httpResponse.getEntity());
40+
System.out.println("testCrashAfterOrderMessageProcessed jsonFromResponse:" + jsonFromResponse);
41+
}
42+
assertThat(jsonFromResponse, containsString("beer"));
43+
assertInventoryCount(0);
44+
}
45+
46+
}
47+
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package oracle.modernappdev;
2+
3+
import org.apache.http.HttpResponse;
4+
import org.apache.http.HttpStatus;
5+
import org.apache.http.impl.client.CloseableHttpClient;
6+
import org.apache.http.util.EntityUtils;
7+
import org.junit.jupiter.api.Test;
8+
9+
import static org.hamcrest.MatcherAssert.assertThat;
10+
import static org.hamcrest.Matchers.containsString;
11+
import static org.hamcrest.Matchers.equalTo;
12+
13+
public class CrashAfterOrderMessageReceivedTest extends TransactionalTests {
14+
15+
/**
16+
* Transactional lab of "simplify microservices"
17+
* Crash the inventory service after order message is received
18+
* Order should be successful.
19+
* @throws Exception
20+
*/
21+
@Test
22+
void testCrashAfterOrderMessageReceived() throws Exception {
23+
CloseableHttpClient httpClient = getCloseableHttpClientAndDeleteAllOrders();
24+
setInventoryToOne();
25+
HttpResponse httpResponse1 = setCrashType(crashAfterOrderMessageReceived);
26+
//assert success of request
27+
assertThat(httpResponse1.getStatusLine().getStatusCode(), equalTo(HttpStatus.SC_OK));
28+
placeOrder(httpClient, false);
29+
//show the order (use clean/new http client)
30+
HttpResponse httpResponse = showorder(getHttpClient());
31+
//assert success of request
32+
assertThat(httpResponse.getStatusLine().getStatusCode(), equalTo(HttpStatus.SC_OK));
33+
//confirm successful order
34+
String jsonFromResponse = EntityUtils.toString(httpResponse.getEntity());
35+
System.out.println("testCrashAfterOrderMessageReceived jsonFromResponse:" + jsonFromResponse);
36+
while (jsonFromResponse.contains("pending")) {
37+
Thread.sleep(1000 * 1);
38+
httpResponse = showorder(getHttpClient());
39+
jsonFromResponse = EntityUtils.toString(httpResponse.getEntity());
40+
System.out.println("testCrashAfterOrderMessageReceived jsonFromResponse:" + jsonFromResponse);
41+
}
42+
assertThat(jsonFromResponse, containsString("beer"));
43+
assertInventoryCount(0);
44+
}
45+
}

0 commit comments

Comments
 (0)