github.com/SagerNet/gvisor@v0.0.0-20210707092255-7731c139d75c/pkg/sync/seqcount_test.go (about)

     1  // Copyright 2019 The gVisor Authors.
     2  //
     3  // Use of this source code is governed by a BSD-style
     4  // license that can be found in the LICENSE file.
     5  
     6  package sync
     7  
     8  import (
     9  	"testing"
    10  	"time"
    11  )
    12  
    13  func TestSeqCountWriteUncontended(t *testing.T) {
    14  	var seq SeqCount
    15  	seq.BeginWrite()
    16  	seq.EndWrite()
    17  }
    18  
    19  func TestSeqCountReadUncontended(t *testing.T) {
    20  	var seq SeqCount
    21  	epoch := seq.BeginRead()
    22  	if !seq.ReadOk(epoch) {
    23  		t.Errorf("ReadOk: got false, wanted true")
    24  	}
    25  }
    26  
    27  func TestSeqCountBeginReadAfterWrite(t *testing.T) {
    28  	var seq SeqCount
    29  	var data int32
    30  	const want = 1
    31  	seq.BeginWrite()
    32  	data = want
    33  	seq.EndWrite()
    34  	epoch := seq.BeginRead()
    35  	if data != want {
    36  		t.Errorf("Reader: got %v, wanted %v", data, want)
    37  	}
    38  	if !seq.ReadOk(epoch) {
    39  		t.Errorf("ReadOk: got false, wanted true")
    40  	}
    41  }
    42  
    43  func TestSeqCountBeginReadDuringWrite(t *testing.T) {
    44  	var seq SeqCount
    45  	var data int
    46  	const want = 1
    47  	seq.BeginWrite()
    48  	go func() {
    49  		time.Sleep(time.Second)
    50  		data = want
    51  		seq.EndWrite()
    52  	}()
    53  	epoch := seq.BeginRead()
    54  	if data != want {
    55  		t.Errorf("Reader: got %v, wanted %v", data, want)
    56  	}
    57  	if !seq.ReadOk(epoch) {
    58  		t.Errorf("ReadOk: got false, wanted true")
    59  	}
    60  }
    61  
    62  func TestSeqCountReadOkAfterWrite(t *testing.T) {
    63  	var seq SeqCount
    64  	epoch := seq.BeginRead()
    65  	seq.BeginWrite()
    66  	seq.EndWrite()
    67  	if seq.ReadOk(epoch) {
    68  		t.Errorf("ReadOk: got true, wanted false")
    69  	}
    70  }
    71  
    72  func TestSeqCountReadOkDuringWrite(t *testing.T) {
    73  	var seq SeqCount
    74  	epoch := seq.BeginRead()
    75  	seq.BeginWrite()
    76  	if seq.ReadOk(epoch) {
    77  		t.Errorf("ReadOk: got true, wanted false")
    78  	}
    79  	seq.EndWrite()
    80  }
    81  
    82  func BenchmarkSeqCountWriteUncontended(b *testing.B) {
    83  	var seq SeqCount
    84  	for i := 0; i < b.N; i++ {
    85  		seq.BeginWrite()
    86  		seq.EndWrite()
    87  	}
    88  }
    89  
    90  func BenchmarkSeqCountReadUncontended(b *testing.B) {
    91  	var seq SeqCount
    92  	b.RunParallel(func(pb *testing.PB) {
    93  		for pb.Next() {
    94  			epoch := seq.BeginRead()
    95  			if !seq.ReadOk(epoch) {
    96  				b.Fatalf("ReadOk: got false, wanted true")
    97  			}
    98  		}
    99  	})
   100  }