...

Source file src/github.com/launchdarkly/go-server-sdk-evaluation/v2/ldmodel/parse_time_test.go

Documentation: github.com/launchdarkly/go-server-sdk-evaluation/v2/ldmodel

     1  package ldmodel
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  )
    10  
    11  func TestParseRFC3339TimeUTC(t *testing.T) {
    12  	for _, test := range makeParseTimeTests() {
    13  		t.Run(fmt.Sprintf("input string: [%s], valid: %t", test.s, test.valid), func(t *testing.T) {
    14  			t1, ok := parseRFC3339TimeUTC(test.s)
    15  			t2, err := time.Parse(time.RFC3339Nano, test.s)
    16  			if test.valid {
    17  				if assert.True(t, ok, "parseRFC3339TimeUTC should have accepted this string") &&
    18  					assert.NoError(t, err, "time.Parse should have accepted this string") {
    19  					assert.Equal(t, t2.UTC(), t1)
    20  				}
    21  			} else {
    22  				if assert.False(t, ok, "parseRFC3339TimeUTC should have rejected this string") &&
    23  					assert.Error(t, err, "time.Parse should have rejected this string") {
    24  					assert.Equal(t, time.Time{}, t1)
    25  				}
    26  			}
    27  		})
    28  	}
    29  }
    30  
    31  type parseTimeTest struct {
    32  	s     string
    33  	valid bool
    34  }
    35  
    36  func makeParseTimeTests() []parseTimeTest {
    37  	var ret []parseTimeTest
    38  
    39  	addGood := func(s string) {
    40  		ret = append(ret, parseTimeTest{s, true})
    41  	}
    42  	addBad := func(s string) {
    43  		ret = append(ret, parseTimeTest{s, false})
    44  	}
    45  
    46  	for _, goodSuffix := range []string{
    47  		"Z", ".123Z", ".123456789Z", "+08:00", "-08:00", "+07:30", "+99:00",
    48  		// NONSTANDARD: time.Parse allows overly large hour offsets like "+99:00"
    49  	} {
    50  		addGood(fmt.Sprintf("2020-06-09T18:53:52%s", goodSuffix))
    51  	}
    52  
    53  	addGood("2020-06-09T1:53:52Z") // NONSTANDARD: time.Parse allows 1-digit hour
    54  
    55  	for _, badYear := range []string{"202", "20202", "202x", ""} {
    56  		addBad(fmt.Sprintf("%s-06-09T18:53:52Z", badYear))
    57  	}
    58  	for _, badMonth := range []string{"6", "006", "00", "13", "0x", ""} {
    59  		addBad(fmt.Sprintf("2020-%s-09T18:53:52Z", badMonth))
    60  	}
    61  	for _, badDay := range []string{"9", "009", "00", "32", "3x", ""} {
    62  		addBad(fmt.Sprintf("2020-06-%sT18:53:52Z", badDay))
    63  	}
    64  	for _, badHour := range []string{"018", "24", "1x", ""} {
    65  		addBad(fmt.Sprintf("2020-06-09T%s:53:52Z", badHour))
    66  	}
    67  	for _, badMinute := range []string{"5", "053", "60", "5x", ""} {
    68  		addBad(fmt.Sprintf("2020-06-09T18:%s:52Z", badMinute))
    69  	}
    70  	for _, badSecond := range []string{"5", "052", "61", "5x", ""} {
    71  		addBad(fmt.Sprintf("2020-06-09T18:53:%sZ", badSecond))
    72  	}
    73  	for _, badFraction := range []string{".123456789123456789Z", ".500x", "."} {
    74  		addBad(fmt.Sprintf("2020-06-09T18:53:52%sZ", badFraction))
    75  	}
    76  	for _, badTimeZone := range []string{
    77  		"/07:00", "-0:00", "-007:00", "-2x:00", "-:00", "-07:0", "07:000", "07:60", "07:0x", "07:",
    78  	} {
    79  		addBad(fmt.Sprintf("2020-06-09T18:53:52%s", badTimeZone))
    80  	}
    81  
    82  	// RFC3339 doesn't support non-ASCII characters - just make sure our parser rejects them gracefully
    83  	addBad("🤨2020-06-09T18:53:52Z")
    84  
    85  	return ret
    86  }
    87  
    88  var parseTimeTests = []parseTimeTest{
    89  	// bad fractional second
    90  	{"2020-06-09T18:53:52.500xZ", false}, // non-numeric
    91  	{"2020-06-09T18:53:52.Z", false},     // empty
    92  
    93  	// bad time zone
    94  	{"2020-06-09T18:53:52/07:00", false},  // invalid sign
    95  	{"2020-06-09T18:53:52-0:00", false},   // hour too short
    96  	{"2020-06-09T18:53:52-007:00", false}, // hour too long
    97  	{"2020-06-09T18:53:52-24:00", false},  // hour too high
    98  	{"2020-06-09T18:53:52-2x:00", false},  // hour non-numeric
    99  	{"2020-06-09T18:53:52-:00", false},    // hour too short
   100  }
   101  

View as plain text