Skip to content

Commit 45aee23

Browse files
authored
Merge pull request #191 from rrylee/feat_singleton_mode
feat: support singleton mode
2 parents a5ee3c2 + 5bfd5e8 commit 45aee23

File tree

9 files changed

+99
-15
lines changed

9 files changed

+99
-15
lines changed

cmd/build.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ func runBuild(args []string, wd string) {
7878
Mode: coverMode.String(),
7979
AgentPort: agentPort.String(),
8080
Center: center,
81+
Singleton: singleton,
8182
IsMod: gocBuild.IsMod,
8283
ModRootPath: gocBuild.ModRootPath,
8384
OneMainPackage: true, // it is a go build

cmd/commonflags.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ var (
3131
debugGoc bool
3232
debugInCISyncFile string
3333
buildFlags string
34+
singleton bool
3435

3536
goRunExecFlag string
3637
goRunArguments string
@@ -51,6 +52,7 @@ func addCommonFlags(cmdset *pflag.FlagSet) {
5152
addBasicFlags(cmdset)
5253
cmdset.Var(&coverMode, "mode", "coverage mode: set, count, atomic")
5354
cmdset.Var(&agentPort, "agentport", "a fixed port such as :8100 for registered service communicate with goc server. if not provided, using a random one")
55+
cmdset.BoolVar(&singleton, "singleton", false, "singleton mode, not register to goc center")
5456
cmdset.StringVar(&buildFlags, "buildflags", "", "specify the build flags")
5557
// bind to viper
5658
viper.BindPFlags(cmdset)

cmd/cover.go

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,22 +38,25 @@ goc cover --center=http://127.0.0.1:7777 --target=/path/to/target --mode=atomic
3838
`,
3939
Hidden: true,
4040
Run: func(cmd *cobra.Command, args []string) {
41-
var buildFlags string
42-
buildFlags = viper.GetString("buildflags")
43-
44-
ci := &cover.CoverInfo{
45-
Args: buildFlags,
46-
GoPath: "",
47-
Target: target,
48-
Mode: coverMode.String(),
49-
AgentPort: agentPort.String(),
50-
Center: center,
51-
OneMainPackage: false,
52-
}
53-
_ = cover.Execute(ci)
41+
runCover(target)
5442
},
5543
}
5644

45+
func runCover(target string) {
46+
buildFlags := viper.GetString("buildflags")
47+
ci := &cover.CoverInfo{
48+
Args: buildFlags,
49+
GoPath: "",
50+
Target: target,
51+
Mode: coverMode.String(),
52+
AgentPort: agentPort.String(),
53+
Center: center,
54+
Singleton: singleton,
55+
OneMainPackage: false,
56+
}
57+
_ = cover.Execute(ci)
58+
}
59+
5760
func init() {
5861
coverCmd.Flags().StringVar(&target, "target", ".", "target folder to cover")
5962
addCommonFlags(coverCmd.Flags())

cmd/cover_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package cmd
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
)
10+
11+
var mainContent = []byte(`package main
12+
13+
import (
14+
"fmt"
15+
)
16+
17+
func main() {
18+
fmt.Println("hello world")
19+
}`)
20+
21+
var goModContent = []byte(`module example.com/simple-project
22+
23+
go 1.11
24+
`)
25+
26+
func TestCoverSuccess(t *testing.T) {
27+
workingDir := filepath.Join(baseDir, "../tests/samples/tmp/project")
28+
err := os.MkdirAll(workingDir, os.ModePerm)
29+
assert.NoError(t, err)
30+
defer os.RemoveAll(workingDir)
31+
32+
err = writeFile(workingDir+"/main.go", mainContent)
33+
assert.NoError(t, err)
34+
err = writeFile(workingDir+"/go.mod", goModContent)
35+
assert.NoError(t, err)
36+
os.Setenv("GO111MODULE", "on")
37+
38+
runCover(workingDir)
39+
40+
_, err = os.Lstat(workingDir + "/http_cover_apis_auto_generated.go")
41+
assert.Equal(t, err, nil, "the generate file should be generated.")
42+
}
43+
44+
func writeFile(name string, data []byte) error {
45+
f, err := os.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
46+
if err != nil {
47+
return err
48+
}
49+
_, err = f.Write(data)
50+
if err1 := f.Close(); err1 != nil && err == nil {
51+
err = err1
52+
}
53+
return err
54+
}

cmd/install.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ func runInstall(args []string, wd string) {
7171
Mode: coverMode.String(),
7272
AgentPort: agentPort.String(),
7373
Center: center,
74+
Singleton: singleton,
7475
IsMod: gocBuild.IsMod,
7576
ModRootPath: gocBuild.ModRootPath,
7677
OneMainPackage: false,

cmd/run.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ goc run . [--buildflags] [--exec] [--arguments]
7070
Target: gocBuild.TmpDir,
7171
Mode: coverMode.String(),
7272
Center: gocServer,
73+
Singleton: singleton,
7374
AgentPort: "",
7475
IsMod: gocBuild.IsMod,
7576
ModRootPath: gocBuild.ModRootPath,

pkg/cover/cover.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ type TestCover struct {
5252
Mode string
5353
AgentPort string
5454
Center string // cover profile host center
55+
Singleton bool
5556
MainPkgCover *PackageCover
5657
DepsCover []*PackageCover
5758
CacheCover map[string]*PackageCover
@@ -139,6 +140,7 @@ type CoverInfo struct {
139140
Mode string
140141
AgentPort string
141142
Center string
143+
Singleton bool
142144
}
143145

144146
//Execute inject cover variables for all the .go files in the target folder
@@ -150,6 +152,7 @@ func Execute(coverInfo *CoverInfo) error {
150152
mode := coverInfo.Mode
151153
agentPort := coverInfo.AgentPort
152154
center := coverInfo.Center
155+
singleton := coverInfo.Singleton
153156
globalCoverVarImportPath := coverInfo.GlobalCoverVarImportPath
154157

155158
if coverInfo.IsMod {
@@ -187,6 +190,7 @@ func Execute(coverInfo *CoverInfo) error {
187190
Mode: mode,
188191
AgentPort: agentPort,
189192
Center: center,
193+
Singleton: singleton,
190194
MainPkgCover: mainCover,
191195
GlobalCoverVarImportPath: globalCoverVarImportPath,
192196
}

pkg/cover/instrument.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,15 @@ func clearFileCover(counter []uint32) {
131131
}
132132
133133
func registerHandlers() {
134+
{{if .Singleton}}
135+
ln, _, err := listen()
136+
{{else}}
134137
ln, host, err := listen()
138+
{{end}}
135139
if err != nil {
136140
log.Fatalf("listen failed, err:%v", err)
137141
}
138-
142+
{{if not .Singleton}}
139143
profileAddr := "http://" + host
140144
if resp, err := registerSelf(profileAddr); err != nil {
141145
log.Fatalf("register address %v failed, err: %v, response: %v", profileAddr, err, string(resp))
@@ -157,6 +161,7 @@ func registerHandlers() {
157161
deregisterSelf(profileAddrs)
158162
}
159163
go watchSignal(fn)
164+
{{end}}
160165
161166
mux := http.NewServeMux()
162167
// Coverage reports the current code coverage as a fraction in the range [0, 1].

tests/build.bats

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,17 @@ setup() {
112112
[ "$status" -eq 0 ]
113113

114114
wait $profile_pid
115-
}
115+
}
116+
117+
@test "test basic goc build command with singleton" {
118+
cd samples/run_for_several_seconds
119+
120+
wait_profile_backend "build7" &
121+
profile_pid=$!
122+
123+
run gocc build --debug --singleton --debugcisyncfile ci-sync.bak;
124+
info build7 output: $output
125+
[ "$status" -eq 0 ]
126+
127+
wait $profile_pid
128+
}

0 commit comments

Comments
 (0)