Bläddra i källkod

Show that logger is not thread-safe.

Alexey Palazhchenko 9 år sedan
förälder
incheckning
d8abbc63fe
2 ändrade filer med 35 tillägg och 21 borttagningar
  1. 2 0
      .travis.yml
  2. 33 21
      log/log_test.go

+ 2 - 0
.travis.yml

@@ -1,11 +1,13 @@
 language: go
 go:
+    - 1.5.2
     - tip
 before_install:
     - go get github.com/modocache/gover
     - go get github.com/mattn/goveralls
     - go get golang.org/x/tools/cmd/cover
 script:
+    - go test -race ./...
     - go test -coverprofile=color.coverprofile ./color
     - go test -coverprofile=gytes.coverprofile ./gytes
     - go test -coverprofile=log.coverprofile ./log

+ 33 - 21
log/log_test.go

@@ -2,32 +2,58 @@ package log
 
 import (
 	"bytes"
-	"testing"
-
 	"os"
 	"os/exec"
+	"sync"
+	"testing"
 
 	"github.com/stretchr/testify/assert"
 )
 
+func test(l *Logger, v Level, t *testing.T) {
+	l.SetLevel(v)
+	l.Print("print")
+	l.Printf("print%s", "f")
+	l.Debug("debug")
+	l.Debugf("debug%s", "f")
+	l.Info("info")
+	l.Infof("info%s", "f")
+	l.Warn("warn")
+	l.Warnf("warn%s", "f")
+	l.Error("error")
+	l.Errorf("error%s", "f")
+}
+
 func TestLog(t *testing.T) {
 	l := New("test")
 	b := new(bytes.Buffer)
 	l.SetOutput(b)
 	test(l, DEBUG, t)
-	assert.Contains(t, b.String(), "debug")
-	assert.Contains(t, b.String(), "debugf")
-	assert.Contains(t, b.String(), "warn")
-	assert.Contains(t, b.String(), "warnf")
+	assert.Contains(t, b.String(), "\nDEBUG|test|debug\n")
+	assert.Contains(t, b.String(), "\nDEBUG|test|debugf\n")
+	assert.Contains(t, b.String(), "\nWARN|test|warn\n")
+	assert.Contains(t, b.String(), "\nWARN|test|warnf\n")
 
 	b.Reset()
 	SetOutput(b)
 	test(global, WARN, t)
 	assert.NotContains(t, b.String(), "info")
-	assert.Contains(t, b.String(), "warn")
+	assert.Contains(t, b.String(), "\nWARN|-|warn\n")
 	println(b.String())
 }
 
+func TestLogConcurrent(t *testing.T) {
+	var wg sync.WaitGroup
+	for i := 0; i < 2; i++ {
+		wg.Add(1)
+		go func() {
+			TestLog(t)
+			wg.Done()
+		}()
+	}
+	wg.Wait()
+}
+
 func TestFatal(t *testing.T) {
 	l := New("test")
 	switch os.Getenv("TEST_LOGGER_FATAL") {
@@ -56,17 +82,3 @@ func loggerFatalTest(t *testing.T, env string, contains string) {
 	}
 	t.Fatalf("process ran with err %v, want exit status 1", err)
 }
-
-func test(l *Logger, v Level, t *testing.T) {
-	l.SetLevel(v)
-	l.Print("print")
-	l.Printf("print%s", "f")
-	l.Debug("debug")
-	l.Debugf("debug%s", "f")
-	l.Info("info")
-	l.Infof("info%s", "f")
-	l.Warn("warn")
-	l.Warnf("warn%s", "f")
-	l.Error("error")
-	l.Errorf("error%s", "f")
-}