16
16
17
17
package com .mongodb .client .unified ;
18
18
19
+ import com .mongodb .Function ;
19
20
import com .mongodb .MongoCommandException ;
20
21
import com .mongodb .internal .ExceptionUtils .MongoCommandExceptionUtils ;
21
22
import com .mongodb .internal .logging .LogMessage ;
23
+ import com .mongodb .lang .Nullable ;
22
24
import org .bson .BsonArray ;
23
25
import org .bson .BsonBoolean ;
24
26
import org .bson .BsonDocument ;
@@ -44,19 +46,20 @@ final class LogMatcher {
44
46
this .context = context ;
45
47
}
46
48
47
- void assertLogMessageEquality (final String client , final BsonArray expectedMessages , final List <LogMessage > actualMessages ) {
49
+ void assertLogMessageEquality (final String client , final BsonArray expectedMessages , final List <LogMessage > actualMessages ,
50
+ final Iterable <Tweak > tweaks ) {
48
51
context .push (ContextElement .ofLogMessages (client , expectedMessages , actualMessages ));
49
52
50
53
assertEquals (context .getMessage ("Number of log messages must be the same" ), expectedMessages .size (), actualMessages .size ());
51
54
52
55
for (int i = 0 ; i < expectedMessages .size (); i ++) {
53
- BsonDocument expectedMessageAsDocument = expectedMessages .get (i ).asDocument ().clone ();
54
- // `LogMessage.Entry.Name.OPERATION` is not supported, therefore we skip matching its value
55
- BsonValue expectedDataDocument = expectedMessageAsDocument .get ("data" );
56
- if (expectedDataDocument != null ) {
57
- expectedDataDocument .asDocument ().remove (LogMessage .Entry .Name .OPERATION .getValue ());
56
+ BsonDocument expectedMessage = expectedMessages .get (i ).asDocument ().clone ();
57
+ for (Tweak tweak : tweaks ) {
58
+ expectedMessage = tweak .apply (expectedMessage );
59
+ }
60
+ if (expectedMessage != null ) {
61
+ valueMatcher .assertValuesMatch (expectedMessage , asDocument (actualMessages .get (i )));
58
62
}
59
- valueMatcher .assertValuesMatch (expectedMessageAsDocument , asDocument (actualMessages .get (i )));
60
63
}
61
64
62
65
context .pop ();
@@ -108,4 +111,27 @@ private static BsonValue asBsonValue(final Object value) {
108
111
}
109
112
}
110
113
114
+ interface Tweak extends Function <BsonDocument , BsonDocument > {
115
+ /**
116
+ * @param expectedMessage May be {@code null}, in which case the method simply returns {@code null}.
117
+ * This method may mutate {@code expectedMessage}.
118
+ * @return {@code null} iff matching {@code expectedMessage} with the actual message must be skipped.
119
+ */
120
+ @ Nullable
121
+ BsonDocument apply (@ Nullable BsonDocument expectedMessage );
122
+
123
+ static Tweak skip (final LogMessage .Entry .Name name ) {
124
+ return expectedMessage -> {
125
+ if (expectedMessage == null ) {
126
+ return null ;
127
+ } else {
128
+ BsonDocument expectedData = expectedMessage .getDocument ("data" , null );
129
+ if (expectedData != null ) {
130
+ expectedData .remove (name .getValue ());
131
+ }
132
+ return expectedMessage ;
133
+ }
134
+ };
135
+ }
136
+ }
111
137
}
0 commit comments