浏览代码

fix recordingFrameHeaderObserver race (#1136)

* fix recordingFrameHeaderObserver race

* make TestFrameHeaderObserver deterministic
Chris Bannister 7 年之前
父节点
当前提交
1730c765af
共有 1 个文件被更改,包括 18 次插入5 次删除
  1. 18 5
      conn_test.go

+ 18 - 5
conn_test.go

@@ -637,11 +637,21 @@ func TestContext_Timeout(t *testing.T) {
 }
 
 type recordingFrameHeaderObserver struct {
-	t *testing.T
+	t      *testing.T
+	mu     sync.Mutex
 	frames []ObservedFrameHeader
 }
+
 func (r *recordingFrameHeaderObserver) ObserveFrameHeader(ctx context.Context, frm ObservedFrameHeader) {
+	r.mu.Lock()
 	r.frames = append(r.frames, frm)
+	r.mu.Unlock()
+}
+
+func (r *recordingFrameHeaderObserver) getFrames() []ObservedFrameHeader {
+	r.mu.Lock()
+	defer r.mu.Unlock()
+	return r.frames
 }
 
 func TestFrameHeaderObserver(t *testing.T) {
@@ -649,6 +659,7 @@ func TestFrameHeaderObserver(t *testing.T) {
 	defer srv.Stop()
 
 	cluster := testCluster(srv.Address, defaultProto)
+	cluster.NumConns = 1
 	observer := &recordingFrameHeaderObserver{t: t}
 	cluster.FrameHeaderObserver = observer
 
@@ -661,14 +672,16 @@ func TestFrameHeaderObserver(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	if len(observer.frames) != 2 {
-		t.Fatalf("Expected to receive 2 frames, instead received %d", len(observer.frames))
+	frames := observer.getFrames()
+
+	if len(frames) != 2 {
+		t.Fatalf("Expected to receive 2 frames, instead received %d", len(frames))
 	}
-	readyFrame := observer.frames[0]
+	readyFrame := frames[0]
 	if readyFrame.Opcode != byte(opReady) {
 		t.Fatalf("Expected to receive ready frame, instead received frame of opcode %d", readyFrame.Opcode)
 	}
-	voidResultFrame := observer.frames[1]
+	voidResultFrame := frames[1]
 	if voidResultFrame.Opcode != byte(opResult) {
 		t.Fatalf("Expected to receive result frame, instead received frame of opcode %d", voidResultFrame.Opcode)
 	}