@@ -340,6 +340,18 @@ class HandshakePattern {
340340 }
341341
342342 record MessagePattern (NoiseHandshake .Role sender , Token [] tokens ) {
343+ @ Override
344+ public String toString () {
345+ final String prefix = switch (sender ()) {
346+ case INITIATOR -> " -> " ;
347+ case RESPONDER -> " <- " ;
348+ };
349+
350+ return prefix + Arrays .stream (tokens ())
351+ .map (token -> token .name ().toLowerCase ())
352+ .collect (Collectors .joining (", " ));
353+ }
354+
343355 @ Override
344356 public boolean equals (final Object o ) {
345357 if (this == o ) return true ;
@@ -691,6 +703,31 @@ boolean requiresRemoteStaticPublicKey(final NoiseHandshake.Role role) {
691703 .anyMatch (token -> token == Token .S );
692704 }
693705
706+ @ Override
707+ public String toString () {
708+ final StringBuilder stringBuilder = new StringBuilder (getName () + ":\n " );
709+
710+ // We know we can't end on a pre-message pattern line, so we can unconditionally append newlines after each
711+ // pre-handshake message
712+ Arrays .stream (getPreMessagePatterns ())
713+ .forEach (preMessagePattern -> {
714+ stringBuilder .append (preMessagePattern );
715+ stringBuilder .append ('\n' );
716+ });
717+
718+ if (getPreMessagePatterns ().length > 0 ) {
719+ stringBuilder .append (" " );
720+ stringBuilder .append (PRE_MESSAGE_SEPARATOR );
721+ stringBuilder .append ('\n' );
722+ }
723+
724+ stringBuilder .append (Arrays .stream (getHandshakeMessagePatterns ())
725+ .map (MessagePattern ::toString )
726+ .collect (Collectors .joining ("\n " )));
727+
728+ return stringBuilder .toString ();
729+ }
730+
694731 /**
695732 * Tests whether this handshake pattern is equal to another object. This handshake pattern is equal to the given
696733 * object if the given object is also a handshake pattern and has the same name and message patterns as this handshake
0 commit comments