// Copyright 2019 The gVisor Authors. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package sync import ( "testing" "time" ) func TestSeqCountWriteUncontended(t *testing.T) { var seq SeqCount seq.BeginWrite() seq.EndWrite() } func TestSeqCountReadUncontended(t *testing.T) { var seq SeqCount epoch := seq.BeginRead() if !seq.ReadOk(epoch) { t.Errorf("ReadOk: got false, wanted true") } } func TestSeqCountBeginReadAfterWrite(t *testing.T) { var seq SeqCount var data int32 const want = 1 seq.BeginWrite() data = want seq.EndWrite() epoch := seq.BeginRead() if data != want { t.Errorf("Reader: got %v, wanted %v", data, want) } if !seq.ReadOk(epoch) { t.Errorf("ReadOk: got false, wanted true") } } func TestSeqCountBeginReadDuringWrite(t *testing.T) { var seq SeqCount var data int const want = 1 seq.BeginWrite() go func() { time.Sleep(time.Second) data = want seq.EndWrite() }() epoch := seq.BeginRead() if data != want { t.Errorf("Reader: got %v, wanted %v", data, want) } if !seq.ReadOk(epoch) { t.Errorf("ReadOk: got false, wanted true") } } func TestSeqCountReadOkAfterWrite(t *testing.T) { var seq SeqCount epoch := seq.BeginRead() seq.BeginWrite() seq.EndWrite() if seq.ReadOk(epoch) { t.Errorf("ReadOk: got true, wanted false") } } func TestSeqCountReadOkDuringWrite(t *testing.T) { var seq SeqCount epoch := seq.BeginRead() seq.BeginWrite() if seq.ReadOk(epoch) { t.Errorf("ReadOk: got true, wanted false") } seq.EndWrite() } func BenchmarkSeqCountWriteUncontended(b *testing.B) { var seq SeqCount for i := 0; i < b.N; i++ { seq.BeginWrite() seq.EndWrite() } } func BenchmarkSeqCountReadUncontended(b *testing.B) { var seq SeqCount b.RunParallel(func(pb *testing.PB) { for pb.Next() { epoch := seq.BeginRead() if !seq.ReadOk(epoch) { b.Fatalf("ReadOk: got false, wanted true") } } }) }