Skip to content

Commit a8f6d9e

Browse files
authored
Generate Cobertura report (#441)
* WIP * WIP * No transformation yet * Update Jenkinsfile * Coverage DTD * Typo * Write attrs for Cobertura report * Enable coverage for CI scripts * Implementation full * Few bugfixes * Fix: hell in builder * Fix: wrong method name * Supports all test types * Fix: package context * Rename Must * Rename
1 parent f2bc77f commit a8f6d9e

File tree

8 files changed

+299
-12
lines changed

8 files changed

+299
-12
lines changed

.ci/Jenkinsfile

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ pipeline {
6464
junit(allowEmptyResults: false,
6565
keepLongStdio: true,
6666
testResults: "build/test-results/*.xml")
67+
coverageReport('build/test-coverage')
6768
}
6869
}
6970
}

cmd/testrunner.go

+17
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ func setupTestCommand() *cobraext.Command {
6767
cmd.PersistentFlags().BoolP(cobraext.GenerateTestResultFlagName, "g", false, cobraext.GenerateTestResultFlagDescription)
6868
cmd.PersistentFlags().StringP(cobraext.ReportFormatFlagName, "", string(formats.ReportFormatHuman), cobraext.ReportFormatFlagDescription)
6969
cmd.PersistentFlags().StringP(cobraext.ReportOutputFlagName, "", string(outputs.ReportOutputSTDOUT), cobraext.ReportOutputFlagDescription)
70+
cmd.PersistentFlags().BoolP(cobraext.TestCoverageFlagName, "", false, cobraext.TestCoverageFlagDescription)
7071
cmd.PersistentFlags().DurationP(cobraext.DeferCleanupFlagName, "", 0, cobraext.DeferCleanupFlagDescription)
7172
cmd.PersistentFlags().String(cobraext.VariantFlagName, "", cobraext.VariantFlagDescription)
7273

@@ -116,6 +117,11 @@ func testTypeCommandActionFactory(runner testrunner.TestRunner) cobraext.Command
116117
return cobraext.FlagParsingError(err, cobraext.ReportOutputFlagName)
117118
}
118119

120+
testCoverage, err := cmd.Flags().GetBool(cobraext.TestCoverageFlagName)
121+
if err != nil {
122+
return cobraext.FlagParsingError(err, cobraext.TestCoverageFlagName)
123+
}
124+
119125
packageRootPath, found, err := packages.FindPackageRoot()
120126
if !found {
121127
return errors.New("package root not found")
@@ -143,6 +149,10 @@ func testTypeCommandActionFactory(runner testrunner.TestRunner) cobraext.Command
143149
if err != nil {
144150
return cobraext.FlagParsingError(err, cobraext.DataStreamsFlagName)
145151
}
152+
153+
if len(dataStreams) > 0 {
154+
return cobraext.FlagParsingError(errors.New("test coverage can be calculated only if all data streams are selected"), cobraext.DataStreamsFlagName)
155+
}
146156
}
147157

148158
if runner.TestFolderRequired() {
@@ -217,6 +227,13 @@ func testTypeCommandActionFactory(runner testrunner.TestRunner) cobraext.Command
217227
return errors.Wrap(err, "error writing test report")
218228
}
219229

230+
if testCoverage {
231+
err := testrunner.WriteCoverage(packageRootPath, m.Name, runner.Type(), results)
232+
if err != nil {
233+
return errors.Wrap(err, "error writing test coverage")
234+
}
235+
}
236+
220237
// Check if there is any error or failure reported
221238
for _, r := range results {
222239
if r.ErrorMsg != "" || r.FailureMsg != "" {

internal/builder/packages.go

+27-9
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,22 @@ import (
1515
"github.com/pkg/errors"
1616
)
1717

18-
// FindBuildDirectory locates the target build directory.
19-
func FindBuildDirectory() (string, bool, error) {
18+
// BuildDirectory function locates the target build directory. If the directory doesn't exist, it will create it.
19+
func BuildDirectory() (string, error) {
20+
buildDir, found, err := findBuildDirectory()
21+
if err != nil {
22+
return "", errors.Wrap(err, "locating build directory failed")
23+
}
24+
if !found {
25+
buildDir, err = createBuildDirectory()
26+
if err != nil {
27+
return "", errors.Wrap(err, "creating new build directory failed")
28+
}
29+
}
30+
return buildDir, nil
31+
}
32+
33+
func findBuildDirectory() (string, bool, error) {
2034
workDir, err := os.Getwd()
2135
if err != nil {
2236
return "", false, errors.Wrap(err, "locating working directory failed")
@@ -38,15 +52,15 @@ func FindBuildDirectory() (string, bool, error) {
3852
return "", false, nil
3953
}
4054

41-
// MustFindBuildPackagesDirectory function locates the target build directory for packages.
55+
// BuildPackagesDirectory function locates the target build directory for packages.
4256
// If the directories path doesn't exist, it will create it.
43-
func MustFindBuildPackagesDirectory(packageRoot string) (string, error) {
57+
func BuildPackagesDirectory(packageRoot string) (string, error) {
4458
buildDir, found, err := FindBuildPackagesDirectory()
4559
if err != nil {
4660
return "", errors.Wrap(err, "locating build directory failed")
4761
}
4862
if !found {
49-
buildDir, err = createBuildPackagesDirectory()
63+
buildDir, err = createBuildDirectory("integrations") // TODO add support for other package types
5064
if err != nil {
5165
return "", errors.Wrap(err, "creating new build directory failed")
5266
}
@@ -61,7 +75,7 @@ func MustFindBuildPackagesDirectory(packageRoot string) (string, error) {
6175

6276
// FindBuildPackagesDirectory function locates the target build directory for packages.
6377
func FindBuildPackagesDirectory() (string, bool, error) {
64-
buildDir, found, err := FindBuildDirectory()
78+
buildDir, found, err := findBuildDirectory()
6579
if err != nil {
6680
return "", false, err
6781
}
@@ -86,7 +100,7 @@ func FindBuildPackagesDirectory() (string, bool, error) {
86100

87101
// BuildPackage function builds the package.
88102
func BuildPackage(packageRoot string) (string, error) {
89-
destinationDir, err := MustFindBuildPackagesDirectory(packageRoot)
103+
destinationDir, err := BuildPackagesDirectory(packageRoot)
90104
if err != nil {
91105
return "", errors.Wrap(err, "locating build directory for package failed")
92106
}
@@ -118,7 +132,7 @@ func BuildPackage(packageRoot string) (string, error) {
118132
return destinationDir, nil
119133
}
120134

121-
func createBuildPackagesDirectory() (string, error) {
135+
func createBuildDirectory(dirs ...string) (string, error) {
122136
workDir, err := os.Getwd()
123137
if err != nil {
124138
return "", errors.Wrap(err, "locating working directory failed")
@@ -129,7 +143,11 @@ func createBuildPackagesDirectory() (string, error) {
129143
path := filepath.Join(dir, ".git")
130144
fileInfo, err := os.Stat(path)
131145
if err == nil && fileInfo.IsDir() {
132-
buildDir := filepath.Join(dir, "build", "integrations") // TODO add support for other package types
146+
p := []string{dir, "build"}
147+
if len(dirs) > 0 {
148+
p = append(p, dirs...)
149+
}
150+
buildDir := filepath.Join(p...)
133151
err = os.MkdirAll(buildDir, 0755)
134152
if err != nil {
135153
return "", errors.Wrapf(err, "mkdir failed (path: %s)", buildDir)

internal/cobraext/const.go

+3
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ const (
7272
StackDumpOutputFlagName = "output"
7373
StackDumpOutputFlagDescription = "output location for the stack dump"
7474

75+
TestCoverageFlagName = "test-coverage"
76+
TestCoverageFlagDescription = "generate Cobertura test coverage reports"
77+
7578
VariantFlagName = "variant"
7679
VariantFlagDescription = "service variant"
7780

internal/docs/readme.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func updateReadme(fileName, packageRoot string) (string, error) {
128128
return "", errors.Wrapf(err, "writing %s file failed", fileName)
129129
}
130130

131-
packageBuildRoot, err := builder.MustFindBuildPackagesDirectory(packageRoot)
131+
packageBuildRoot, err := builder.BuildPackagesDirectory(packageRoot)
132132
if err != nil {
133133
return "", errors.Wrap(err, "package build root not found")
134134
}

0 commit comments

Comments
 (0)