From 9ecfa3d1fc18d028c636692601cbe776ed59e1b4 Mon Sep 17 00:00:00 2001 From: Martin Geno Date: Thu, 9 Nov 2017 11:43:10 +0100 Subject: [PATCH] test data race + fix data race in output --- circle.yml | 24 +++++++++++++++++------- output/all/internal_test.go | 17 +++++++++++++---- output/internal_test.go | 19 ++++++++++++++----- 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/circle.yml b/circle.yml index f0f81620..909d161a 100644 --- a/circle.yml +++ b/circle.yml @@ -1,32 +1,42 @@ version: 2 jobs: - build: + buildenviroment: docker: - image: circleci/golang:latest working_directory: /go/src/github.com/FreifunkBremen/yanic steps: - checkout - run: go get -t -d -v ./... + build: + working_directory: /go/src/github.com/FreifunkBremen/yanic + steps: - run: go install github.com/FreifunkBremen/yanic - store_artifacts: path: /go/bin/ destination: yanic test: - docker: - - image: circleci/golang:latest working_directory: /go/src/github.com/FreifunkBremen/yanic steps: - - checkout - - run: go get -t -d -v ./... - run: go get github.com/mattn/goveralls - run: go get golang.org/x/tools/cmd/cover - run: ./.test-coverage circle-ci - store_test_results: path: ./ destination: profile.cov + + test-race: + working_directory: /go/src/github.com/FreifunkBremen/yanic + steps: + - run: go test -race ./... + workflows: version: 2 build_and_test: jobs: - - build - - test + - buildenviroment + - build: + requires: buildenviroment + - test: + requires: buildenviroment + - test-race: + requires: buildenviroment diff --git a/output/all/internal_test.go b/output/all/internal_test.go index ad067a35..ef87ba29 100644 --- a/output/all/internal_test.go +++ b/output/all/internal_test.go @@ -2,6 +2,7 @@ package all import ( "errors" + "sync" "testing" "github.com/FreifunkBremen/yanic/output" @@ -11,11 +12,19 @@ import ( type testOutput struct { output.Output - CountSave int + countSave int + sync.Mutex } func (c *testOutput) Save(nodes *runtime.Nodes) { - c.CountSave++ + c.Lock() + c.countSave++ + c.Unlock() +} +func (c *testOutput) Get() int { + c.Lock() + defer c.Unlock() + return c.countSave } func TestStart(t *testing.T) { @@ -69,9 +78,9 @@ func TestStart(t *testing.T) { }) assert.NoError(err) - assert.Equal(0, globalOutput.CountSave) + assert.Equal(0, globalOutput.Get()) allOutput.Save(nodes) - assert.Equal(3, globalOutput.CountSave) + assert.Equal(3, globalOutput.Get()) _, err = Register(map[string]interface{}{ "e": []map[string]interface{}{ diff --git a/output/internal_test.go b/output/internal_test.go index 9d9e9d09..72c7a11b 100644 --- a/output/internal_test.go +++ b/output/internal_test.go @@ -1,6 +1,7 @@ package output import ( + "sync" "testing" "time" @@ -10,11 +11,19 @@ import ( type testConn struct { Output - CountSave int + countSave int + sync.Mutex } func (c *testConn) Save(nodes *runtime.Nodes) { - c.CountSave++ + c.Lock() + c.countSave++ + c.Unlock() +} +func (c *testConn) Get() int { + c.Lock() + defer c.Unlock() + return c.countSave } func TestStart(t *testing.T) { @@ -38,12 +47,12 @@ func TestStart(t *testing.T) { Start(conn, nil, config) assert.NotNil(quit) - assert.Equal(0, conn.CountSave) + assert.Equal(0, conn.Get()) time.Sleep(time.Millisecond * 12) - assert.Equal(1, conn.CountSave) + assert.Equal(1, conn.Get()) time.Sleep(time.Millisecond * 12) Close() - assert.Equal(2, conn.CountSave) + assert.Equal(2, conn.Get()) }