Skip to content

Commit 077e781

Browse files
authored
Merge pull request #816 from BlueLort/omarnsr-create-database-tests
Adding contract-tests for successful 'CREATE DATABASE' for MySQL and Postgres
2 parents e16cb84 + b468d57 commit 077e781

File tree

5 files changed

+101
-43
lines changed

5 files changed

+101
-43
lines changed

appsignals-tests/contract-tests/src/test/java/software/amazon/opentelemetry/appsignals/test/jdbc/JdbcContractTestBase.java

Lines changed: 53 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import static io.opentelemetry.proto.trace.v1.Span.SpanKind.SPAN_KIND_CLIENT;
1919
import static org.assertj.core.api.Assertions.assertThat;
20-
import static org.junit.Assert.assertThat;
2120

2221
import io.opentelemetry.proto.common.v1.KeyValue;
2322
import io.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint;
@@ -31,9 +30,11 @@
3130

3231
public class JdbcContractTestBase extends ContractTestBase {
3332
protected static final String DB_NAME = "testdb";
34-
protected static final String DB_USER = "sa";
33+
protected static final String CREATE_DB_NAME = "testdb2";
34+
protected static final String DB_USER = "root";
3535
protected static final String DB_PASSWORD = "password";
36-
protected static final String DB_OPERATION = "SELECT";
36+
protected static final String DB_SELECT_OPERATION = "SELECT";
37+
protected static final String DB_CREATE_DATABASE_OPERATION = "CREATE DATABASE";
3738
protected static final String DB_RESOURCE_TYPE = "DB::Connection";
3839

3940
@Override
@@ -130,20 +131,29 @@ protected void assertSemanticConventionsSpanAttributes(
130131
.satisfiesOnlyOnce(
131132
rss -> {
132133
assertThat(rss.getSpan().getKind()).isEqualTo(SPAN_KIND_CLIENT);
133-
assertThat(rss.getSpan().getName())
134-
.isEqualTo(String.format("%s %s.%s", dbOperation, dbName, dbSqlTable));
135134
assertThat(rss.getSpan().getStatus().getCode().toString()).isEqualTo(otelStatusCode);
135+
assertSemanticConventionForOperation(rss, dbOperation, dbName, dbSqlTable);
136136
var attributesList = rss.getSpan().getAttributesList();
137137
assertSemanticConventionsAttributes(
138-
attributesList, dbSqlTable, dbSystem, dbOperation, dbUser, dbName, jdbcUrl);
138+
attributesList, dbSystem, dbUser, dbName, jdbcUrl);
139+
assertSemanticConventionsAttributesForOperation(
140+
attributesList, dbOperation, dbSqlTable);
139141
});
140142
}
141143

144+
private void assertSemanticConventionForOperation(
145+
ResourceScopeSpan rss, String dbOperation, String dbName, String dbSqlTable) {
146+
if (dbOperation.equals(DB_CREATE_DATABASE_OPERATION)) {
147+
assertThat(rss.getSpan().getName()).isEqualTo(String.format("%s", dbName));
148+
} else if (dbOperation.equals(DB_SELECT_OPERATION)) {
149+
assertThat(rss.getSpan().getName())
150+
.isEqualTo(String.format("%s %s.%s", dbOperation, dbName, dbSqlTable));
151+
}
152+
}
153+
142154
protected void assertSemanticConventionsAttributes(
143155
List<KeyValue> attributesList,
144-
String dbSqlTable,
145156
String dbSystem,
146-
String dbOperation,
147157
String dbUser,
148158
String dbName,
149159
String jdbcUrl) {
@@ -167,35 +177,51 @@ protected void assertSemanticConventionsAttributes(
167177
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.DB_NAME);
168178
assertThat(attribute.getValue().getStringValue()).isEqualTo(dbName);
169179
})
170-
.satisfiesOnlyOnce(
171-
attribute -> {
172-
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.DB_SQL_TABLE);
173-
assertThat(attribute.getValue().getStringValue()).isEqualTo(dbSqlTable);
174-
})
175-
.satisfiesOnlyOnce(
176-
attribute -> {
177-
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.DB_STATEMENT);
178-
assertThat(attribute.getValue().getStringValue())
179-
.isEqualTo(
180-
String.format("%s count(*) from %s", dbOperation.toLowerCase(), dbSqlTable));
181-
})
182180
.satisfiesOnlyOnce(
183181
attribute -> {
184182
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.DB_USER);
185183
assertThat(attribute.getValue().getStringValue()).isEqualTo(dbUser);
186184
})
187-
.satisfiesOnlyOnce(
188-
attribute -> {
189-
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.DB_OPERATION);
190-
assertThat(attribute.getValue().getStringValue()).isEqualTo(dbOperation);
191-
})
192185
.satisfiesOnlyOnce(
193186
attribute -> {
194187
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.DB_SYSTEM);
195188
assertThat(attribute.getValue().getStringValue()).isEqualTo(dbSystem);
196189
});
197190
}
198191

192+
private void assertSemanticConventionsAttributesForOperation(
193+
List<KeyValue> attributesList, String dbOperation, String dbSqlTable) {
194+
if (dbOperation.equals(DB_CREATE_DATABASE_OPERATION)) {
195+
assertThat(attributesList)
196+
.satisfiesOnlyOnce(
197+
attribute -> {
198+
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.DB_STATEMENT);
199+
assertThat(attribute.getValue().getStringValue())
200+
.isEqualTo(String.format("%s %s", dbOperation.toLowerCase(), CREATE_DB_NAME));
201+
});
202+
} else if (dbOperation.equals(DB_SELECT_OPERATION)) {
203+
assertThat(attributesList)
204+
.satisfiesOnlyOnce(
205+
attribute -> {
206+
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.DB_SQL_TABLE);
207+
assertThat(attribute.getValue().getStringValue()).isEqualTo(dbSqlTable);
208+
})
209+
.satisfiesOnlyOnce(
210+
attribute -> {
211+
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.DB_STATEMENT);
212+
assertThat(attribute.getValue().getStringValue())
213+
.isEqualTo(
214+
String.format(
215+
"%s count(*) from %s", dbOperation.toLowerCase(), dbSqlTable));
216+
})
217+
.satisfiesOnlyOnce(
218+
attribute -> {
219+
assertThat(attribute.getKey()).isEqualTo(SemanticConventionsConstants.DB_OPERATION);
220+
assertThat(attribute.getValue().getStringValue()).isEqualTo(dbOperation);
221+
});
222+
}
223+
}
224+
199225
protected void assertMetricAttributes(
200226
List<ResourceScopeMetric> resourceScopeMetrics,
201227
String method,
@@ -292,7 +318,7 @@ protected void assertSuccess(
292318
String jdbcUrl,
293319
String type,
294320
String identifier) {
295-
var path = "success";
321+
var path = "success/" + dbOperation;
296322
var method = "GET";
297323
var otelStatusCode = "STATUS_CODE_UNSET";
298324
var dbSqlTable = "employee";
@@ -351,7 +377,7 @@ protected void assertFault(
351377
String jdbcUrl,
352378
String type,
353379
String identifier) {
354-
var path = "fault";
380+
var path = "fault/" + dbOperation;
355381
var method = "GET";
356382
var otelStatusCode = "STATUS_CODE_ERROR";
357383
var dbSqlTable = "userrr";

appsignals-tests/contract-tests/src/test/java/software/amazon/opentelemetry/appsignals/test/jdbc/JdbcH2Test.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,14 @@ public class JdbcH2Test extends JdbcContractTestBase {
3131
private static final String DB_PLATFORM = "org.hibernate.dialect.H2Dialect";
3232

3333
@Test
34-
public void testSuccess() {
35-
assertSuccess(DB_SYSTEM, DB_OPERATION, DB_USER, DB_NAME, DB_CONNECTION_STRING, null, null);
34+
public void testSuccessSelect() {
35+
assertSuccess(
36+
DB_SYSTEM, DB_SELECT_OPERATION, DB_USER, DB_NAME, DB_CONNECTION_STRING, null, null);
3637
}
3738

3839
@Test
39-
public void testFault() {
40-
assertFault(DB_SYSTEM, DB_OPERATION, DB_USER, DB_NAME, DB_CONNECTION_STRING, null, null);
40+
public void testFaultSelect() {
41+
assertFault(DB_SYSTEM, DB_SELECT_OPERATION, DB_USER, DB_NAME, DB_CONNECTION_STRING, null, null);
4142
}
4243

4344
@Override

appsignals-tests/contract-tests/src/test/java/software/amazon/opentelemetry/appsignals/test/jdbc/JdbcMySQLTest.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ public void afterEach() {
4949
}
5050

5151
@Test
52-
public void testSuccess() {
52+
public void testSuccessCreateDatabase() {
5353
assertSuccess(
5454
DB_SYSTEM,
55-
DB_OPERATION,
55+
DB_CREATE_DATABASE_OPERATION,
5656
DB_USER,
5757
DB_NAME,
5858
DB_CONNECTION_STRING,
@@ -61,10 +61,22 @@ public void testSuccess() {
6161
}
6262

6363
@Test
64-
public void testFault() {
64+
public void testSuccessSelect() {
65+
assertSuccess(
66+
DB_SYSTEM,
67+
DB_SELECT_OPERATION,
68+
DB_USER,
69+
DB_NAME,
70+
DB_CONNECTION_STRING,
71+
DB_RESOURCE_TYPE,
72+
MYSQL_IDENTIFIER);
73+
}
74+
75+
@Test
76+
public void testFaultSelect() {
6577
assertFault(
6678
DB_SYSTEM,
67-
DB_OPERATION,
79+
DB_SELECT_OPERATION,
6880
DB_USER,
6981
DB_NAME,
7082
DB_CONNECTION_STRING,

appsignals-tests/contract-tests/src/test/java/software/amazon/opentelemetry/appsignals/test/jdbc/JdbcPostgresTest.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ public void afterEach() {
4949
}
5050

5151
@Test
52-
public void testSuccess() {
52+
public void testSuccessCreateDatabase() {
5353
assertSuccess(
5454
DB_SYSTEM,
55-
DB_OPERATION,
55+
DB_CREATE_DATABASE_OPERATION,
5656
DB_USER,
5757
DB_NAME,
5858
DB_CONNECTION_STRING,
@@ -61,10 +61,22 @@ public void testSuccess() {
6161
}
6262

6363
@Test
64-
public void testFault() {
64+
public void testSuccessSelect() {
65+
assertSuccess(
66+
DB_SYSTEM,
67+
DB_SELECT_OPERATION,
68+
DB_USER,
69+
DB_NAME,
70+
DB_CONNECTION_STRING,
71+
DB_RESOURCE_TYPE,
72+
POSTGRES_IDENTIFIER);
73+
}
74+
75+
@Test
76+
public void testFaultSelect() {
6577
assertFault(
6678
DB_SYSTEM,
67-
DB_OPERATION,
79+
DB_SELECT_OPERATION,
6880
DB_USER,
6981
DB_NAME,
7082
DB_CONNECTION_STRING,

appsignals-tests/images/jdbc/src/main/java/software/amazon/opentelemetry/AppController.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,25 @@ public void prepareDB() {
4646
logger.info("Application Ready");
4747
}
4848

49-
@GetMapping("/success")
49+
@GetMapping("/success/CREATE DATABASE")
5050
@ResponseBody
51-
public ResponseEntity<String> success() {
51+
public ResponseEntity<String> successCreateDatabase() {
52+
jdbcTemplate.execute("create database testdb2");
53+
return ResponseEntity.ok().body("success");
54+
}
55+
56+
@GetMapping("/success/SELECT")
57+
@ResponseBody
58+
public ResponseEntity<String> successSelect() {
5259
int count = jdbcTemplate.queryForObject("select count(*) from employee", Integer.class);
5360
return (count == 1)
5461
? ResponseEntity.ok().body("success")
5562
: ResponseEntity.badRequest().body("failed");
5663
}
5764

58-
@GetMapping("/fault")
65+
@GetMapping("/fault/SELECT")
5966
@ResponseBody
60-
public ResponseEntity<String> failure() {
67+
public ResponseEntity<String> failureSelect() {
6168
int count = jdbcTemplate.queryForObject("select count(*) from userrr", Integer.class);
6269
return ResponseEntity.ok().body("success");
6370
}

0 commit comments

Comments
 (0)