github.com/qlik-oss/gopherciser@v0.18.6/atomichandlers/timestamp_test.go (about) 1 package atomichandlers 2 3 import ( 4 "sync" 5 "testing" 6 "time" 7 ) 8 9 func TestTimestamp(t *testing.T) { 10 t.Parallel() 11 12 ats := AtomicTimeStamp{} 13 14 ts := ats.Current() 15 if !ts.IsZero() { 16 t.Errorf("Unexpected inial timestamp<%v>", ts) 17 } 18 19 now := time.Now() 20 21 ats.Set(now) 22 ts = ats.Current() 23 if !ts.Equal(now) { 24 t.Fatalf("Unexpected now timestamp<%v>", ts) 25 } 26 27 syncChan := make(chan interface{}) 28 defer close(syncChan) 29 30 now = time.Now() 31 go func() { 32 ats.Set(now) 33 syncChan <- nil 34 }() 35 36 select { 37 case <-syncChan: 38 case <-time.After(time.Second): 39 } 40 41 ts = ats.Current() 42 if !ts.Equal(now) { 43 t.Errorf("Unexpected async now timestamp<%v>", ts) 44 } 45 46 ats.Reset() 47 ts = ats.Current() 48 if !ts.IsZero() { 49 t.Errorf("Unexpected reset timestamp<%v>", ts) 50 } 51 52 time1 := time.Now() 53 if err := ats.SetIfNewer(time1); err != nil { 54 t.Fatal(err) 55 } 56 ts = ats.Current() 57 if ts != time1 { 58 t.Fatalf("Unexpected newer timestamp<%v> expected<%v>", ts, time1) 59 } 60 61 older := now.Add(-time.Hour) 62 if err := ats.SetIfOlder(older); err != nil { 63 t.Fatal(err) 64 } 65 ts = ats.Current() 66 if ts != older { 67 t.Errorf("Unexpected older timestamp<%v> expected<%v>", ts, now) 68 } 69 70 //Test nil pointer 71 ats = AtomicTimeStamp{} 72 if err := ats.SetIfNewer(now); err != nil { 73 t.Error(err) 74 } 75 ts = ats.Current() 76 if !ts.Equal(now) { 77 t.Errorf("Unexpected current timestamp<%v>", ts) 78 } 79 80 ats = AtomicTimeStamp{} 81 if err := ats.SetIfOlder(now); err != nil { 82 t.Error(err) 83 } 84 ts = ats.Current() 85 if !ts.Equal(now) { 86 t.Errorf("Unexpected current timestamp<%v>", ts) 87 } 88 } 89 90 func TestParallelTimestampWrites(t *testing.T) { 91 t.Parallel() 92 93 ats := AtomicTimeStamp{} 94 var wg sync.WaitGroup 95 96 // Test set 97 for i := 0; i < 1000; i++ { 98 wg.Add(1) 99 100 switch i % 5 { 101 case 0: // Test Set 102 go func() { 103 defer wg.Done() 104 ats.Set(time.Now()) 105 }() 106 case 1: // Test swap older 107 go func() { 108 defer wg.Done() 109 ts := time.Now() 110 if err := ats.SetIfOlder(ts); err != nil { 111 t.Errorf("Failed to set if older: %v", ts) 112 } 113 }() 114 case 2: // Test swap newer 115 go func() { 116 defer wg.Done() 117 ts := time.Now() 118 if err := ats.SetIfNewer(ts); err != nil { 119 t.Errorf("Failed to set if newer: %v", ts) 120 } 121 }() 122 case 3: // Test reset 123 go func() { 124 defer wg.Done() 125 ats.Reset() 126 }() 127 case 4: // Test current 128 go func() { 129 defer wg.Done() 130 ats.Current() 131 }() 132 } 133 } 134 135 wg.Wait() 136 }