@@ -20,10 +20,10 @@ func TestCreateEvidence_Context(t *testing.T) {
2020 assert .NoError (t , os .Setenv (coreUtils .SigningKey , "PGP" ), "Failed to set env: " + coreUtils .SigningKey )
2121 assert .NoError (t , os .Setenv (coreUtils .BuildName , buildName ), "Failed to set env: JFROG_CLI_BUILD_NAME" )
2222 defer func () {
23- assert .NoError (t , os .Unsetenv (coreUtils .SigningKey ))
23+ assert .NoError (t , os .Unsetenv (coreUtils .SigningKey ), "Failed to unset env: " + coreUtils . SigningKey )
2424 }()
2525 defer func () {
26- assert .NoError (t , os .Unsetenv (coreUtils .BuildName ))
26+ assert .NoError (t , os .Unsetenv (coreUtils .BuildName ), "Failed to unset env: JFROG_CLI_BUILD_NAME" )
2727 }()
2828
2929 app := cli .NewApp ()
@@ -221,10 +221,10 @@ func TestVerifyEvidence_Context(t *testing.T) {
221221 assert .NoError (t , os .Setenv (coreUtils .SigningKey , "PGP" ), "Failed to set env: " + coreUtils .SigningKey )
222222 assert .NoError (t , os .Setenv (coreUtils .BuildName , buildName ), "Failed to set env: JFROG_CLI_BUILD_NAME" )
223223 defer func () {
224- assert .NoError (t , os .Unsetenv (coreUtils .SigningKey ))
224+ assert .NoError (t , os .Unsetenv (coreUtils .SigningKey ), "Failed to unset env: " + coreUtils . SigningKey )
225225 }()
226226 defer func () {
227- assert .NoError (t , os .Unsetenv (coreUtils .BuildName ))
227+ assert .NoError (t , os .Unsetenv (coreUtils .BuildName ), "Failed to unset env: JFROG_CLI_BUILD_NAME" )
228228 }()
229229
230230 app := cli .NewApp ()
@@ -614,6 +614,100 @@ func setDefaultValue(flag string, defaultValue string) components.Flag {
614614 return f
615615}
616616
617+ func TestResolveAndNormalizeKey_TrimsWhitespace (t * testing.T ) {
618+ tests := []struct {
619+ name string
620+ envKeyValue string
621+ flagKeyValue string
622+ setFlag bool
623+ expectedResult string
624+ }{
625+ {
626+ name : "Env key with trailing newline" ,
627+ envKeyValue : "-----BEGIN PRIVATE KEY-----\n MIIEvQIBADANBgkqhkiG9w0BAQE\n -----END PRIVATE KEY-----\n " ,
628+ setFlag : false ,
629+ expectedResult : "-----BEGIN PRIVATE KEY-----\n MIIEvQIBADANBgkqhkiG9w0BAQE\n -----END PRIVATE KEY-----" ,
630+ },
631+ {
632+ name : "Env key with trailing spaces and newlines" ,
633+ envKeyValue : " -----BEGIN PRIVATE KEY-----\n MIIEvQIBADANBgkqhkiG9w0BAQE\n -----END PRIVATE KEY----- \n \n " ,
634+ setFlag : false ,
635+ expectedResult : "-----BEGIN PRIVATE KEY-----\n MIIEvQIBADANBgkqhkiG9w0BAQE\n -----END PRIVATE KEY-----" ,
636+ },
637+ {
638+ name : "Flag key with trailing newline" ,
639+ flagKeyValue : "-----BEGIN PRIVATE KEY-----\n MIIEvQIBADANBgkqhkiG9w0BAQE\n -----END PRIVATE KEY-----\n " ,
640+ setFlag : true ,
641+ expectedResult : "-----BEGIN PRIVATE KEY-----\n MIIEvQIBADANBgkqhkiG9w0BAQE\n -----END PRIVATE KEY-----" ,
642+ },
643+ {
644+ name : "Flag key with carriage return and newline" ,
645+ flagKeyValue : "-----BEGIN PRIVATE KEY-----\n MIIEvQIBADANBgkqhkiG9w0BAQE\n -----END PRIVATE KEY-----\r \n " ,
646+ setFlag : true ,
647+ expectedResult : "-----BEGIN PRIVATE KEY-----\n MIIEvQIBADANBgkqhkiG9w0BAQE\n -----END PRIVATE KEY-----" ,
648+ },
649+ {
650+ name : "Flag vs Env behavior difference - flag takes precedence and gets trimmed" ,
651+ envKeyValue : " env-key-value \n " ,
652+ flagKeyValue : " flag-key-value \n " ,
653+ setFlag : true ,
654+ expectedResult : "flag-key-value" ,
655+ },
656+ {
657+ name : "Env fallback when no flag - env key gets trimmed" ,
658+ envKeyValue : " env-key-value \n " ,
659+ setFlag : false ,
660+ expectedResult : "env-key-value" ,
661+ },
662+ }
663+
664+ for _ , tt := range tests {
665+ t .Run (tt .name , func (t * testing.T ) {
666+ // Setup
667+ if tt .envKeyValue != "" {
668+ assert .NoError (t , os .Setenv (coreUtils .SigningKey , tt .envKeyValue ))
669+ defer func () {
670+ if err := os .Unsetenv (coreUtils .SigningKey ); err != nil {
671+ t .Errorf ("failed to unset env %q: %v" , coreUtils .SigningKey , err )
672+ }
673+ }()
674+ }
675+
676+ // Create context
677+ app := cli .NewApp ()
678+ set := flag .NewFlagSet ("test" , 0 )
679+ cliCtx := cli .NewContext (app , set , nil )
680+
681+ var flags []components.Flag
682+ if tt .setFlag {
683+ flags = append (flags , setDefaultValue (key , tt .flagKeyValue ))
684+ }
685+ flags = append (flags , setDefaultValue (predicate , "test" ))
686+
687+ ctx , err := components .ConvertContext (cliCtx , flags ... )
688+ assert .NoError (t , err )
689+
690+ // Execute
691+ err = resolveAndNormalizeKey (ctx , key )
692+ assert .NoError (t , err )
693+
694+ // Verify
695+ actualValue := ctx .GetStringFlagValue (key )
696+
697+ // Debug output to help understand the difference in trimming behavior
698+ if tt .setFlag {
699+ t .Logf ("Flag input: %q (len=%d)" , tt .flagKeyValue , len (tt .flagKeyValue ))
700+ } else {
701+ t .Logf ("Env input: %q (len=%d)" , tt .envKeyValue , len (tt .envKeyValue ))
702+ }
703+ t .Logf ("Expected: %q (len=%d)" , tt .expectedResult , len (tt .expectedResult ))
704+ t .Logf ("Actual: %q (len=%d)" , actualValue , len (actualValue ))
705+
706+ assert .Equal (t , tt .expectedResult , actualValue )
707+ })
708+ }
709+ }
710+
617711func TestValidateSonarQubeRequirements (t * testing.T ) {
618712 // Save original environment variables
619713 originalSonarToken := os .Getenv ("SONAR_TOKEN" )
0 commit comments