github.com/go-graphite/carbonapi@v0.17.0/cmd/carbonapi/http/helper_test.go (about)

     1  package http
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/go-graphite/carbonapi/cmd/carbonapi/config"
    10  )
    11  
    12  func Test_timestampTruncate(t *testing.T) {
    13  	// reverse sorted
    14  	durations := []config.DurationTruncate{
    15  		{Duration: 30 * 24 * time.Hour, Truncate: 10 * time.Minute},
    16  		{Duration: time.Hour, Truncate: time.Minute},
    17  		{Duration: 10 * time.Minute, Truncate: 10 * time.Second},
    18  		{Duration: 0, Truncate: 2 * time.Second},
    19  	}
    20  
    21  	tests := []struct {
    22  		ts        int64
    23  		duration  time.Duration
    24  		durations []config.DurationTruncate
    25  		want      int64
    26  	}{
    27  		{
    28  			ts:        1628876563,
    29  			duration:  5 * time.Minute,
    30  			durations: durations,
    31  			want:      1628876562, // truncation to 2s
    32  		},
    33  		{
    34  			ts:        1628876563,
    35  			duration:  10 * time.Minute,
    36  			durations: durations,
    37  			want:      1628876562, // truncate to 2s
    38  		},
    39  		{
    40  			ts:        1628876563,
    41  			duration:  10*time.Minute + time.Second,
    42  			durations: durations,
    43  			want:      1628876560, // truncate to 10s
    44  		},
    45  		{
    46  			ts:        1628876563,
    47  			duration:  2 * time.Hour,
    48  			durations: durations,
    49  			want:      1628876520, // truncate to 1m
    50  		},
    51  		{
    52  			ts:        1628876563,
    53  			duration:  30 * 24 * time.Hour,
    54  			durations: durations,
    55  			want:      1628876520, // truncate to 1m
    56  		},
    57  		{
    58  			ts:        1628876563,
    59  			duration:  30*24*time.Hour + time.Second,
    60  			durations: durations,
    61  			want:      1628876400, // truncate to 10m
    62  		},
    63  	}
    64  	for _, tt := range tests {
    65  		t.Run(fmt.Sprintf("%d -> %d", tt.ts, tt.want), func(t *testing.T) {
    66  			if got := timestampTruncate(tt.ts, tt.duration, tt.durations); got != tt.want {
    67  				t.Errorf("timestampTruncate() = %v, want %v", got, tt.want)
    68  			}
    69  		})
    70  	}
    71  }
    72  
    73  func Test_queryLengthLimitExceeded(t *testing.T) {
    74  	tests := []struct {
    75  		query     []string
    76  		maxLength uint64
    77  		want      bool
    78  	}{
    79  		{
    80  			query:     []string{"a.b.c.d.e", "a.a.a.a.a.a.a.a.a.a.a.a"},
    81  			maxLength: 20,
    82  			want:      true,
    83  		},
    84  		{
    85  			query:     []string{"a.b.c", "a.b.d"},
    86  			maxLength: 10,
    87  			want:      false,
    88  		},
    89  		{
    90  			query:     []string{"a.b.c", "a.b.d"},
    91  			maxLength: 9,
    92  			want:      true,
    93  		},
    94  		{
    95  			query:     []string{"a.b.c.d.e", "a.a.a.a.a.a.a.a.a.a.a.a"},
    96  			maxLength: 0,
    97  			want:      false,
    98  		},
    99  		{
   100  			query:     []string{"a.b.b.c.*", "a.d.e", "a.b.c", "a.b.e", "a.a.a.b", "a.f.s.x.w.g"},
   101  			maxLength: 30,
   102  			want:      true,
   103  		},
   104  		{
   105  			query:     []string{"a.b.c.d.e", "a.b.c.d.f", "b.a.*"},
   106  			maxLength: 10000,
   107  			want:      false,
   108  		},
   109  		{
   110  			query:     []string{},
   111  			maxLength: 0,
   112  			want:      false,
   113  		},
   114  	}
   115  
   116  	for _, tt := range tests {
   117  		t.Run(fmt.Sprintf("queryLengthLimitExceeded([%s], %d) -> %t", strings.Join(tt.query, ", "), tt.maxLength, tt.want), func(t *testing.T) {
   118  			if got := queryLengthLimitExceeded(tt.query, tt.maxLength); got != tt.want {
   119  				t.Errorf("queryLengthLimitExceeded() = %t, want %t", got, tt.want)
   120  			}
   121  		})
   122  	}
   123  }