Skip to content

Commit 323f35e

Browse files
Copilottrask
andcommitted
Add MessageAssert class and update Logback tests to use new assertion framework
Co-authored-by: trask <[email protected]>
1 parent a4a972a commit 323f35e

File tree

5 files changed

+200
-103
lines changed

5 files changed

+200
-103
lines changed

smoke-tests/apps/Logback/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LogbackDisabledTest.java

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,29 @@ class LogbackDisabledTest {
2222

2323
@Test
2424
@TargetUri("/test")
25-
void testDisabled() throws Exception {
26-
List<Envelope> rdList = testing.mockedIngestion.waitForItems("RequestData", 1);
27-
28-
Envelope rdEnvelope = rdList.get(0);
29-
RequestData rd = (RequestData) ((Data<?>) rdEnvelope.getData()).getBaseData();
30-
assertThat(rd.getName()).isEqualTo("GET /Logback/test");
31-
32-
assertThat(testing.mockedIngestion.getCountForType("MessageData")).isZero();
25+
void testDisabled() {
26+
testing.waitAndAssertTrace(
27+
trace ->
28+
trace
29+
.hasRequestSatisying(
30+
request -> request.hasName("GET /Logback/test").hasSuccess(true))
31+
.hasMessageCount(0));
3332
}
3433

3534
@Test
3635
@TargetUri("/testWithSpanException")
37-
void testWithSpanException() throws Exception {
36+
void testWithSpanException() {
37+
testing.waitAndAssertTrace(
38+
trace ->
39+
trace
40+
.hasRequestSatisying(
41+
request ->
42+
request.hasName("GET /Logback/testWithSpanException").hasSuccess(true))
43+
.hasMessageCount(0));
44+
45+
// Check that span exception is still captured
3846
List<Envelope> rdList = testing.mockedIngestion.waitForItems("RequestData", 1);
39-
4047
Envelope rdEnvelope = rdList.get(0);
41-
RequestData rd = (RequestData) ((Data<?>) rdEnvelope.getData()).getBaseData();
42-
assertThat(rd.getName()).isEqualTo("GET /Logback/testWithSpanException");
43-
44-
assertThat(testing.mockedIngestion.getCountForType("MessageData")).isZero();
45-
46-
// check that span exception is still captured
4748
String operationId = rdEnvelope.getTags().get("ai.operation.id");
4849
List<Envelope> edList =
4950
testing.mockedIngestion.waitForItemsInOperation("ExceptionData", 1, operationId);
@@ -55,6 +56,7 @@ void testWithSpanException() throws Exception {
5556
assertThat(ed.getExceptions().get(0).getMessage()).isEqualTo("Test Exception");
5657
assertThat(ed.getProperties()).isEmpty(); // this is not a logger-based exception
5758

59+
RequestData rd = (RequestData) ((Data<?>) rdEnvelope.getData()).getBaseData();
5860
SmokeTestExtension.assertParentChild(
5961
rd, rdEnvelope, edEnvelope, "GET /Logback/testWithSpanException");
6062
}

smoke-tests/apps/Logback/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LogbackLevelOffTest.java

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,29 @@ class LogbackLevelOffTest {
2222

2323
@Test
2424
@TargetUri("/test")
25-
void testDisabled() throws Exception {
26-
List<Envelope> rdList = testing.mockedIngestion.waitForItems("RequestData", 1);
27-
28-
Envelope rdEnvelope = rdList.get(0);
29-
RequestData rd = (RequestData) ((Data<?>) rdEnvelope.getData()).getBaseData();
30-
assertThat(rd.getName()).isEqualTo("GET /Logback/test");
31-
32-
assertThat(testing.mockedIngestion.getCountForType("MessageData")).isZero();
25+
void testDisabled() {
26+
testing.waitAndAssertTrace(
27+
trace ->
28+
trace
29+
.hasRequestSatisying(
30+
request -> request.hasName("GET /Logback/test").hasSuccess(true))
31+
.hasMessageCount(0));
3332
}
3433

3534
@Test
3635
@TargetUri("/testWithSpanException")
37-
void testWithSpanException() throws Exception {
36+
void testWithSpanException() {
37+
testing.waitAndAssertTrace(
38+
trace ->
39+
trace
40+
.hasRequestSatisying(
41+
request ->
42+
request.hasName("GET /Logback/testWithSpanException").hasSuccess(true))
43+
.hasMessageCount(0));
44+
45+
// Check that span exception is still captured
3846
List<Envelope> rdList = testing.mockedIngestion.waitForItems("RequestData", 1);
39-
4047
Envelope rdEnvelope = rdList.get(0);
41-
RequestData rd = (RequestData) ((Data<?>) rdEnvelope.getData()).getBaseData();
42-
assertThat(rd.getName()).isEqualTo("GET /Logback/testWithSpanException");
43-
44-
assertThat(testing.mockedIngestion.getCountForType("MessageData")).isZero();
45-
46-
// check that span exception is still captured
4748
String operationId = rdEnvelope.getTags().get("ai.operation.id");
4849
List<Envelope> edList =
4950
testing.mockedIngestion.waitForItemsInOperation("ExceptionData", 1, operationId);
@@ -55,6 +56,7 @@ void testWithSpanException() throws Exception {
5556
assertThat(ed.getExceptions().get(0).getMessage()).isEqualTo("Test Exception");
5657
assertThat(ed.getProperties()).isEmpty(); // this is not a logger-based exception
5758

59+
RequestData rd = (RequestData) ((Data<?>) rdEnvelope.getData()).getBaseData();
5860
SmokeTestExtension.assertParentChild(
5961
rd, rdEnvelope, edEnvelope, "GET /Logback/testWithSpanException");
6062
}

smoke-tests/apps/Logback/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LogbackTest.java

Lines changed: 72 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@
2020
import com.microsoft.applicationinsights.smoketest.schemav2.Data;
2121
import com.microsoft.applicationinsights.smoketest.schemav2.Envelope;
2222
import com.microsoft.applicationinsights.smoketest.schemav2.ExceptionData;
23-
import com.microsoft.applicationinsights.smoketest.schemav2.MessageData;
2423
import com.microsoft.applicationinsights.smoketest.schemav2.RequestData;
2524
import com.microsoft.applicationinsights.smoketest.schemav2.SeverityLevel;
26-
import java.util.Comparator;
2725
import java.util.List;
2826
import org.junit.jupiter.api.Test;
2927
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -42,89 +40,92 @@ boolean isWildflyServer() {
4240

4341
@Test
4442
@TargetUri("/test")
45-
void test() throws Exception {
46-
List<Envelope> rdList = testing.mockedIngestion.waitForItems("RequestData", 1);
47-
48-
Envelope rdEnvelope = rdList.get(0);
49-
String operationId = rdEnvelope.getTags().get("ai.operation.id");
50-
List<Envelope> mdList = testing.mockedIngestion.waitForMessageItemsInRequest(3, operationId);
51-
52-
Envelope mdEnvelope1 = mdList.get(0);
53-
Envelope mdEnvelope2 = mdList.get(1);
54-
55-
assertThat(rdEnvelope.getSampleRate()).isNull();
56-
assertThat(mdEnvelope1.getSampleRate()).isNull();
57-
assertThat(mdEnvelope2.getSampleRate()).isNull();
58-
59-
RequestData rd = (RequestData) ((Data<?>) rdEnvelope.getData()).getBaseData();
60-
61-
List<MessageData> logs = testing.mockedIngestion.getMessageDataInRequest(3);
62-
logs.sort(Comparator.comparing(MessageData::getSeverityLevel));
63-
64-
MessageData md1 = logs.get(0);
65-
MessageData md2 = logs.get(1);
66-
MessageData md3 = logs.get(2);
67-
68-
assertThat(md1.getMessage()).isEqualTo("This is logback warn.");
69-
assertThat(md1.getSeverityLevel()).isEqualTo(SeverityLevel.WARNING);
70-
assertThat(md1.getProperties())
71-
.containsEntry("SourceType", "Logger")
72-
.containsEntry("LoggerName", "smoketestapp")
73-
.containsKey("ThreadName")
74-
.containsEntry("MDC key", "MDC value");
75-
43+
void test() {
44+
testing.waitAndAssertTrace(
45+
trace ->
46+
trace
47+
.hasRequestSatisying(
48+
request ->
49+
request
50+
.hasName("GET /Logback/test")
51+
.hasSuccess(true)
52+
.hasProperty("_MS.ProcessedByMetricExtractors", "True")
53+
.hasNoParent())
54+
.hasMessageCount(3)
55+
.hasMessageSatisying(
56+
message ->
57+
message
58+
.hasMessage("This is logback warn.")
59+
.hasSeverityLevel(SeverityLevel.WARNING)
60+
.hasProperty("SourceType", "Logger")
61+
.hasProperty("LoggerName", "smoketestapp")
62+
.hasPropertyKey("ThreadName")
63+
.hasProperty("MDC key", "MDC value")
64+
.hasPropertiesSize(isWildflyServer() ? 4 : 8))
65+
.hasMessageSatisying(
66+
message ->
67+
message
68+
.hasMessage("This is logback error.")
69+
.hasSeverityLevel(SeverityLevel.ERROR)
70+
.hasProperty("SourceType", "Logger")
71+
.hasProperty("LoggerName", "smoketestapp")
72+
.hasPropertyKey("ThreadName")
73+
.hasPropertiesSize(isWildflyServer() ? 3 : 7)));
74+
75+
// Additional assertions for non-Wildfly servers
7676
if (!isWildflyServer()) {
77-
assertThat(md1.getProperties())
78-
.containsEntry("FileName", "LogbackServlet.java")
79-
.containsEntry(
80-
"ClassName", "com.microsoft.applicationinsights.smoketestapp.LogbackServlet")
81-
.containsEntry("MethodName", "doGet")
82-
.containsEntry("LineNumber", "26")
83-
.hasSize(8);
84-
} else {
85-
assertThat(md1.getProperties()).hasSize(4);
77+
testing.waitAndAssertTrace(
78+
trace ->
79+
trace
80+
.hasMessageSatisying(
81+
message ->
82+
message
83+
.hasMessage("This is logback warn.")
84+
.hasProperty("FileName", "LogbackServlet.java")
85+
.hasProperty(
86+
"ClassName",
87+
"com.microsoft.applicationinsights.smoketestapp.LogbackServlet")
88+
.hasProperty("MethodName", "doGet")
89+
.hasProperty("LineNumber", "26"))
90+
.hasMessageSatisying(
91+
message ->
92+
message
93+
.hasMessage("This is logback error.")
94+
.hasProperty("FileName", "LogbackServlet.java")
95+
.hasProperty(
96+
"ClassName",
97+
"com.microsoft.applicationinsights.smoketestapp.LogbackServlet")
98+
.hasProperty("MethodName", "doGet")
99+
.hasProperty("LineNumber", "28"))
100+
.hasMessageSatisying(
101+
message -> message.hasProperty("Marker", "aMarker")));
86102
}
87-
88-
assertThat(md2.getMessage()).isEqualTo("This is logback error.");
89-
assertThat(md2.getSeverityLevel()).isEqualTo(SeverityLevel.ERROR);
90-
assertThat(md2.getProperties())
91-
.containsEntry("SourceType", "Logger")
92-
.containsEntry("LoggerName", "smoketestapp")
93-
.containsKey("ThreadName");
94-
95-
if (!isWildflyServer()) {
96-
assertThat(md2.getProperties())
97-
.containsEntry("FileName", "LogbackServlet.java")
98-
.containsEntry(
99-
"ClassName", "com.microsoft.applicationinsights.smoketestapp.LogbackServlet")
100-
.containsEntry("MethodName", "doGet")
101-
.containsEntry("LineNumber", "28")
102-
.hasSize(7);
103-
} else {
104-
assertThat(md2.getProperties()).hasSize(3);
105-
}
106-
107-
if (!isWildflyServer()) {
108-
assertThat(md3.getProperties()).containsEntry("Marker", "aMarker");
109-
}
110-
111-
SmokeTestExtension.assertParentChild(rd, rdEnvelope, mdEnvelope1, "GET /Logback/test");
112-
SmokeTestExtension.assertParentChild(rd, rdEnvelope, mdEnvelope2, "GET /Logback/test");
113103
}
114104

115105
@Test
116106
@TargetUri("/testWithException")
117-
void testWithException() throws Exception {
107+
void testWithException() {
108+
testing.waitAndAssertTrace(
109+
trace ->
110+
trace
111+
.hasRequestSatisying(
112+
request ->
113+
request
114+
.hasName("GET /Logback/testWithException")
115+
.hasSuccess(true)
116+
.hasProperty("_MS.ProcessedByMetricExtractors", "True")
117+
.hasNoParent())
118+
.hasMessageCount(0)); // No MessageData, only ExceptionData
119+
120+
// Check for exception data separately as it's not part of the trace assertion framework yet
118121
List<Envelope> rdList = testing.mockedIngestion.waitForItems("RequestData", 1);
119-
120122
Envelope rdEnvelope = rdList.get(0);
121123
String operationId = rdEnvelope.getTags().get("ai.operation.id");
122124
List<Envelope> edList =
123125
testing.mockedIngestion.waitForItemsInOperation("ExceptionData", 1, operationId);
124126
assertThat(testing.mockedIngestion.getCountForType("EventData")).isZero();
125127

126128
Envelope edEnvelope = edList.get(0);
127-
128129
assertThat(rdEnvelope.getSampleRate()).isNull();
129130
assertThat(edEnvelope.getSampleRate()).isNull();
130131

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
package com.microsoft.applicationinsights.smoketest;
5+
6+
import static org.assertj.core.api.Assertions.assertThat;
7+
8+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
9+
import com.microsoft.applicationinsights.smoketest.schemav2.Data;
10+
import com.microsoft.applicationinsights.smoketest.schemav2.Envelope;
11+
import com.microsoft.applicationinsights.smoketest.schemav2.MessageData;
12+
import com.microsoft.applicationinsights.smoketest.schemav2.SeverityLevel;
13+
import org.assertj.core.api.AbstractAssert;
14+
15+
public class MessageAssert extends AbstractAssert<MessageAssert, Envelope> {
16+
17+
public MessageAssert(Envelope envelope) {
18+
super(envelope, MessageAssert.class);
19+
}
20+
21+
@CanIgnoreReturnValue
22+
public MessageAssert hasMessage(String message) {
23+
isNotNull();
24+
assertThat(getMessageData().getMessage()).isEqualTo(message);
25+
return this;
26+
}
27+
28+
@CanIgnoreReturnValue
29+
public MessageAssert hasSeverityLevel(SeverityLevel severityLevel) {
30+
isNotNull();
31+
assertThat(getMessageData().getSeverityLevel()).isEqualTo(severityLevel);
32+
return this;
33+
}
34+
35+
@CanIgnoreReturnValue
36+
public MessageAssert hasProperty(String key, String value) {
37+
isNotNull();
38+
assertThat(getMessageData().getProperties()).containsEntry(key, value);
39+
return this;
40+
}
41+
42+
@CanIgnoreReturnValue
43+
public MessageAssert hasPropertyKey(String key) {
44+
isNotNull();
45+
assertThat(getMessageData().getProperties()).containsKey(key);
46+
return this;
47+
}
48+
49+
@CanIgnoreReturnValue
50+
public MessageAssert hasPropertiesSize(int size) {
51+
isNotNull();
52+
assertThat(getMessageData().getProperties()).hasSize(size);
53+
return this;
54+
}
55+
56+
@CanIgnoreReturnValue
57+
public MessageAssert hasTag(String key, String value) {
58+
isNotNull();
59+
assertThat(actual.getTags()).containsEntry(key, value);
60+
return this;
61+
}
62+
63+
@CanIgnoreReturnValue
64+
public MessageAssert hasNoParent() {
65+
isNotNull();
66+
assertThat(getMessageData().getProperties().get("ai.operation.parentId")).isNull();
67+
return this;
68+
}
69+
70+
@CanIgnoreReturnValue
71+
public MessageAssert hasParent(String parentId) {
72+
isNotNull();
73+
assertThat(getMessageData().getProperties().get("ai.operation.parentId")).isEqualTo(parentId);
74+
return this;
75+
}
76+
77+
private MessageData getMessageData() {
78+
Data<?> data = (Data<?>) actual.getData();
79+
return (MessageData) data.getBaseData();
80+
}
81+
}

smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/TraceAssert.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.google.errorprone.annotations.CanIgnoreReturnValue;
1111
import com.microsoft.applicationinsights.smoketest.schemav2.Data;
1212
import com.microsoft.applicationinsights.smoketest.schemav2.Envelope;
13+
import com.microsoft.applicationinsights.smoketest.schemav2.MessageData;
1314
import com.microsoft.applicationinsights.smoketest.schemav2.RemoteDependencyData;
1415
import com.microsoft.applicationinsights.smoketest.schemav2.RequestData;
1516
import java.time.Instant;
@@ -63,6 +64,12 @@ public TraceAssert hasMessageCount(int count) {
6364
return this;
6465
}
6566

67+
@CanIgnoreReturnValue
68+
public TraceAssert hasMessageSatisying(Consumer<MessageAssert> assertion) {
69+
assertThat(messages).anySatisfy(envelope -> assertion.accept(new MessageAssert(envelope)));
70+
return this;
71+
}
72+
6673
public String getRequestId(int index) {
6774
Data<?> data = (Data<?>) requests.get(index).getData();
6875
return ((RequestData) data.getBaseData()).getId();
@@ -72,4 +79,8 @@ public String getDependencyId(int index) {
7279
Data<?> data = (Data<?>) dependencies.get(index).getData();
7380
return ((RemoteDependencyData) data.getBaseData()).getId();
7481
}
82+
83+
public MessageAssert getMessageAt(int index) {
84+
return new MessageAssert(messages.get(index));
85+
}
7586
}

0 commit comments

Comments
 (0)