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  }