/
cypress.go
90 lines (77 loc) · 2.46 KB
/
cypress.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
package docker
import (
"context"
"github.com/saucelabs/saucectl/internal/cypress"
"github.com/saucelabs/saucectl/internal/framework"
"github.com/saucelabs/saucectl/internal/job"
"github.com/saucelabs/saucectl/internal/report"
)
// CypressRunner represents the docker implementation of a test runner.
type CypressRunner struct {
ContainerRunner
Project cypress.Project
}
// NewCypress creates a new CypressRunner instance.
func NewCypress(c cypress.Project, ms framework.MetadataService, wr job.Writer, jr job.Reader, dl job.ArtifactDownloader, reps []report.Reporter) (*CypressRunner, error) {
r := CypressRunner{
Project: c,
ContainerRunner: ContainerRunner{
Ctx: context.Background(),
docker: nil,
containerConfig: &containerConfig{},
Framework: framework.Framework{
Name: c.GetKind(),
Version: c.GetVersion(),
},
FrameworkMeta: ms,
ShowConsoleLog: c.IsShowConsoleLog(),
JobWriter: wr,
JobReader: jr,
ArtfactDownloader: dl,
Reporters: reps,
MetadataSearchStrategy: framework.NewSearchStrategy(c.GetVersion(), c.GetRootDir()),
},
}
var err error
r.docker, err = Create()
if err != nil {
return nil, err
}
return &r, nil
}
// RunProject runs the tests defined in config.Project.
func (r *CypressRunner) RunProject() (int, error) {
docker := r.Project.GetDocker()
verifyFileTransferCompatibility(r.Project.GetSauceCfg().Concurrency, &docker)
if err := r.fetchImage(&docker); err != nil {
return 1, err
}
sigChan := r.registerSkipSuitesOnSignal()
defer unregisterSignalCapture(sigChan)
containerOpts, results := r.createWorkerPool(r.Project.GetSauceCfg().Concurrency)
defer close(results)
go func() {
for _, suite := range r.Project.GetSuites() {
containerOpts <- containerStartOptions{
Docker: docker,
BeforeExec: r.Project.GetBeforeExec(),
Project: r.Project,
Browser: suite.Browser,
DisplayName: suite.Name,
SuiteName: suite.Name,
Environment: suite.Env,
RootDir: r.Project.GetRootDir(),
Sauceignore: r.Project.GetSauceCfg().Sauceignore,
ConfigFilePath: r.Project.GetCfgPath(),
CLIFlags: r.Project.GetCLIFlags(),
Timeout: suite.Timeout,
}
}
close(containerOpts)
}()
hasPassed := r.collectResults(r.Project.GetArtifactsCfg().Download, results, r.Project.GetSuiteCount())
if !hasPassed {
return 1, nil
}
return 0, nil
}