github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/fly/integration/table_duration_with_delta_test.go (about) 1 package integration_test 2 3 import ( 4 "fmt" 5 "strings" 6 "time" 7 8 "github.com/onsi/gomega" 9 ) 10 11 const TableDurationPrefix = "__table_duration__" 12 13 type TableDurationWithDelta struct { 14 Duration time.Duration 15 Delta time.Duration 16 Suffix string 17 } 18 19 func ParseTableDuration(data string) (TableDurationWithDelta, bool) { 20 if !strings.HasPrefix(data, TableDurationPrefix) { 21 return TableDurationWithDelta{}, false 22 } 23 24 parts := strings.Split(data, ":") 25 if len(parts) != 4 { 26 return TableDurationWithDelta{}, false 27 } 28 29 duration, _ := time.ParseDuration(parts[1]) 30 delta, _ := time.ParseDuration(parts[2]) 31 32 return TableDurationWithDelta{ 33 Duration: duration, 34 Delta: delta, 35 Suffix: parts[3], 36 }, true 37 } 38 39 func (d TableDurationWithDelta) String() string { 40 return fmt.Sprintf("%s:%s:%s:%s", TableDurationPrefix, d.Duration, d.Delta, d.Suffix) 41 } 42 43 func (d TableDurationWithDelta) MatchString(actual string) error { 44 if !strings.HasSuffix(actual, d.Suffix) { 45 return fmt.Errorf("expected %s to have suffix %s", actual, d.Suffix) 46 } 47 48 actualDuration, _ := time.ParseDuration(strings.TrimSuffix(actual, d.Suffix)) 49 matched, err := gomega.BeNumerically("~", d.Delta, d.Duration).Match(actualDuration) 50 if err != nil { 51 return err 52 } 53 54 if !matched { 55 return fmt.Errorf("expected duration %s is not within delta %s of actual duration %s", d.Duration, d.Delta, actualDuration) 56 } 57 58 return nil 59 }