Skip to content

Commit 92a6705

Browse files
daskuznetsovavstarostinmihai-herda-SAP
authored
fix(codeqlExecuteScan): transforming querySuite to empty string (#4957)
* fixed transforming querySuite to empty string * fixed error handling --------- Co-authored-by: Vyacheslav Starostin <[email protected]> Co-authored-by: Mihai Herda <[email protected]>
1 parent 4827785 commit 92a6705

File tree

2 files changed

+115
-12
lines changed

2 files changed

+115
-12
lines changed

cmd/codeqlExecuteScan.go

+18-11
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,9 @@ func codeqlExecuteScan(config codeqlExecuteScanOptions, telemetryData *telemetry
6262
func appendCodeqlQuerySuite(utils codeqlExecuteScanUtils, cmd []string, querySuite, transformString string) []string {
6363
if len(querySuite) > 0 {
6464
if len(transformString) > 0 {
65-
var bufferOut, bufferErr bytes.Buffer
66-
utils.Stdout(&bufferOut)
67-
defer utils.Stdout(log.Writer())
68-
utils.Stderr(&bufferErr)
69-
defer utils.Stderr(log.Writer())
70-
if err := utils.RunExecutable("sh", []string{"-c", fmt.Sprintf("echo %s | sed -E \"%s\"", querySuite, transformString)}...); err != nil {
71-
log.Entry().WithError(err).Error("failed to transform querySuite")
72-
e := bufferErr.String()
73-
log.Entry().Error(e)
74-
} else {
75-
querySuite = strings.TrimSpace(bufferOut.String())
65+
querySuite = transformQuerySuite(utils, querySuite, transformString)
66+
if len(querySuite) == 0 {
67+
return cmd
7668
}
7769
}
7870
cmd = append(cmd, querySuite)
@@ -81,6 +73,21 @@ func appendCodeqlQuerySuite(utils codeqlExecuteScanUtils, cmd []string, querySui
8173
return cmd
8274
}
8375

76+
func transformQuerySuite(utils codeqlExecuteScanUtils, querySuite, transformString string) string {
77+
var bufferOut, bufferErr bytes.Buffer
78+
utils.Stdout(&bufferOut)
79+
defer utils.Stdout(log.Writer())
80+
utils.Stderr(&bufferErr)
81+
defer utils.Stderr(log.Writer())
82+
if err := utils.RunExecutable("sh", []string{"-c", fmt.Sprintf("echo %s | sed -E \"%s\"", querySuite, transformString)}...); err != nil {
83+
log.Entry().WithError(err).Error("failed to transform querySuite")
84+
e := bufferErr.String()
85+
log.Entry().Error(e)
86+
return querySuite
87+
}
88+
return strings.TrimSpace(bufferOut.String())
89+
}
90+
8491
func execute(utils codeqlExecuteScanUtils, cmd []string, isVerbose bool) error {
8592
if isVerbose {
8693
cmd = append(cmd, "-v")

cmd/codeqlExecuteScan_test.go

+97-1
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,8 @@ func TestAppendCodeqlQuerySuite(t *testing.T) {
656656
utils := codeqlExecuteScanMockUtils{
657657
ExecMockRunner: &mock.ExecMockRunner{
658658
Stub: func(call string, stdoutReturn map[string]string, shouldFailOnCommand map[string]error, stdout io.Writer) error {
659-
return fmt.Errorf("error")
659+
stdout.Write([]byte("php-security-extended.qls"))
660+
return nil
660661
},
661662
},
662663
}
@@ -666,6 +667,101 @@ func TestAppendCodeqlQuerySuite(t *testing.T) {
666667
assert.Equal(t, 3, len(cmd))
667668
assert.Equal(t, "php-security-extended.qls", cmd[2])
668669
})
670+
671+
t.Run("Error while transforming querySuite", func(t *testing.T) {
672+
utils := codeqlExecuteScanMockUtils{
673+
ExecMockRunner: &mock.ExecMockRunner{
674+
Stub: func(call string, stdoutReturn map[string]string, shouldFailOnCommand map[string]error, stdout io.Writer) error {
675+
return fmt.Errorf("error")
676+
},
677+
},
678+
}
679+
cmd := []string{"database", "analyze"}
680+
querySuite := "php-security-extended.qls"
681+
cmd = appendCodeqlQuerySuite(utils, cmd, querySuite, `s/^(java|python)-(security-extended\.qls|security-and-quality\.qls)`)
682+
assert.Equal(t, 3, len(cmd))
683+
assert.Equal(t, "php-security-extended.qls", cmd[2])
684+
})
685+
686+
t.Run("Empty transformed querySuite", func(t *testing.T) {
687+
utils := codeqlExecuteScanMockUtils{
688+
ExecMockRunner: &mock.ExecMockRunner{
689+
Stub: func(call string, stdoutReturn map[string]string, shouldFailOnCommand map[string]error, stdout io.Writer) error {
690+
stdout.Write([]byte(""))
691+
return nil
692+
},
693+
},
694+
}
695+
cmd := []string{"database", "analyze"}
696+
querySuite := "python-security-extended.qls"
697+
cmd = appendCodeqlQuerySuite(utils, cmd, querySuite, `s/^(java|python)-(security-extended\.qls|security-and-quality\.qls)//`)
698+
assert.Equal(t, 2, len(cmd))
699+
})
700+
}
701+
702+
func TestTransformQuerySuite(t *testing.T) {
703+
t.Run("Add prefix to querySuite", func(t *testing.T) {
704+
utils := codeqlExecuteScanMockUtils{
705+
ExecMockRunner: &mock.ExecMockRunner{
706+
Stub: func(call string, stdoutReturn map[string]string, shouldFailOnCommand map[string]error, stdout io.Writer) error {
707+
stdout.Write([]byte("test-java-security-extended.qls"))
708+
return nil
709+
},
710+
},
711+
}
712+
input := "java-security-extended.qls"
713+
transformString := `s/^(java|python)-(security-extended.qls|security-and-quality.qls)/test-\1-\2/`
714+
expect := "test-java-security-extended.qls"
715+
result := transformQuerySuite(utils, input, transformString)
716+
assert.Equal(t, expect, result)
717+
})
718+
719+
t.Run("Don't add prefix to querySuite", func(t *testing.T) {
720+
utils := codeqlExecuteScanMockUtils{
721+
ExecMockRunner: &mock.ExecMockRunner{
722+
Stub: func(call string, stdoutReturn map[string]string, shouldFailOnCommand map[string]error, stdout io.Writer) error {
723+
stdout.Write([]byte("php-security-extended.qls"))
724+
return nil
725+
},
726+
},
727+
}
728+
input := "php-security-extended.qls"
729+
transformString := `s/^(java|python)-(security-extended.qls|security-and-quality.qls)/test-\1-\2/`
730+
expected := "php-security-extended.qls"
731+
result := transformQuerySuite(utils, input, transformString)
732+
assert.Equal(t, expected, result)
733+
734+
})
735+
736+
t.Run("Failed running transform cmd", func(t *testing.T) {
737+
utils := codeqlExecuteScanMockUtils{
738+
ExecMockRunner: &mock.ExecMockRunner{
739+
Stub: func(call string, stdoutReturn map[string]string, shouldFailOnCommand map[string]error, stdout io.Writer) error {
740+
return fmt.Errorf("error")
741+
},
742+
},
743+
}
744+
input := "php-security-extended.qls"
745+
transformString := `s//test-\1-\2/`
746+
result := transformQuerySuite(utils, input, transformString)
747+
assert.Equal(t, input, result)
748+
})
749+
750+
t.Run("Transform querySuite to empty string", func(t *testing.T) {
751+
utils := codeqlExecuteScanMockUtils{
752+
ExecMockRunner: &mock.ExecMockRunner{
753+
Stub: func(call string, stdoutReturn map[string]string, shouldFailOnCommand map[string]error, stdout io.Writer) error {
754+
stdout.Write([]byte(""))
755+
return nil
756+
},
757+
},
758+
}
759+
input := "java-security-extended.qls"
760+
transformString := `s/^(java|python)-(security-extended.qls|security-and-quality.qls)//`
761+
expect := ""
762+
result := transformQuerySuite(utils, input, transformString)
763+
assert.Equal(t, expect, result)
764+
})
669765
}
670766

671767
func TestGetLangFromBuildTool(t *testing.T) {

0 commit comments

Comments
 (0)