diff --git a/.gitignore b/.gitignore index dc4048b..7050f75 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /woj /config.yaml /dsn.txt +/coverage.* diff --git a/Makefile b/Makefile index ce25cb9..02d0810 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ LDFLAGS += -s -w GOBUILD := $(GO) build -ldflags '$(LDFLAGS)' GOBIN := $(shell go env GOPATH)/bin -.PHONY: all build clean dep swagger fmt +.PHONY: all build clean dep swagger fmt coverage test default: all @@ -35,3 +35,10 @@ swagger: fmt: go fmt ./... + +coverage: + go test ./... -coverprofile=coverage.out + go tool cover -html=coverage.out -o coverage.html + +test: + go test -race ./... diff --git a/pkg/pool/pool.go b/pkg/pool/pool.go index 1e8fb78..f1a04ca 100644 --- a/pkg/pool/pool.go +++ b/pkg/pool/pool.go @@ -33,17 +33,18 @@ func (tp *TaskPool) Start() { func (tp *TaskPool) AddTask(f func()) int { tp.lck.Lock() - defer tp.lck.Unlock() id := tp.curTaskID tp.curTaskID++ - task := Task{id: id, f: f} - tp.queue <- task - waitChan := make(chan struct{}) tp.waitMap[id] = waitChan + tp.lck.Unlock() + + task := Task{id: id, f: f} + tp.queue <- task + return id } diff --git a/pkg/pool/pool_test.go b/pkg/pool/pool_test.go index fe21f03..f82680c 100644 --- a/pkg/pool/pool_test.go +++ b/pkg/pool/pool_test.go @@ -60,3 +60,39 @@ func TestTaskPool_WaitForTask(t *testing.T) { pool.Stop() } + +func TestTaskPool_One(t *testing.T) { + pool := NewTaskPool(1, 1) + pool.Start() + + lck := sync.Mutex{} + counter := 0 + + ids := make([]int, 0) + for i := 1; i <= 10; i++ { + f := func(i int) func() { + return func() { + lck.Lock() + t.Log("task", i, "locked") + counter += i + t.Log("task", i, "unlocked") + lck.Unlock() + + time.Sleep(time.Duration(i*10) * time.Millisecond) + t.Log("task", i, "finished") + } + }(i) + id := pool.AddTask(f) + ids = append(ids, id) + } + + for _, id := range ids { + pool.WaitForTask(id) + } + + if counter != 55 { + t.Error("some tasks were not executed") + } + + pool.Stop() +}