EnvManager: fix race condition in test
Refactor EnvManager so it takes TaskManager as an input.
This way clients can interject created tasks and install listeners.
Change-Id: Ief332060aea9e98587b43d04d68a4640717d18cd
diff --git a/core/installer/welcome/env_test.go b/core/installer/welcome/env_test.go
index 0d61af8..e4cee83 100644
--- a/core/installer/welcome/env_test.go
+++ b/core/installer/welcome/env_test.go
@@ -12,6 +12,7 @@
"strings"
"sync"
"testing"
+ "time"
"github.com/go-git/go-billy/v5"
"github.com/go-git/go-billy/v5/memfs"
@@ -21,6 +22,7 @@
"github.com/giolekva/pcloud/core/installer"
"github.com/giolekva/pcloud/core/installer/soft"
+ "github.com/giolekva/pcloud/core/installer/tasks"
)
type fakeNSCreator struct {
@@ -184,6 +186,24 @@
return []net.IP{net.ParseIP("1.1.1.1"), net.ParseIP("2.2.2.2")}, nil
}
+type onDoneTaskMap struct {
+ m tasks.TaskManager
+ onDone tasks.TaskDoneListener
+}
+
+func (m *onDoneTaskMap) Add(name string, task tasks.Task) error {
+ if err := m.m.Add(name, task); err != nil {
+ return err
+ } else {
+ task.OnDone(m.onDone)
+ return nil
+ }
+}
+
+func (m *onDoneTaskMap) Get(name string) (tasks.Task, error) {
+ return m.m.Get(name)
+}
+
func TestCreateNewEnv(t *testing.T) {
apps := installer.NewInMemoryAppRepository(installer.CreateAllApps())
infraFS := memfs.New()
@@ -214,6 +234,16 @@
cg := fakeClientGetter{t, envFS}
httpClient := fakeHttpClient{t, make(map[string]int)}
dnsClient := fakeDnsClient{t, make(map[string]int)}
+ var done sync.WaitGroup
+ done.Add(1)
+ var taskErr error
+ tm := &onDoneTaskMap{
+ tasks.NewTaskMap(),
+ func(err error) {
+ taskErr = err
+ done.Done()
+ },
+ }
s := NewEnvServer(
8181,
fakeSoftServeClient{t, envFS},
@@ -224,8 +254,10 @@
fixedNameGenerator{},
httpClient,
dnsClient,
+ tm,
)
go s.Start()
+ time.Sleep(1 * time.Second) // Let server start
req := createEnvReq{
Name: "test",
ContactEmail: "test@test.t",
@@ -238,13 +270,6 @@
t.Fatal(err)
}
resp, err := http.Post("http://localhost:8181/", "application/json", &buf)
- var done sync.WaitGroup
- done.Add(1)
- var taskErr error
- s.Tasks["test"].OnDone(func(err error) {
- taskErr = err
- done.Done()
- })
if err != nil {
t.Fatal(err)
}