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  }