Merge pull request #21470 from hashicorp/vendor-go-mock
vendor: github.com/golang/mock@v1.3.1
This commit is contained in:
commit
f3fb3f8ccf
2
go.mod
2
go.mod
|
@ -30,7 +30,7 @@ require (
|
|||
github.com/go-test/deep v1.0.1
|
||||
github.com/gogo/protobuf v1.2.0 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7 // indirect
|
||||
github.com/golang/mock v1.2.0
|
||||
github.com/golang/mock v1.3.1
|
||||
github.com/golang/protobuf v1.3.0
|
||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db // indirect
|
||||
github.com/google/go-cmp v0.2.0
|
||||
|
|
4
go.sum
4
go.sum
|
@ -117,6 +117,8 @@ github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200j
|
|||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk=
|
||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s=
|
||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||
github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
|
@ -442,6 +444,7 @@ golang.org/x/net v0.0.0-20181129055619-fae4c4e3ad76/go.mod h1:mL1N/T3taQHkDXs73r
|
|||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd h1:HuTn7WObtcDo9uEEU7rEqL0jYthdXAmZ6PP+meazmaU=
|
||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190502183928-7f726cade0ab h1:9RfW3ktsOZxgo9YNbBAjq1FWzc/igwEcUzZz8IXgSbk=
|
||||
golang.org/x/net v0.0.0-20190502183928-7f726cade0ab/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
|
@ -488,6 +491,7 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb
|
|||
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||
google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||
google.golang.org/api v0.1.0 h1:K6z2u68e86TPdSdefXdzvXgR1zEMa+459vBSfWYAZkI=
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// GoMock - a mock framework for Go.
|
||||
// Package gomock is a mock framework for Go.
|
||||
//
|
||||
// Standard usage:
|
||||
// (1) Define an interface that you wish to mock.
|
||||
|
@ -63,8 +63,8 @@ import (
|
|||
"sync"
|
||||
)
|
||||
|
||||
// A TestReporter is something that can be used to report test failures.
|
||||
// It is satisfied by the standard library's *testing.T.
|
||||
// A TestReporter is something that can be used to report test failures. It
|
||||
// is satisfied by the standard library's *testing.T.
|
||||
type TestReporter interface {
|
||||
Errorf(format string, args ...interface{})
|
||||
Fatalf(format string, args ...interface{})
|
||||
|
@ -77,14 +77,35 @@ type TestHelper interface {
|
|||
Helper()
|
||||
}
|
||||
|
||||
// A Controller represents the top-level control of a mock ecosystem.
|
||||
// It defines the scope and lifetime of mock objects, as well as their expectations.
|
||||
// It is safe to call Controller's methods from multiple goroutines.
|
||||
// A Controller represents the top-level control of a mock ecosystem. It
|
||||
// defines the scope and lifetime of mock objects, as well as their
|
||||
// expectations. It is safe to call Controller's methods from multiple
|
||||
// goroutines. Each test should create a new Controller and invoke Finish via
|
||||
// defer.
|
||||
//
|
||||
// func TestFoo(t *testing.T) {
|
||||
// ctrl := gomock.NewController(st)
|
||||
// defer ctrl.Finish()
|
||||
// // ..
|
||||
// }
|
||||
//
|
||||
// func TestBar(t *testing.T) {
|
||||
// t.Run("Sub-Test-1", st) {
|
||||
// ctrl := gomock.NewController(st)
|
||||
// defer ctrl.Finish()
|
||||
// // ..
|
||||
// })
|
||||
// t.Run("Sub-Test-2", st) {
|
||||
// ctrl := gomock.NewController(st)
|
||||
// defer ctrl.Finish()
|
||||
// // ..
|
||||
// })
|
||||
// })
|
||||
type Controller struct {
|
||||
// T should only be called within a generated mock. It is not intended to
|
||||
// be used in user code and may be changed in future versions. T is the
|
||||
// TestReporter passed in when creating the Controller via NewController.
|
||||
// If the TestReporter does not implment a TestHelper it will be wrapped
|
||||
// If the TestReporter does not implement a TestHelper it will be wrapped
|
||||
// with a nopTestHelper.
|
||||
T TestHelper
|
||||
mu sync.Mutex
|
||||
|
@ -92,6 +113,8 @@ type Controller struct {
|
|||
finished bool
|
||||
}
|
||||
|
||||
// NewController returns a new Controller. It is the preferred way to create a
|
||||
// Controller.
|
||||
func NewController(t TestReporter) *Controller {
|
||||
h, ok := t.(TestHelper)
|
||||
if !ok {
|
||||
|
@ -135,6 +158,7 @@ type nopTestHelper struct {
|
|||
|
||||
func (h nopTestHelper) Helper() {}
|
||||
|
||||
// RecordCall is called by a mock. It should not be called by user code.
|
||||
func (ctrl *Controller) RecordCall(receiver interface{}, method string, args ...interface{}) *Call {
|
||||
ctrl.T.Helper()
|
||||
|
||||
|
@ -148,6 +172,7 @@ func (ctrl *Controller) RecordCall(receiver interface{}, method string, args ...
|
|||
panic("unreachable")
|
||||
}
|
||||
|
||||
// RecordCallWithMethodType is called by a mock. It should not be called by user code.
|
||||
func (ctrl *Controller) RecordCallWithMethodType(receiver interface{}, method string, methodType reflect.Type, args ...interface{}) *Call {
|
||||
ctrl.T.Helper()
|
||||
|
||||
|
@ -160,6 +185,7 @@ func (ctrl *Controller) RecordCallWithMethodType(receiver interface{}, method st
|
|||
return call
|
||||
}
|
||||
|
||||
// Call is called by a mock. It should not be called by user code.
|
||||
func (ctrl *Controller) Call(receiver interface{}, method string, args ...interface{}) []interface{} {
|
||||
ctrl.T.Helper()
|
||||
|
||||
|
@ -200,6 +226,9 @@ func (ctrl *Controller) Call(receiver interface{}, method string, args ...interf
|
|||
return rets
|
||||
}
|
||||
|
||||
// Finish checks to see if all the methods that were expected to be called
|
||||
// were called. It should be invoked for each Controller. It is not idempotent
|
||||
// and therefore can only be invoked once.
|
||||
func (ctrl *Controller) Finish() {
|
||||
ctrl.T.Helper()
|
||||
|
||||
|
|
|
@ -98,9 +98,30 @@ func (m assignableToTypeOfMatcher) String() string {
|
|||
}
|
||||
|
||||
// Constructors
|
||||
// Any returns a matcher that always matches.
|
||||
func Any() Matcher { return anyMatcher{} }
|
||||
|
||||
// Eq returns a matcher that matches on equality.
|
||||
//
|
||||
// Example usage:
|
||||
// Eq(5).Matches(5) // returns true
|
||||
// Eq(5).Matches(4) // returns false
|
||||
func Eq(x interface{}) Matcher { return eqMatcher{x} }
|
||||
|
||||
// Nil returns a matcher that matches if the received value is nil.
|
||||
//
|
||||
// Example usage:
|
||||
// var x *bytes.Buffer
|
||||
// Nil().Matches(x) // returns true
|
||||
// x = &bytes.Buffer{}
|
||||
// Nil().Matches(x) // returns false
|
||||
func Nil() Matcher { return nilMatcher{} }
|
||||
|
||||
// Not reverses the results of its given child matcher.
|
||||
//
|
||||
// Example usage:
|
||||
// Not(Eq(5)).Matches(4) // returns true
|
||||
// Not(Eq(5)).Matches(5) // returns false
|
||||
func Not(x interface{}) Matcher {
|
||||
if m, ok := x.(Matcher); ok {
|
||||
return notMatcher{m}
|
||||
|
@ -112,11 +133,9 @@ func Not(x interface{}) Matcher {
|
|||
// function is assignable to the type of the parameter to this function.
|
||||
//
|
||||
// Example usage:
|
||||
//
|
||||
// dbMock.EXPECT().
|
||||
// Insert(gomock.AssignableToTypeOf(&EmployeeRecord{})).
|
||||
// Return(errors.New("DB error"))
|
||||
//
|
||||
// var s fmt.Stringer = &bytes.Buffer{}
|
||||
// AssignableToTypeOf(s).Matches(time.Second) // returns true
|
||||
// AssignableToTypeOf(s).Matches(99) // returns false
|
||||
func AssignableToTypeOf(x interface{}) Matcher {
|
||||
return assignableToTypeOfMatcher{reflect.TypeOf(x)}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,233 @@
|
|||
package stdlib
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
resyntax "regexp/syntax"
|
||||
|
||||
"github.com/zclconf/go-cty/cty"
|
||||
"github.com/zclconf/go-cty/cty/function"
|
||||
)
|
||||
|
||||
var RegexFunc = function.New(&function.Spec{
|
||||
Params: []function.Parameter{
|
||||
{
|
||||
Name: "pattern",
|
||||
Type: cty.String,
|
||||
},
|
||||
{
|
||||
Name: "string",
|
||||
Type: cty.String,
|
||||
},
|
||||
},
|
||||
Type: func(args []cty.Value) (cty.Type, error) {
|
||||
if !args[0].IsKnown() {
|
||||
// We can't predict our type without seeing our pattern
|
||||
return cty.DynamicPseudoType, nil
|
||||
}
|
||||
|
||||
retTy, err := regexPatternResultType(args[0].AsString())
|
||||
if err != nil {
|
||||
err = function.NewArgError(0, err)
|
||||
}
|
||||
return retTy, err
|
||||
},
|
||||
Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) {
|
||||
if retType == cty.DynamicPseudoType {
|
||||
return cty.DynamicVal, nil
|
||||
}
|
||||
|
||||
re, err := regexp.Compile(args[0].AsString())
|
||||
if err != nil {
|
||||
// Should never happen, since we checked this in the Type function above.
|
||||
return cty.NilVal, function.NewArgErrorf(0, "error parsing pattern: %s", err)
|
||||
}
|
||||
str := args[1].AsString()
|
||||
|
||||
captureIdxs := re.FindStringSubmatchIndex(str)
|
||||
if captureIdxs == nil {
|
||||
return cty.NilVal, fmt.Errorf("pattern did not match any part of the given string")
|
||||
}
|
||||
|
||||
return regexPatternResult(re, str, captureIdxs, retType), nil
|
||||
},
|
||||
})
|
||||
|
||||
var RegexAllFunc = function.New(&function.Spec{
|
||||
Params: []function.Parameter{
|
||||
{
|
||||
Name: "pattern",
|
||||
Type: cty.String,
|
||||
},
|
||||
{
|
||||
Name: "string",
|
||||
Type: cty.String,
|
||||
},
|
||||
},
|
||||
Type: func(args []cty.Value) (cty.Type, error) {
|
||||
if !args[0].IsKnown() {
|
||||
// We can't predict our type without seeing our pattern,
|
||||
// but we do know it'll always be a list of something.
|
||||
return cty.List(cty.DynamicPseudoType), nil
|
||||
}
|
||||
|
||||
retTy, err := regexPatternResultType(args[0].AsString())
|
||||
if err != nil {
|
||||
err = function.NewArgError(0, err)
|
||||
}
|
||||
return cty.List(retTy), err
|
||||
},
|
||||
Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) {
|
||||
ety := retType.ElementType()
|
||||
if ety == cty.DynamicPseudoType {
|
||||
return cty.DynamicVal, nil
|
||||
}
|
||||
|
||||
re, err := regexp.Compile(args[0].AsString())
|
||||
if err != nil {
|
||||
// Should never happen, since we checked this in the Type function above.
|
||||
return cty.NilVal, function.NewArgErrorf(0, "error parsing pattern: %s", err)
|
||||
}
|
||||
str := args[1].AsString()
|
||||
|
||||
captureIdxsEach := re.FindAllStringSubmatchIndex(str, -1)
|
||||
if len(captureIdxsEach) == 0 {
|
||||
return cty.ListValEmpty(ety), nil
|
||||
}
|
||||
|
||||
elems := make([]cty.Value, len(captureIdxsEach))
|
||||
for i, captureIdxs := range captureIdxsEach {
|
||||
elems[i] = regexPatternResult(re, str, captureIdxs, ety)
|
||||
}
|
||||
return cty.ListVal(elems), nil
|
||||
},
|
||||
})
|
||||
|
||||
// Regex is a function that extracts one or more substrings from a given
|
||||
// string by applying a regular expression pattern, describing the first
|
||||
// match.
|
||||
//
|
||||
// The return type depends on the composition of the capture groups (if any)
|
||||
// in the pattern:
|
||||
//
|
||||
// - If there are no capture groups at all, the result is a single string
|
||||
// representing the entire matched pattern.
|
||||
// - If all of the capture groups are named, the result is an object whose
|
||||
// keys are the named groups and whose values are their sub-matches, or
|
||||
// null if a particular sub-group was inside another group that didn't
|
||||
// match.
|
||||
// - If none of the capture groups are named, the result is a tuple whose
|
||||
// elements are the sub-groups in order and whose values are their
|
||||
// sub-matches, or null if a particular sub-group was inside another group
|
||||
// that didn't match.
|
||||
// - It is invalid to use both named and un-named capture groups together in
|
||||
// the same pattern.
|
||||
//
|
||||
// If the pattern doesn't match, this function returns an error. To test for
|
||||
// a match, call RegexAll and check if the length of the result is greater
|
||||
// than zero.
|
||||
func Regex(pattern, str cty.Value) (cty.Value, error) {
|
||||
return RegexFunc.Call([]cty.Value{pattern, str})
|
||||
}
|
||||
|
||||
// RegexAll is similar to Regex but it finds all of the non-overlapping matches
|
||||
// in the given string and returns a list of them.
|
||||
//
|
||||
// The result type is always a list, whose element type is deduced from the
|
||||
// pattern in the same way as the return type for Regex is decided.
|
||||
//
|
||||
// If the pattern doesn't match at all, this function returns an empty list.
|
||||
func RegexAll(pattern, str cty.Value) (cty.Value, error) {
|
||||
return RegexAllFunc.Call([]cty.Value{pattern, str})
|
||||
}
|
||||
|
||||
// regexPatternResultType parses the given regular expression pattern and
|
||||
// returns the structural type that would be returned to represent its
|
||||
// capture groups.
|
||||
//
|
||||
// Returns an error if parsing fails or if the pattern uses a mixture of
|
||||
// named and unnamed capture groups, which is not permitted.
|
||||
func regexPatternResultType(pattern string) (cty.Type, error) {
|
||||
re, rawErr := regexp.Compile(pattern)
|
||||
switch err := rawErr.(type) {
|
||||
case *resyntax.Error:
|
||||
return cty.NilType, fmt.Errorf("invalid regexp pattern: %s in %s", err.Code, err.Expr)
|
||||
case error:
|
||||
// Should never happen, since all regexp compile errors should
|
||||
// be resyntax.Error, but just in case...
|
||||
return cty.NilType, fmt.Errorf("error parsing pattern: %s", err)
|
||||
}
|
||||
|
||||
allNames := re.SubexpNames()[1:]
|
||||
var names []string
|
||||
unnamed := 0
|
||||
for _, name := range allNames {
|
||||
if name == "" {
|
||||
unnamed++
|
||||
} else {
|
||||
if names == nil {
|
||||
names = make([]string, 0, len(allNames))
|
||||
}
|
||||
names = append(names, name)
|
||||
}
|
||||
}
|
||||
switch {
|
||||
case unnamed == 0 && len(names) == 0:
|
||||
// If there are no capture groups at all then we'll return just a
|
||||
// single string for the whole match.
|
||||
return cty.String, nil
|
||||
case unnamed > 0 && len(names) > 0:
|
||||
return cty.NilType, fmt.Errorf("invalid regexp pattern: cannot mix both named and unnamed capture groups")
|
||||
case unnamed > 0:
|
||||
// For unnamed captures, we return a tuple of them all in order.
|
||||
etys := make([]cty.Type, unnamed)
|
||||
for i := range etys {
|
||||
etys[i] = cty.String
|
||||
}
|
||||
return cty.Tuple(etys), nil
|
||||
default:
|
||||
// For named captures, we return an object using the capture names
|
||||
// as keys.
|
||||
atys := make(map[string]cty.Type, len(names))
|
||||
for _, name := range names {
|
||||
atys[name] = cty.String
|
||||
}
|
||||
return cty.Object(atys), nil
|
||||
}
|
||||
}
|
||||
|
||||
func regexPatternResult(re *regexp.Regexp, str string, captureIdxs []int, retType cty.Type) cty.Value {
|
||||
switch {
|
||||
case retType == cty.String:
|
||||
start, end := captureIdxs[0], captureIdxs[1]
|
||||
return cty.StringVal(str[start:end])
|
||||
case retType.IsTupleType():
|
||||
captureIdxs = captureIdxs[2:] // index 0 is the whole pattern span, which we ignore by skipping one pair
|
||||
vals := make([]cty.Value, len(captureIdxs)/2)
|
||||
for i := range vals {
|
||||
start, end := captureIdxs[i*2], captureIdxs[i*2+1]
|
||||
if start < 0 || end < 0 {
|
||||
vals[i] = cty.NullVal(cty.String) // Did not match anything because containing group didn't match
|
||||
continue
|
||||
}
|
||||
vals[i] = cty.StringVal(str[start:end])
|
||||
}
|
||||
return cty.TupleVal(vals)
|
||||
case retType.IsObjectType():
|
||||
captureIdxs = captureIdxs[2:] // index 0 is the whole pattern span, which we ignore by skipping one pair
|
||||
vals := make(map[string]cty.Value, len(captureIdxs)/2)
|
||||
names := re.SubexpNames()[1:]
|
||||
for i, name := range names {
|
||||
start, end := captureIdxs[i*2], captureIdxs[i*2+1]
|
||||
if start < 0 || end < 0 {
|
||||
vals[name] = cty.NullVal(cty.String) // Did not match anything because containing group didn't match
|
||||
continue
|
||||
}
|
||||
vals[name] = cty.StringVal(str[start:end])
|
||||
}
|
||||
return cty.ObjectVal(vals)
|
||||
default:
|
||||
// Should never happen
|
||||
panic(fmt.Sprintf("invalid return type %#v", retType))
|
||||
}
|
||||
}
|
|
@ -144,7 +144,7 @@ github.com/go-test/deep
|
|||
github.com/gogo/protobuf/gogoproto
|
||||
github.com/gogo/protobuf/proto
|
||||
github.com/gogo/protobuf/protoc-gen-gogo/descriptor
|
||||
# github.com/golang/mock v1.2.0
|
||||
# github.com/golang/mock v1.3.1
|
||||
github.com/golang/mock/gomock
|
||||
# github.com/golang/protobuf v1.3.0
|
||||
github.com/golang/protobuf/proto
|
||||
|
|
Loading…
Reference in New Issue