-
Notifications
You must be signed in to change notification settings - Fork 130
/
testdiscovery.go
139 lines (125 loc) · 4.03 KB
/
testdiscovery.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// Package testdiscoveryservice is used for discover tests
package testdiscoveryservice
import (
"context"
"encoding/json"
"fmt"
"net/http"
"os"
"os/exec"
"github.com/LambdaTest/test-at-scale/pkg/core"
"github.com/LambdaTest/test-at-scale/pkg/global"
"github.com/LambdaTest/test-at-scale/pkg/logstream"
"github.com/LambdaTest/test-at-scale/pkg/lumber"
"github.com/LambdaTest/test-at-scale/pkg/utils"
)
type testDiscoveryService struct {
logger lumber.Logger
execManager core.ExecutionManager
tdResChan chan core.DiscoveryResult
requests core.Requests
endpoint string
}
// NewTestDiscoveryService creates and returns a new testDiscoveryService instance
func NewTestDiscoveryService(ctx context.Context,
tdResChan chan core.DiscoveryResult,
execManager core.ExecutionManager,
requests core.Requests,
logger lumber.Logger) core.TestDiscoveryService {
return &testDiscoveryService{
logger: logger,
execManager: execManager,
tdResChan: tdResChan,
requests: requests,
endpoint: global.NeuronHost + "/test-list",
}
}
func (tds *testDiscoveryService) Discover(ctx context.Context,
tasConfig *core.TASConfig,
payload *core.Payload,
secretData map[string]string,
diff map[string]int,
diffExists bool) error {
var target []string
var envMap map[string]string
if payload.EventType == core.EventPullRequest {
target = tasConfig.Premerge.Patterns
envMap = tasConfig.Premerge.EnvMap
} else {
target = tasConfig.Postmerge.Patterns
envMap = tasConfig.Postmerge.EnvMap
}
tasYmlModified := false
configFilePath, err := utils.GetConfigFileName(payload.TasFileName)
if err != nil {
return err
}
if _, ok := diff[configFilePath]; ok {
tasYmlModified = true
}
// discover all tests if tas.yml modified or smart run feature is set to false
discoverAll := tasYmlModified || !tasConfig.SmartRun
args := []string{"--command", "discover"}
if !discoverAll {
if len(diff) == 0 && diffExists {
// empty diff; in PR, a commit added and then reverted to cause an overall empty PR diff
args = append(args, "--diff")
} else {
for k, v := range diff {
// in changed files we only have added or modified files.
if v != core.FileRemoved {
args = append(args, "--diff", k)
}
}
}
}
if tasConfig.ConfigFile != "" {
args = append(args, "--config", tasConfig.ConfigFile)
}
for _, pattern := range target {
args = append(args, "--pattern", pattern)
}
tds.logger.Debugf("Discovering tests at paths %+v", target)
cmd := exec.CommandContext(ctx, global.FrameworkRunnerMap[tasConfig.Framework], args...)
cmd.Dir = global.RepoDir
envVars, err := tds.execManager.GetEnvVariables(envMap, secretData)
if err != nil {
tds.logger.Errorf("failed to parse env variables, error: %v", err)
return err
}
cmd.Env = envVars
logWriter := lumber.NewWriter(tds.logger)
defer logWriter.Close()
maskWriter := logstream.NewMasker(logWriter, secretData)
cmd.Stdout = maskWriter
cmd.Stderr = maskWriter
tds.logger.Debugf("Executing test discovery command: %s", cmd.String())
if err := cmd.Run(); err != nil {
tds.logger.Errorf("command %s of type %s failed with error: %v", cmd.String(), core.Discovery, err)
return err
}
testDiscoveryResult := <-tds.tdResChan
testDiscoveryResult.Parallelism = tasConfig.Parallelism
testDiscoveryResult.SplitMode = tasConfig.SplitMode
testDiscoveryResult.ContainerImage = tasConfig.ContainerImage
testDiscoveryResult.Tier = tasConfig.Tier
if err := tds.updateResult(ctx, &testDiscoveryResult); err != nil {
return err
}
return nil
}
func (tds *testDiscoveryService) updateResult(ctx context.Context, testDiscoveryResult *core.DiscoveryResult) error {
reqBody, err := json.Marshal(testDiscoveryResult)
if err != nil {
tds.logger.Errorf("error while json marshal %v", err)
return err
}
params := utils.FetchQueryParams()
headers := map[string]string{
"Authorization": fmt.Sprintf("%s %s", "Bearer", os.Getenv("TOKEN")),
}
if _, _, err := tds.requests.MakeAPIRequest(ctx, http.MethodPost, tds.endpoint, reqBody, params, headers); err != nil {
return err
}
return nil
}