github.com/m3db/m3@v1.5.1-0.20231129193456-75a402aa583b/src/metrics/policy/retention_test.go (about)

     1  // Copyright (c) 2016 Uber Technologies, Inc.
     2  //
     3  // Permission is hereby granted, free of charge, to any person obtaining a copy
     4  // of this software and associated documentation files (the "Software"), to deal
     5  // in the Software without restriction, including without limitation the rights
     6  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     7  // copies of the Software, and to permit persons to whom the Software is
     8  // furnished to do so, subject to the following conditions:
     9  //
    10  // The above copyright notice and this permission notice shall be included in
    11  // all copies or substantial portions of the Software.
    12  //
    13  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    14  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    15  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    16  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    17  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    18  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    19  // THE SOFTWARE.
    20  
    21  package policy
    22  
    23  import (
    24  	"testing"
    25  	"time"
    26  
    27  	"github.com/stretchr/testify/require"
    28  )
    29  
    30  func TestValidRetentionValue(t *testing.T) {
    31  	inputs := []RetentionValue{
    32  		OneHour,
    33  		SixHours,
    34  		TwelveHours,
    35  		OneDay,
    36  		TwoDays,
    37  		SevenDays,
    38  		FourteenDays,
    39  		ThirtyDays,
    40  		FourtyFiveDays,
    41  	}
    42  	expected := []time.Duration{
    43  		time.Hour,
    44  		6 * time.Hour,
    45  		12 * time.Hour,
    46  		24 * time.Hour,
    47  		2 * 24 * time.Hour,
    48  		7 * 24 * time.Hour,
    49  		14 * 24 * time.Hour,
    50  		30 * 24 * time.Hour,
    51  		45 * 24 * time.Hour,
    52  	}
    53  	for i, value := range inputs {
    54  		retention, err := value.Retention()
    55  		require.NoError(t, err)
    56  		require.Equal(t, expected[i], retention.Duration())
    57  		require.Equal(t, Retention(expected[i]), retention)
    58  		require.True(t, value.IsValid())
    59  	}
    60  }
    61  
    62  func TestInvalidRetentionValue(t *testing.T) {
    63  	inputs := []RetentionValue{
    64  		UnknownRetentionValue,
    65  		RetentionValue(100),
    66  	}
    67  	for _, value := range inputs {
    68  		_, err := value.Retention()
    69  		require.Equal(t, errUnknownRetentionValue, err)
    70  		require.False(t, value.IsValid())
    71  	}
    72  }
    73  
    74  func TestValidRetention(t *testing.T) {
    75  	inputs := []Retention{
    76  		Retention(time.Hour),
    77  		Retention(6 * time.Hour),
    78  		Retention(12 * time.Hour),
    79  		Retention(24 * time.Hour),
    80  		Retention(2 * 24 * time.Hour),
    81  		Retention(7 * 24 * time.Hour),
    82  		Retention(14 * 24 * time.Hour),
    83  		Retention(30 * 24 * time.Hour),
    84  		Retention(45 * 24 * time.Hour),
    85  	}
    86  	expected := []RetentionValue{
    87  		OneHour,
    88  		SixHours,
    89  		TwelveHours,
    90  		OneDay,
    91  		TwoDays,
    92  		SevenDays,
    93  		FourteenDays,
    94  		ThirtyDays,
    95  		FourtyFiveDays,
    96  	}
    97  	for i, retention := range inputs {
    98  		value, err := ValueFromRetention(retention)
    99  		require.NoError(t, err)
   100  		require.Equal(t, expected[i], value)
   101  	}
   102  }
   103  
   104  func TestInvalidRetention(t *testing.T) {
   105  	inputs := []Retention{
   106  		Retention(time.Nanosecond),
   107  		Retention(37 * time.Hour),
   108  	}
   109  	for _, retention := range inputs {
   110  		_, err := ValueFromRetention(retention)
   111  		require.Equal(t, errUnknownRetention, err)
   112  	}
   113  }
   114  
   115  func TestParseRetention(t *testing.T) {
   116  	inputs := []struct {
   117  		str      string
   118  		expected Retention
   119  	}{
   120  		{
   121  			str:      "1s",
   122  			expected: Retention(time.Second),
   123  		},
   124  		{
   125  			str:      "10s",
   126  			expected: Retention(10 * time.Second),
   127  		},
   128  		{
   129  			str:      "1m",
   130  			expected: Retention(time.Minute),
   131  		},
   132  		{
   133  			str:      "10m",
   134  			expected: Retention(10 * time.Minute),
   135  		},
   136  		{
   137  			str:      "1h",
   138  			expected: Retention(time.Hour),
   139  		},
   140  		{
   141  			str:      "1d",
   142  			expected: Retention(24 * time.Hour),
   143  		},
   144  		{
   145  			str:      "7d",
   146  			expected: Retention(24 * 7 * time.Hour),
   147  		},
   148  		{
   149  			str:      "30d",
   150  			expected: Retention(24 * 30 * time.Hour),
   151  		},
   152  		{
   153  			str:      "24h0m0s",
   154  			expected: Retention(24 * time.Hour),
   155  		},
   156  	}
   157  
   158  	for _, input := range inputs {
   159  		res, err := ParseRetention(input.str)
   160  		require.NoError(t, err)
   161  		require.Equal(t, input.expected, res)
   162  	}
   163  }
   164  
   165  func TestParseRetentionError(t *testing.T) {
   166  	inputs := []string{
   167  		"4",
   168  		"",
   169  		"4minutes",
   170  		"4d3",
   171  		",3490",
   172  	}
   173  
   174  	for _, input := range inputs {
   175  		_, err := ParseRetention(input)
   176  		require.Error(t, err)
   177  	}
   178  }
   179  
   180  func TestRetentionString(t *testing.T) {
   181  	inputs := []struct {
   182  		retention Retention
   183  		expected  string
   184  	}{
   185  		{
   186  			retention: Retention(time.Second),
   187  			expected:  "1s",
   188  		},
   189  		{
   190  			retention: Retention(10 * time.Second),
   191  			expected:  "10s",
   192  		},
   193  		{
   194  			retention: Retention(time.Minute),
   195  			expected:  "1m",
   196  		},
   197  		{
   198  			retention: Retention(10 * time.Minute),
   199  			expected:  "10m",
   200  		},
   201  		{
   202  			retention: Retention(time.Hour),
   203  			expected:  "1h",
   204  		},
   205  		{
   206  			retention: Retention(24 * time.Hour),
   207  			expected:  "1d",
   208  		},
   209  		{
   210  			retention: Retention(24 * 7 * time.Hour),
   211  			expected:  "7d",
   212  		},
   213  		{
   214  			retention: Retention(24 * 30 * time.Hour),
   215  			expected:  "30d",
   216  		},
   217  	}
   218  
   219  	for _, input := range inputs {
   220  		require.Equal(t, input.expected, input.retention.String())
   221  	}
   222  }
   223  
   224  func TestRetentionRoundTrip(t *testing.T) {
   225  	inputs := []Retention{
   226  		Retention(time.Second),
   227  		Retention(10 * time.Second),
   228  		Retention(time.Minute),
   229  		Retention(10 * time.Minute),
   230  		Retention(time.Hour),
   231  		Retention(24 * time.Hour),
   232  		Retention(24 * 7 * time.Hour),
   233  		Retention(24 * 30 * time.Hour),
   234  		Retention(24 * 180 * time.Hour),
   235  	}
   236  
   237  	for _, input := range inputs {
   238  		str := input.String()
   239  		res, err := ParseRetention(str)
   240  		require.NoError(t, err)
   241  		require.Equal(t, input, res)
   242  	}
   243  }