github.com/grafana/pyroscope@v1.18.0/pkg/util/time_test.go (about) 1 package util 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/stretchr/testify/assert" 8 ) 9 10 func Test_SplitTimeRangeByResolution(t *testing.T) { 11 type testCase struct { 12 desc string 13 start time.Time 14 end time.Time 15 resolutions []time.Duration 16 expected []TimeRange 17 } 18 19 resolutions := []time.Duration{ 20 time.Hour, 21 time.Minute * 5, 22 } 23 24 testCases := []testCase{ 25 { 26 start: mustTime("15:04:59"), 27 end: mustTime("15:05:01"), 28 resolutions: resolutions, 29 expected: []TimeRange{ 30 {Start: mustTime("15:04:59"), End: mustTime("15:05:01"), Resolution: -1}, 31 }, 32 }, 33 { 34 start: mustTime("15:04:59"), 35 end: mustTime("15:09:59"), 36 resolutions: resolutions, 37 expected: []TimeRange{ 38 {Start: mustTime("15:04:59"), End: mustTime("15:09:59"), Resolution: -1}, 39 }, 40 }, 41 { 42 start: mustTime("15:05:00"), 43 end: mustTime("15:09:59"), 44 resolutions: resolutions, 45 expected: []TimeRange{ 46 {Start: mustTime("15:05:00"), End: mustTime("15:09:59"), Resolution: -1}, 47 }, 48 }, 49 50 { 51 start: mustTime("15:05:00"), 52 end: mustTime("15:10:00").Add(-time.Millisecond), 53 resolutions: resolutions, 54 expected: []TimeRange{ 55 {Start: mustTime("15:05:00"), End: mustTime("15:10:00").Add(-time.Millisecond), Resolution: time.Minute * 5}, 56 }, 57 }, 58 { 59 start: mustTime("15:05:00"), 60 end: mustTime("15:15:00").Add(-time.Millisecond), 61 resolutions: resolutions, 62 expected: []TimeRange{ 63 {Start: mustTime("15:05:00"), End: mustTime("15:15:00").Add(-time.Millisecond), Resolution: time.Minute * 5}, 64 }, 65 }, 66 67 { 68 start: mustTime("15:00:00"), 69 end: mustTime("16:00:00").Add(-time.Millisecond), 70 resolutions: resolutions, 71 expected: []TimeRange{ 72 {Start: mustTime("15:00:00"), End: mustTime("16:00:00").Add(-time.Millisecond), Resolution: time.Hour}, 73 }, 74 }, 75 { 76 start: mustTime("15:00:00"), 77 end: mustTime("19:00:00").Add(-time.Millisecond), 78 resolutions: resolutions, 79 expected: []TimeRange{ 80 {Start: mustTime("15:00:00"), End: mustTime("19:00:00").Add(-time.Millisecond), Resolution: time.Hour}, 81 }, 82 }, 83 84 { 85 start: mustTime("15:00:00"), 86 end: mustTime("16:05:00").Add(-time.Millisecond), 87 resolutions: resolutions, 88 expected: []TimeRange{ 89 {Start: mustTime("15:00:00"), End: mustTime("16:00:00").Add(-time.Millisecond), Resolution: time.Hour}, 90 {Start: mustTime("16:00:00"), End: mustTime("16:05:00").Add(-time.Millisecond), Resolution: time.Minute * 5}, 91 }, 92 }, 93 { 94 start: mustTime("14:00:00"), 95 end: mustTime("16:05:00").Add(-time.Millisecond), 96 resolutions: resolutions, 97 expected: []TimeRange{ 98 {Start: mustTime("14:00:00"), End: mustTime("16:00:00").Add(-time.Millisecond), Resolution: time.Hour}, 99 {Start: mustTime("16:00:00"), End: mustTime("16:05:00").Add(-time.Millisecond), Resolution: time.Minute * 5}, 100 }, 101 }, 102 { 103 start: mustTime("14:00:00"), 104 end: mustTime("16:10:00").Add(-time.Millisecond), 105 resolutions: resolutions, 106 expected: []TimeRange{ 107 {Start: mustTime("14:00:00"), End: mustTime("16:00:00").Add(-time.Millisecond), Resolution: time.Hour}, 108 {Start: mustTime("16:00:00"), End: mustTime("16:10:00").Add(-time.Millisecond), Resolution: time.Minute * 5}, 109 }, 110 }, 111 { 112 start: mustTime("15:00:00"), 113 end: mustTime("16:10:00").Add(-time.Millisecond), 114 resolutions: resolutions, 115 expected: []TimeRange{ 116 {Start: mustTime("15:00:00"), End: mustTime("16:00:00").Add(-time.Millisecond), Resolution: time.Hour}, 117 {Start: mustTime("16:00:00"), End: mustTime("16:10:00").Add(-time.Millisecond), Resolution: time.Minute * 5}, 118 }, 119 }, 120 121 { 122 start: mustTime("15:04:01"), 123 end: mustTime("20:09:59"), 124 resolutions: resolutions, 125 expected: []TimeRange{ 126 {Start: mustTime("15:04:01"), End: mustTime("15:05:00").Add(-time.Millisecond), Resolution: -1}, 127 {Start: mustTime("15:05:00"), End: mustTime("16:00:00").Add(-time.Millisecond), Resolution: time.Minute * 5}, 128 {Start: mustTime("16:00:00"), End: mustTime("20:00:00").Add(-time.Millisecond), Resolution: time.Hour}, 129 {Start: mustTime("20:00:00"), End: mustTime("20:05:00").Add(-time.Millisecond), Resolution: time.Minute * 5}, 130 {Start: mustTime("20:05:00"), End: mustTime("20:09:59"), Resolution: -1}, 131 }, 132 }, 133 { 134 start: mustTime("15:00:00"), 135 end: mustTime("20:09:59"), 136 resolutions: resolutions, 137 expected: []TimeRange{ 138 {Start: mustTime("15:00:00"), End: mustTime("20:00:00").Add(-time.Millisecond), Resolution: time.Hour}, 139 {Start: mustTime("20:00:00"), End: mustTime("20:05:00").Add(-time.Millisecond), Resolution: time.Minute * 5}, 140 {Start: mustTime("20:05:00"), End: mustTime("20:09:59"), Resolution: -1}, 141 }, 142 }, 143 { 144 start: mustTime("15:04:01"), 145 end: mustTime("20:00:00").Add(-time.Millisecond), 146 resolutions: resolutions, 147 expected: []TimeRange{ 148 {Start: mustTime("15:04:01"), End: mustTime("15:05:00").Add(-time.Millisecond), Resolution: -1}, 149 {Start: mustTime("15:05:00"), End: mustTime("16:00:00").Add(-time.Millisecond), Resolution: time.Minute * 5}, 150 {Start: mustTime("16:00:00"), End: mustTime("20:00:00").Add(-time.Millisecond), Resolution: time.Hour}, 151 }, 152 }, 153 { 154 start: mustDateTime("2006-01-01 15:04:01"), 155 end: mustDateTime("2006-01-03 20:09:59"), 156 resolutions: resolutions, 157 expected: []TimeRange{ 158 {Start: mustDateTime("2006-01-01 15:04:01"), End: mustDateTime("2006-01-01 15:05:00").Add(-time.Millisecond), Resolution: -1}, 159 {Start: mustDateTime("2006-01-01 15:05:00"), End: mustDateTime("2006-01-01 16:00:00").Add(-time.Millisecond), Resolution: time.Minute * 5}, 160 {Start: mustDateTime("2006-01-01 16:00:00"), End: mustDateTime("2006-01-03 20:00:00").Add(-time.Millisecond), Resolution: time.Hour}, 161 {Start: mustDateTime("2006-01-03 20:00:00"), End: mustDateTime("2006-01-03 20:05:00").Add(-time.Millisecond), Resolution: time.Minute * 5}, 162 {Start: mustDateTime("2006-01-03 20:05:00"), End: mustDateTime("2006-01-03 20:09:59"), Resolution: -1}, 163 }, 164 }, 165 } 166 167 for _, tc := range testCases { 168 tc := tc 169 t.Run(tc.desc, func(t *testing.T) { 170 actual := make([]TimeRange, 0, len(tc.expected)) 171 SplitTimeRangeByResolution(tc.start, tc.end, tc.resolutions, func(r TimeRange) { 172 actual = append(actual, r) 173 t.Log(r) 174 }) 175 assert.Equal(t, tc.expected, actual) 176 }) 177 } 178 } 179 180 func mustTime(s string) time.Time { 181 t, err := time.Parse(time.TimeOnly, s) 182 if err != nil { 183 panic(err) 184 } 185 return t.AddDate(1970, 1, 1) 186 } 187 188 func mustDateTime(s string) time.Time { 189 t, err := time.Parse(time.DateTime, s) 190 if err != nil { 191 panic(err) 192 } 193 return t 194 }