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  }