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 }