github.com/jrxfive/nomad@v0.6.1-0.20170802162750-1fef470e89bf/nomad/timetable_test.go (about)

     1  package nomad
     2  
     3  import (
     4  	"bytes"
     5  	"reflect"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/hashicorp/nomad/nomad/structs"
    10  	"github.com/ugorji/go/codec"
    11  )
    12  
    13  func TestTimeTable(t *testing.T) {
    14  	t.Parallel()
    15  	tt := NewTimeTable(time.Second, time.Minute)
    16  
    17  	index := tt.NearestIndex(time.Now())
    18  	if index != 0 {
    19  		t.Fatalf("bad: %v", index)
    20  	}
    21  
    22  	when := tt.NearestTime(1000)
    23  	if !when.IsZero() {
    24  		t.Fatalf("bad: %v", when)
    25  	}
    26  
    27  	// Witness some data
    28  	start := time.Now()
    29  	plusOne := start.Add(time.Minute)
    30  	plusTwo := start.Add(2 * time.Minute)
    31  	plusFive := start.Add(5 * time.Minute)
    32  	plusThirty := start.Add(30 * time.Minute)
    33  	plusHour := start.Add(60 * time.Minute)
    34  	plusHourHalf := start.Add(90 * time.Minute)
    35  
    36  	tt.Witness(2, start)
    37  	tt.Witness(2, start)
    38  
    39  	tt.Witness(10, plusOne)
    40  	tt.Witness(10, plusOne)
    41  
    42  	tt.Witness(20, plusTwo)
    43  	tt.Witness(20, plusTwo)
    44  
    45  	tt.Witness(30, plusFive)
    46  	tt.Witness(30, plusFive)
    47  
    48  	tt.Witness(40, plusThirty)
    49  	tt.Witness(40, plusThirty)
    50  
    51  	tt.Witness(50, plusHour)
    52  	tt.Witness(50, plusHour)
    53  
    54  	type tcase struct {
    55  		when        time.Time
    56  		expectIndex uint64
    57  
    58  		index      uint64
    59  		expectWhen time.Time
    60  	}
    61  	cases := []tcase{
    62  		// Exact match
    63  		{start, 2, 2, start},
    64  		{plusOne, 10, 10, plusOne},
    65  		{plusHour, 50, 50, plusHour},
    66  
    67  		// Before the newest entry
    68  		{plusHourHalf, 50, 51, plusHour},
    69  
    70  		// After the oldest entry
    71  		{time.Time{}, 0, 1, time.Time{}},
    72  
    73  		// Mid range
    74  		{start.Add(3 * time.Minute), 20, 25, plusTwo},
    75  	}
    76  
    77  	for _, tc := range cases {
    78  		index := tt.NearestIndex(tc.when)
    79  		if index != tc.expectIndex {
    80  			t.Fatalf("bad: %v %v", index, tc.expectIndex)
    81  		}
    82  
    83  		when := tt.NearestTime(tc.index)
    84  		if when != tc.expectWhen {
    85  			t.Fatalf("bad: for %d %v %v", tc.index, when, tc.expectWhen)
    86  		}
    87  	}
    88  }
    89  
    90  func TestTimeTable_SerializeDeserialize(t *testing.T) {
    91  	t.Parallel()
    92  	tt := NewTimeTable(time.Second, time.Minute)
    93  
    94  	// Witness some data
    95  	start := time.Now()
    96  	plusOne := start.Add(time.Minute)
    97  	plusTwo := start.Add(2 * time.Minute)
    98  	plusFive := start.Add(5 * time.Minute)
    99  	plusThirty := start.Add(30 * time.Minute)
   100  	plusHour := start.Add(60 * time.Minute)
   101  
   102  	tt.Witness(2, start)
   103  	tt.Witness(10, plusOne)
   104  	tt.Witness(20, plusTwo)
   105  	tt.Witness(30, plusFive)
   106  	tt.Witness(40, plusThirty)
   107  	tt.Witness(50, plusHour)
   108  
   109  	var buf bytes.Buffer
   110  	enc := codec.NewEncoder(&buf, structs.MsgpackHandle)
   111  
   112  	err := tt.Serialize(enc)
   113  	if err != nil {
   114  		t.Fatalf("err: %v", err)
   115  	}
   116  
   117  	dec := codec.NewDecoder(&buf, structs.MsgpackHandle)
   118  
   119  	tt2 := NewTimeTable(time.Second, time.Minute)
   120  	err = tt2.Deserialize(dec)
   121  	if err != nil {
   122  		t.Fatalf("err: %v", err)
   123  	}
   124  
   125  	if !reflect.DeepEqual(tt.table, tt2.table) {
   126  		t.Fatalf("bad: %#v %#v", tt, tt2)
   127  	}
   128  }
   129  
   130  func TestTimeTable_Overflow(t *testing.T) {
   131  	t.Parallel()
   132  	tt := NewTimeTable(time.Second, 3*time.Second)
   133  
   134  	// Witness some data
   135  	start := time.Now()
   136  	plusOne := start.Add(time.Second)
   137  	plusTwo := start.Add(2 * time.Second)
   138  	plusThree := start.Add(3 * time.Second)
   139  
   140  	tt.Witness(10, start)
   141  	tt.Witness(20, plusOne)
   142  	tt.Witness(30, plusTwo)
   143  	tt.Witness(40, plusThree)
   144  
   145  	if len(tt.table) != 3 {
   146  		t.Fatalf("bad")
   147  	}
   148  
   149  	index := tt.NearestIndex(start)
   150  	if index != 0 {
   151  		t.Fatalf("bad: %v %v", index, 0)
   152  	}
   153  
   154  	when := tt.NearestTime(15)
   155  	if !when.IsZero() {
   156  		t.Fatalf("bad: %v", when)
   157  	}
   158  }