testutils

package
v0.0.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 6, 2022 License: Apache-2.0 Imports: 16 Imported by: 0

Documentation

Overview

Package testutils contains testing helpers.

Index

Constants

View Source
const DefaultChanBufferSize = 1

DefaultChanBufferSize is the default buffer size of the underlying channel.

View Source
const DefaultHTTPRequestTimeout = 1 * time.Second

DefaultHTTPRequestTimeout is the default timeout value for the amount of time this client waits for a response to be pushed on RespChan before it fails the Do() call.

View Source
const TestSubConnsCount = 16

TestSubConnsCount is the number of TestSubConns initialized as part of package init.

Variables

View Source
var ErrTestConstPicker = fmt.Errorf("const picker error")

ErrTestConstPicker is error returned by test const picker.

View Source
var TestSubConns []*TestSubConn

TestSubConns contains a list of SubConns to be used in tests.

Functions

func IsRoundRobin

func IsRoundRobin(want []balancer.SubConn, f func() balancer.SubConn) error

IsRoundRobin checks whether f's return value is roundrobin of elements from want. But it doesn't check for the order. Note that want can contain duplicate items, which makes it weight-round-robin.

Step 1. the return values of f should form a permutation of all elements in want, but not necessary in the same order. E.g. if want is {a,a,b}, the check fails if f returns:

  • {a,a,a}: third a is returned before b
  • {a,b,b}: second b is returned before the second a

If error is found in this step, the returned error contains only the first iteration until where it goes wrong.

Step 2. the return values of f should be repetitions of the same permutation. E.g. if want is {a,a,b}, the check failes if f returns:

  • {a,b,a,b,a,a}: though it satisfies step 1, the second iteration is not repeating the first iteration.

If error is found in this step, the returned error contains the first iteration + the second iteration until where it goes wrong.

func LocalTCPListener

func LocalTCPListener() (net.Listener, error)

LocalTCPListener returns a net.Listener listening on local address and port.

func MarshalAny

func MarshalAny(m proto.Message) *anypb.Any

MarshalAny is a convenience function to marshal protobuf messages into any protos. It will panic if the marshaling fails.

func NewTestWRR

func NewTestWRR() wrr.WRR

NewTestWRR return a WRR for testing. It's deterministic instead of random.

func StatusErrEqual

func StatusErrEqual(err1, err2 error) bool

StatusErrEqual returns true iff both err1 and err2 wrap status.Status errors and their underlying status protos are equal.

Types

type Channel

type Channel struct {
	// contains filtered or unexported fields
}

Channel wraps a generic channel and provides a timed receive operation.

func NewChannel

func NewChannel() *Channel

NewChannel returns a new Channel.

func NewChannelWithSize

func NewChannelWithSize(bufSize int) *Channel

NewChannelWithSize returns a new Channel with a buffer of bufSize.

func (*Channel) Receive

func (c *Channel) Receive(ctx context.Context) (interface{}, error)

Receive returns the value received on the underlying channel, or the error returned by ctx if it is closed or cancelled.

func (*Channel) ReceiveOrFail

func (c *Channel) ReceiveOrFail() (interface{}, bool)

ReceiveOrFail returns the value on the underlying channel and true, or nil and false if the channel was empty.

func (*Channel) Replace

func (c *Channel) Replace(value interface{})

Replace clears the value on the underlying channel, and sends the new value.

It's expected to be used with a size-1 channel, to only keep the most up-to-date item. This method is inherently racy when invoked concurrently from multiple goroutines.

func (*Channel) Send

func (c *Channel) Send(value interface{})

Send sends value on the underlying channel.

func (*Channel) SendContext

func (c *Channel) SendContext(ctx context.Context, value interface{}) error

SendContext sends value on the underlying channel, or returns an error if the context expires.

func (*Channel) SendOrFail

func (c *Channel) SendOrFail(value interface{}) bool

SendOrFail attempts to send value on the underlying channel. Returns true if successful or false if the channel was full.

type FakeHTTPClient

type FakeHTTPClient struct {
	// ReqChan exposes the HTTP.Request made by the code under test.
	ReqChan *Channel
	// RespChan is a channel on which this fake client accepts responses to be
	// sent to the code under test.
	RespChan *Channel
	// Err, if set, is returned by Do().
	Err error
	// RecvTimeout is the amount of the time this client waits for a response to
	// be pushed on RespChan before it fails the Do() call. If this field is
	// left unspecified, DefaultHTTPRequestTimeout is used.
	RecvTimeout time.Duration
}

FakeHTTPClient helps mock out HTTP calls made by the code under test. It makes HTTP requests made by the code under test available through a channel, and makes it possible to inject various responses.

func (*FakeHTTPClient) Do

func (fc *FakeHTTPClient) Do(req *http.Request) (*http.Response, error)

Do pushes req on ReqChan and returns the response available on RespChan.

type PipeListener

type PipeListener struct {
	// contains filtered or unexported fields
}

PipeListener is a listener with an unbuffered pipe. Each write will complete only once the other side reads. It should only be created using NewPipeListener.

func NewPipeListener

func NewPipeListener() *PipeListener

NewPipeListener creates a new pipe listener.

func (*PipeListener) Accept

func (p *PipeListener) Accept() (net.Conn, error)

Accept accepts a connection.

func (*PipeListener) Addr

func (p *PipeListener) Addr() net.Addr

Addr returns a pipe addr.

func (*PipeListener) Close

func (p *PipeListener) Close() error

Close closes the listener.

func (*PipeListener) Dialer

func (p *PipeListener) Dialer() func(string, time.Duration) (net.Conn, error)

Dialer dials a connection.

type RestartableListener

type RestartableListener struct {
	// contains filtered or unexported fields
}

RestartableListener wraps a net.Listener and supports stopping and restarting the latter.

func NewRestartableListener

func NewRestartableListener(l net.Listener) *RestartableListener

NewRestartableListener returns a new RestartableListener wrapping l.

func (*RestartableListener) Accept

func (l *RestartableListener) Accept() (net.Conn, error)

Accept waits for and returns the next connection to the listener.

If the listener is currently not accepting new connections, because `Stop` was called on it, the connection is immediately closed after accepting without any bytes being sent on it.

func (*RestartableListener) Addr

func (l *RestartableListener) Addr() net.Addr

Addr returns the listener's network address.

func (*RestartableListener) Close

func (l *RestartableListener) Close() error

Close closes the listener.

func (*RestartableListener) Restart

func (l *RestartableListener) Restart()

Restart gets a previously stopped listener to start accepting connections.

func (*RestartableListener) Stop

func (l *RestartableListener) Stop()

Stop closes existing connections on the listener and prevents new connections from being accepted.

type TestClientConn

type TestClientConn struct {
	NewSubConnAddrsCh      chan []resolver.Address // the last 10 []Address to create subconn.
	NewSubConnCh           chan balancer.SubConn   // the last 10 subconn created.
	RemoveSubConnCh        chan balancer.SubConn   // the last 10 subconn removed.
	UpdateAddressesAddrsCh chan []resolver.Address // last updated address via UpdateAddresses().

	NewPickerCh  chan balancer.Picker            // the last picker updated.
	NewStateCh   chan connectivity.State         // the last state.
	ResolveNowCh chan resolver.ResolveNowOptions // the last ResolveNow().
	// contains filtered or unexported fields
}

TestClientConn is a mock balancer.ClientConn used in tests.

func NewTestClientConn

func NewTestClientConn(t *testing.T) *TestClientConn

NewTestClientConn creates a TestClientConn.

func (*TestClientConn) NewSubConn

NewSubConn creates a new SubConn.

func (*TestClientConn) RemoveSubConn

func (tcc *TestClientConn) RemoveSubConn(sc balancer.SubConn)

RemoveSubConn removes the SubConn.

func (*TestClientConn) ResolveNow

func (tcc *TestClientConn) ResolveNow(o resolver.ResolveNowOptions)

ResolveNow panics.

func (*TestClientConn) Target

func (tcc *TestClientConn) Target() string

Target panics.

func (*TestClientConn) UpdateAddresses

func (tcc *TestClientConn) UpdateAddresses(sc balancer.SubConn, addrs []resolver.Address)

UpdateAddresses updates the addresses on the SubConn.

func (*TestClientConn) UpdateState

func (tcc *TestClientConn) UpdateState(bs balancer.State)

UpdateState updates connectivity state and picker.

func (*TestClientConn) WaitForErrPicker

func (tcc *TestClientConn) WaitForErrPicker(ctx context.Context) error

WaitForErrPicker waits until an error picker is pushed to this ClientConn. Returns error if the provided context expires or a non-error picker is pushed to the ClientConn.

type TestConstPicker

type TestConstPicker struct {
	Err error
	SC  balancer.SubConn
}

TestConstPicker is a const picker for tests.

func (*TestConstPicker) Pick

Pick returns the const SubConn or the error.

type TestSubConn

type TestSubConn struct {
	ConnectCh chan struct{}
	// contains filtered or unexported fields
}

TestSubConn implements the SubConn interface, to be used in tests.

func (*TestSubConn) Connect

func (tsc *TestSubConn) Connect()

Connect is a no-op.

func (*TestSubConn) String

func (tsc *TestSubConn) String() string

String implements stringer to print human friendly error message.

func (*TestSubConn) UpdateAddresses

func (tsc *TestSubConn) UpdateAddresses([]resolver.Address)

UpdateAddresses is a no-op.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL