@@ -443,4 +443,82 @@ private static void assertVarEncoding(String expected, String toEncode) {
443443 String encoded = context .getSecretSourceResolver ().encode (toEncode );
444444 assertThat (encoded , equalTo (expected ));
445445 }
446+
447+ @ Test
448+ public void trimLookup_removesTrailingWhitespace () {
449+ assertThat (SecretSourceResolver .TrimLookup .INSTANCE .lookup ("value\n " ), equalTo ("value" ));
450+ assertThat (SecretSourceResolver .TrimLookup .INSTANCE .lookup ("value\r \n " ), equalTo ("value" ));
451+ assertThat (SecretSourceResolver .TrimLookup .INSTANCE .lookup (" value \n " ), equalTo (" value" ));
452+ }
453+
454+ @ Test
455+ public void resolve_trimRemovesTrailingNewlines () {
456+ environment .set ("FOO" , "my_secret_pass\n " );
457+ assertThat (resolve ("${trim:${FOO}}" ), equalTo ("my_secret_pass" ));
458+
459+ environment .set ("BAR" , "my_secret_pass\r \n " );
460+ assertThat (resolve ("${trim:${BAR}}" ), equalTo ("my_secret_pass" ));
461+
462+ environment .set ("BAZ" , "my_secret_pass\n \n \n " );
463+ assertThat (resolve ("${trim:${BAZ}}" ), equalTo ("my_secret_pass" ));
464+ }
465+
466+ @ Test
467+ public void resolve_trimNoNewline_noChange () {
468+ environment .set ("FOO" , "my_secret_pass" );
469+ assertThat (resolve ("${trim:${FOO}}" ), equalTo ("my_secret_pass" ));
470+ }
471+
472+ @ Test
473+ public void resolve_trimRemovesTrailingSpacesButPreservesLeading () {
474+ environment .set ("FOO" , " my_secret_pass \n " );
475+ assertThat (resolve ("${trim:${FOO}}" ), equalTo (" my_secret_pass" ));
476+
477+ environment .set ("BAR" , "\t my_secret_pass\t \r \n " );
478+ assertThat (resolve ("${trim:${BAR}}" ), equalTo ("\t my_secret_pass" ));
479+ }
480+
481+ @ Test
482+ public void resolve_trimNestedReadFile () throws Exception {
483+ Path tempSecretFile = Files .createTempFile ("casc-secret" , ".txt" );
484+ tempSecretFile .toFile ().deleteOnExit ();
485+
486+ Files .writeString (tempSecretFile , "super_secret_ssh_key\n " );
487+ String inputPath = tempSecretFile .toAbsolutePath ().toString ();
488+
489+ String rawOutput = resolve ("${readFile:" + inputPath + "}" );
490+ assertTrue ("Raw output should contain the problematic trailing newline" , rawOutput .endsWith ("\n " ));
491+ assertThat (rawOutput , equalTo ("super_secret_ssh_key\n " ));
492+
493+ String trimmedOutput = resolve ("${trim:${readFile:" + inputPath + "}}" );
494+ assertThat (trimmedOutput , equalTo ("super_secret_ssh_key" ));
495+ }
496+
497+ @ Test
498+ public void resolve_readFilePreservesTrailingNewline () throws Exception {
499+ Path tempFile = Files .createTempFile ("casc-secret-baseline" , ".txt" );
500+ tempFile .toFile ().deleteOnExit ();
501+
502+ Files .writeString (tempFile , "secret\n " );
503+
504+ String output = resolve ("${readFile:" + tempFile .toAbsolutePath () + "}" );
505+ assertThat (output , equalTo ("secret\n " ));
506+ }
507+
508+ @ Test
509+ public void resolve_trimEmptyString () {
510+ assertThat (resolve ("${trim:}" ), equalTo ("" ));
511+ }
512+
513+ @ Test
514+ public void resolve_trimOnlyNewlines () {
515+ environment .set ("FOO" , "\n \n " );
516+ assertThat (resolve ("${trim:${FOO}}" ), equalTo ("" ));
517+ }
518+
519+ @ Test
520+ public void resolve_trimWithSpacesOnly_becomesEmpty () {
521+ environment .set ("FOO" , " " );
522+ assertThat (resolve ("${trim:${FOO}}" ), equalTo ("" ));
523+ }
446524}
0 commit comments