@@ -217,8 +217,8 @@ private static List<FailedTestResultMessage> ReadFailedTestMessagesPayload(Strea
217217 int length = ReadInt ( stream ) ;
218218 for ( int i = 0 ; i < length ; i ++ )
219219 {
220- string ? uid = null , displayName = null , reason = null , sessionUid = null ,
221- errorMessage = null , errorStackTrace = null , standardOutput = null , errorOutput = null ;
220+ string ? uid = null , displayName = null , reason = null , sessionUid = null , standardOutput = null , errorOutput = null ;
221+ List < ExceptionMessage > exceptionMessages = [ ] ;
222222 byte ? state = null ;
223223 long ? duration = null ;
224224
@@ -251,13 +251,44 @@ private static List<FailedTestResultMessage> ReadFailedTestMessagesPayload(Strea
251251 reason = ReadStringValue ( stream , fieldSize ) ;
252252 break ;
253253
254- case FailedTestResultMessageFieldsId . ErrorMessage :
255- errorMessage = ReadStringValue ( stream , fieldSize ) ;
256- break ;
254+ case FailedTestResultMessageFieldsId . ExceptionMessageList :
255+ {
256+ int length2 = ReadInt ( stream ) ;
257+ for ( int k = 0 ; k < length2 ; k ++ )
258+ {
257259
258- case FailedTestResultMessageFieldsId . ErrorStackTrace :
259- errorStackTrace = ReadStringValue ( stream , fieldSize ) ;
260- break ;
260+ int fieldCount2 = ReadShort ( stream ) ;
261+
262+ string ? errorMessage = null ;
263+ string ? errorType = null ;
264+ string ? stackTrace = null ;
265+
266+ for ( int l = 0 ; l < fieldCount2 ; l ++ )
267+ {
268+ int fieldId2 = ReadShort ( stream ) ;
269+ int fieldSize2 = ReadInt ( stream ) ;
270+
271+ switch ( fieldId2 )
272+ {
273+ case ExceptionMessageFieldsId . ErrorMessage :
274+ errorMessage = ReadStringValue ( stream , fieldSize2 ) ;
275+ break ;
276+
277+ case ExceptionMessageFieldsId . ErrorType :
278+ errorType = ReadStringValue ( stream , fieldSize2 ) ;
279+ break ;
280+
281+ case ExceptionMessageFieldsId . StackTrace :
282+ stackTrace = ReadStringValue ( stream , fieldSize2 ) ;
283+ break ;
284+ }
285+ }
286+
287+ exceptionMessages . Add ( new ExceptionMessage ( errorMessage , errorType , stackTrace ) ) ;
288+ }
289+
290+ break ;
291+ }
261292
262293 case FailedTestResultMessageFieldsId . StandardOutput :
263294 standardOutput = ReadStringValue ( stream , fieldSize ) ;
@@ -277,7 +308,7 @@ private static List<FailedTestResultMessage> ReadFailedTestMessagesPayload(Strea
277308 }
278309 }
279310
280- failedTestResultMessages . Add ( new FailedTestResultMessage ( uid , displayName , state , duration , reason , errorMessage , errorStackTrace , standardOutput , errorOutput , sessionUid ) ) ;
311+ failedTestResultMessages . Add ( new FailedTestResultMessage ( uid , displayName , state , duration , reason , exceptionMessages . ToArray ( ) , standardOutput , errorOutput , sessionUid ) ) ;
281312 }
282313
283314 return failedTestResultMessages ;
@@ -354,8 +385,7 @@ private static void WriteFailedTestMessagesPayload(Stream stream, FailedTestResu
354385 WriteField ( stream , FailedTestResultMessageFieldsId . State , failedTestResultMessage . State ) ;
355386 WriteField ( stream , FailedTestResultMessageFieldsId . Duration , failedTestResultMessage . Duration ) ;
356387 WriteField ( stream , FailedTestResultMessageFieldsId . Reason , failedTestResultMessage . Reason ) ;
357- WriteField ( stream , FailedTestResultMessageFieldsId . ErrorMessage , failedTestResultMessage . ErrorMessage ) ;
358- WriteField ( stream , FailedTestResultMessageFieldsId . ErrorStackTrace , failedTestResultMessage . ErrorStackTrace ) ;
388+ WriteExceptionMessagesPayload ( stream , failedTestResultMessage . Exceptions ) ;
359389 WriteField ( stream , FailedTestResultMessageFieldsId . StandardOutput , failedTestResultMessage . StandardOutput ) ;
360390 WriteField ( stream , FailedTestResultMessageFieldsId . ErrorOutput , failedTestResultMessage . ErrorOutput ) ;
361391 WriteField ( stream , FailedTestResultMessageFieldsId . SessionUid , failedTestResultMessage . SessionUid ) ;
@@ -366,6 +396,35 @@ private static void WriteFailedTestMessagesPayload(Stream stream, FailedTestResu
366396 WriteAtPosition ( stream , ( int ) ( stream . Position - before ) , before - sizeof ( int ) ) ;
367397 }
368398
399+ private static void WriteExceptionMessagesPayload ( Stream stream , ExceptionMessage [ ] ? exceptionMessages )
400+ {
401+ if ( exceptionMessages is null || exceptionMessages . Length == 0 )
402+ {
403+ return ;
404+ }
405+
406+ WriteShort ( stream , FailedTestResultMessageFieldsId . ExceptionMessageList ) ;
407+
408+ // We will reserve an int (4 bytes)
409+ // so that we fill the size later, once we write the payload
410+ WriteInt ( stream , 0 ) ;
411+
412+ long before = stream . Position ;
413+ WriteInt ( stream , exceptionMessages . Length ) ;
414+ foreach ( ExceptionMessage exceptionMessage in exceptionMessages )
415+ {
416+ WriteShort ( stream , GetFieldCount ( exceptionMessage ) ) ;
417+
418+ WriteField ( stream , ExceptionMessageFieldsId . ErrorMessage , exceptionMessage . ErrorMessage ) ;
419+ WriteField ( stream , ExceptionMessageFieldsId . ErrorType , exceptionMessage . ErrorType ) ;
420+ WriteField ( stream , ExceptionMessageFieldsId . StackTrace , exceptionMessage . StackTrace ) ;
421+ }
422+
423+ // NOTE: We are able to seek only if we are using a MemoryStream
424+ // thus, the seek operation is fast as we are only changing the value of a property
425+ WriteAtPosition ( stream , ( int ) ( stream . Position - before ) , before - sizeof ( int ) ) ;
426+ }
427+
369428 private static ushort GetFieldCount ( TestResultMessages testResultMessages ) =>
370429 ( ushort ) ( ( testResultMessages . ExecutionId is null ? 0 : 1 ) +
371430 ( IsNullOrEmpty ( testResultMessages . SuccessfulTestMessages ) ? 0 : 1 ) +
@@ -387,10 +446,14 @@ private static ushort GetFieldCount(FailedTestResultMessage failedTestResultMess
387446 ( failedTestResultMessage . State is null ? 0 : 1 ) +
388447 ( failedTestResultMessage . Duration is null ? 0 : 1 ) +
389448 ( failedTestResultMessage . Reason is null ? 0 : 1 ) +
390- ( failedTestResultMessage . ErrorMessage is null ? 0 : 1 ) +
391- ( failedTestResultMessage . ErrorStackTrace is null ? 0 : 1 ) +
449+ ( IsNullOrEmpty ( failedTestResultMessage . Exceptions ) ? 0 : 1 ) +
392450 ( failedTestResultMessage . StandardOutput is null ? 0 : 1 ) +
393451 ( failedTestResultMessage . ErrorOutput is null ? 0 : 1 ) +
394452 ( failedTestResultMessage . SessionUid is null ? 0 : 1 ) ) ;
453+
454+ private static ushort GetFieldCount ( ExceptionMessage exceptionMessage ) =>
455+ ( ushort ) ( ( exceptionMessage . ErrorMessage is null ? 0 : 1 ) +
456+ ( exceptionMessage . ErrorType is null ? 0 : 1 ) +
457+ ( exceptionMessage . StackTrace is null ? 0 : 1 ) ) ;
395458 }
396459}
0 commit comments