test_helpers

package
v2.2.0 Latest Latest
Warning

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

Go to latest
Published: Dec 16, 2024 License: BSD-2-Clause Imports: 19 Imported by: 2

Documentation

Overview

Helpers for managing Tarantool process for testing purposes.

Package introduces go helpers for starting a tarantool process and validating Tarantool version. Helpers are based on os/exec calls. Retries to connect test tarantool instance handled explicitly, see tarantool/go-tarantool/#136.

Tarantool's instance Lua scripts use environment variables to configure box.cfg. Listen port is set in the end of script so it is possible to connect only if every other thing was set up already.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func CheckEqualBoxErrors

func CheckEqualBoxErrors(t *testing.T, expected tarantool.BoxError, actual tarantool.BoxError)

CheckEqualBoxErrors checks equivalence of tarantool.BoxError objects.

Tarantool errors are not comparable by nature:

tarantool> msgpack.decode(mp_error_repr) == msgpack.decode(mp_error_repr) --- - false ...

Tarantool error file and line could differ even between different patches.

So we check equivalence of all attributes except for Line and File. For Line and File, we check that they are filled with some non-default values (lines are counted starting with 1 and empty file path is not expected too).

func CheckPoolStatuses

func CheckPoolStatuses(args interface{}) error

func ConnectWithValidation

func ConnectWithValidation(t testing.TB,
	dialer tarantool.Dialer,
	opts tarantool.Opts) *tarantool.Connection

ConnectWithValidation tries to connect to a Tarantool instance. It returns a valid connection if it is successful, otherwise finishes a test with an error.

func ConvertUint64

func ConvertUint64(v interface{}) (result uint64, err error)

msgpack.v5 decodes different uint types depending on value. The function helps to unify a result.

func DeleteRecordByKey

func DeleteRecordByKey(t *testing.T, conn tarantool.Connector,
	space interface{}, index interface{}, key []interface{})

func GetConnectContext

func GetConnectContext() (context.Context, context.CancelFunc)

func GetPoolConnectContext

func GetPoolConnectContext() (context.Context, context.CancelFunc)

func InsertOnInstance

func InsertOnInstance(ctx context.Context, dialer tarantool.Dialer, connOpts tarantool.Opts,
	space interface{}, tuple interface{}) error

func InsertOnInstances

func InsertOnInstances(
	dialers []tarantool.Dialer,
	connOpts tarantool.Opts,
	space interface{},
	tuple interface{}) error

func IsTarantoolVersionLess

func IsTarantoolVersionLess(majorMin uint64, minorMin uint64, patchMin uint64) (bool, error)

IsTarantoolVersionLess checks if tarantool version is less than passed <major.minor.patch>. Returns error if failed to extract version.

func ProcessListenOnInstance

func ProcessListenOnInstance(args interface{}) error

ProcessListenOnInstance helper calls "return box.cfg.listen" as many times as there are servers in the connection pool with specified mode. For RO mode expected received ports equals to replica ports. For RW mode expected received ports equals to master ports. For PreferRO mode expected received ports equals to replica ports or to all ports. For PreferRW mode expected received ports equals to master ports or to all ports.

func RestartTarantool

func RestartTarantool(inst *TarantoolInstance) error

RestartTarantool restarts a tarantool instance for tests with specifies parameters (refer to StartOpts) which were specified in inst parameter. inst is a tarantool instance that was started by StartTarantool. Rewrites inst.Cmd.Process to stop instance with StopTarantool. Process must be stopped with StopTarantool.

func Retry

func Retry(f func(interface{}) error, args interface{}, count int, timeout time.Duration) error

func SetClusterRO

func SetClusterRO(dialers []tarantool.Dialer, connOpts tarantool.Opts,
	roles []bool) error

func SetInstanceRO

func SetInstanceRO(ctx context.Context, dialer tarantool.Dialer, connOpts tarantool.Opts,
	isReplica bool) error

func SkipIfCrudSpliceBroken

func SkipIfCrudSpliceBroken(t *testing.T)

SkipIfCrudSpliceBroken skips test run if splice operation is broken on the crud side. https://github.com/tarantool/crud/issues/397

func SkipIfErrorExtendedInfoUnsupported

func SkipIfErrorExtendedInfoUnsupported(t *testing.T)

SkipIfErrorExtendedInfoUnsupported skips test run if Tarantool without IPROTO_ERROR (0x52) support is used.

func SkipIfErrorMessagePackTypeUnsupported

func SkipIfErrorMessagePackTypeUnsupported(t *testing.T)

SkipIfErrorMessagePackTypeUnsupported skips test run if Tarantool without MP_ERROR type over iproto support is used.

func SkipIfFeatureDropped

func SkipIfFeatureDropped(t *testing.T, feature string, major, minor, patch uint64)

SkipIfFeatureDropped skips test run if Tarantool had dropped support of a feature.

func SkipIfFeatureSupported

func SkipIfFeatureSupported(t *testing.T, feature string, major, minor, patch uint64)

SkipIfFeatureSupported skips test run if Tarantool supports a feature. Helper if useful when we want to test if everything is alright on older versions.

func SkipIfFeatureUnsupported

func SkipIfFeatureUnsupported(t *testing.T, feature string, major, minor, patch uint64)

SkipIfFeatureUnsupported skips test run if Tarantool does not yet support a feature.

func SkipIfGreaterOrEqual

func SkipIfGreaterOrEqual(t *testing.T, reason string, major, minor, patch uint64)

SkipIfGreaterOrEqual skips test run if Tarantool version is greater or equal than expected.

func SkipIfIdSupported

func SkipIfIdSupported(t *testing.T)

SkipIfIdSupported skips test run if Tarantool with IPROTO_ID support is used. Skip is useful for tests validating that protocol info is processed as expected even for pre-IPROTO_ID instances.

func SkipIfIdUnsupported

func SkipIfIdUnsupported(t *testing.T)

SkipIfIdUnsupported skips test run if Tarantool without IPROTO_ID support is used.

func SkipIfLess

func SkipIfLess(t *testing.T, reason string, major, minor, patch uint64)

SkipIfLess skips test run if Tarantool version is less than expected.

func SkipIfPaginationUnsupported

func SkipIfPaginationUnsupported(t *testing.T)

SkipIfPaginationUnsupported skips test run if Tarantool without pagination is used.

func SkipIfSQLUnsupported

func SkipIfSQLUnsupported(t testing.TB)

func SkipIfStreamsUnsupported

func SkipIfStreamsUnsupported(t *testing.T)

SkipOfStreamsUnsupported skips test run if Tarantool without streams support is used.

func SkipIfWatchOnceSupported added in v2.1.0

func SkipIfWatchOnceSupported(t *testing.T)

SkipIfWatchOnceSupported skips test run if Tarantool with WatchOnce request type is used.

func SkipIfWatchOnceUnsupported

func SkipIfWatchOnceUnsupported(t *testing.T)

SkipIfWatchOnceUnsupported skips test run if Tarantool without WatchOnce request type is used.

func SkipIfWatchersSupported

func SkipIfWatchersSupported(t *testing.T)

SkipIfWatchersSupported skips test run if Tarantool with watchers support is used.

func SkipIfWatchersUnsupported

func SkipIfWatchersUnsupported(t *testing.T)

SkipOfStreamsUnsupported skips test run if Tarantool without watchers support is used.

func StopTarantool

func StopTarantool(inst TarantoolInstance)

StopTarantool stops a tarantool instance started with StartTarantool. Waits until any resources associated with the process is released. If something went wrong, fails.

func StopTarantoolInstances

func StopTarantoolInstances(instances []TarantoolInstance)

func StopTarantoolWithCleanup

func StopTarantoolWithCleanup(inst TarantoolInstance)

StopTarantoolWithCleanup stops a tarantool instance started with StartTarantool. Waits until any resources associated with the process is released. Cleans work directory after stop. If something went wrong, fails.

func WaitUntilReconnected

func WaitUntilReconnected(conn *tarantool.Connection, retries uint, timeout time.Duration) bool

WaitUntilReconnected waits until connection is reestablished. Returns false in case of connection is not in the connected state after specified retries count, true otherwise.

Types

type CheckStatusesArgs

type CheckStatusesArgs struct {
	ConnPool           *pool.ConnectionPool
	Servers            []string
	Mode               pool.Mode
	ExpectedPoolStatus bool
	ExpectedStatuses   map[string]bool
}

type ListenOnInstanceArgs

type ListenOnInstanceArgs struct {
	ConnPool      *pool.ConnectionPool
	Mode          pool.Mode
	ServersNumber int
	ExpectedPorts map[string]bool
}

type MockDoer

type MockDoer struct {
	// Requests is a slice of received requests.
	// It could be used to compare incoming requests with expected.
	Requests []tarantool.Request
	// contains filtered or unexported fields
}

MockDoer is an implementation of the Doer interface used for testing purposes.

func NewMockDoer

func NewMockDoer(t *testing.T, responses ...interface{}) MockDoer

NewMockDoer creates a MockDoer by given responses. Each response could be one of two types: MockResponse or error.

func (*MockDoer) Do

func (doer *MockDoer) Do(req tarantool.Request) *tarantool.Future

Do returns a future with the current response or an error. It saves the current request into MockDoer.Requests.

type MockRequest

type MockRequest struct {
}

MockRequest is an empty mock request used for testing purposes.

func NewMockRequest

func NewMockRequest() *MockRequest

NewMockRequest creates an empty MockRequest.

func (*MockRequest) Async

func (req *MockRequest) Async() bool

Async returns if MockRequest expects a response.

func (*MockRequest) Body

func (req *MockRequest) Body(resolver tarantool.SchemaResolver, enc *msgpack.Encoder) error

Body fills an msgpack.Encoder with the watch request body.

func (*MockRequest) Conn

func (req *MockRequest) Conn() *tarantool.Connection

Conn returns the Connection object the request belongs to.

func (*MockRequest) Ctx

func (req *MockRequest) Ctx() context.Context

Ctx returns a context of the MockRequest.

func (*MockRequest) Response

func (req *MockRequest) Response(header tarantool.Header,
	body io.Reader) (tarantool.Response, error)

Response creates a response for the MockRequest.

func (*MockRequest) Type

func (req *MockRequest) Type() iproto.Type

Type returns an iproto type for MockRequest.

type MockResponse

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

MockResponse is a mock response used for testing purposes.

func CreateMockResponse

func CreateMockResponse(header tarantool.Header, body io.Reader) (*MockResponse, error)

CreateMockResponse creates a MockResponse from the header and a data, packed inside an io.Reader.

func NewMockResponse

func NewMockResponse(t *testing.T, body interface{}) *MockResponse

NewMockResponse creates a new MockResponse with an empty header and the given data. body should be passed as a structure to be encoded. The encoded body is served as response data and will be decoded once the response is decoded.

func (*MockResponse) Decode

func (resp *MockResponse) Decode() ([]interface{}, error)

Decode returns the result of decoding the response data as slice.

func (*MockResponse) DecodeTyped

func (resp *MockResponse) DecodeTyped(res interface{}) error

DecodeTyped returns the result of decoding the response data.

func (*MockResponse) Header

func (resp *MockResponse) Header() tarantool.Header

Header returns a header for the MockResponse.

type StartOpts

type StartOpts struct {
	// Auth is an authentication method for a Tarantool instance.
	Auth tarantool.Auth

	// InitScript is a Lua script for tarantool to run on start.
	InitScript string

	// Listen is box.cfg listen parameter for tarantool.
	// Use this address to connect to tarantool after configuration.
	// https://www.tarantool.io/en/doc/latest/reference/configuration/#cfg-basic-listen
	Listen string

	// WorkDir is box.cfg work_dir parameter for a Tarantool instance:
	// a folder to store data files. If not specified, helpers create a
	// new temporary directory.
	// Folder must be unique for each Tarantool process used simultaneously.
	// https://www.tarantool.io/en/doc/latest/reference/configuration/#confval-work_dir
	WorkDir string

	// SslCertsDir is a path to a directory with SSL certificates. It will be
	// copied to the working directory.
	SslCertsDir string

	// WaitStart is a time to wait before starting to ping tarantool.
	WaitStart time.Duration

	// ConnectRetry is a count of retry attempts to ping tarantool. If the
	// value < 0 then there will be no ping tarantool at all.
	ConnectRetry int

	// RetryTimeout is a time between tarantool ping retries.
	RetryTimeout time.Duration

	// MemtxUseMvccEngine is flag to enable transactional
	// manager if set to true.
	MemtxUseMvccEngine bool

	// Dialer to check that connection established.
	Dialer tarantool.Dialer
}

type TarantoolInstance

type TarantoolInstance struct {
	// Cmd is a Tarantool command. Used to kill Tarantool process.
	Cmd *exec.Cmd

	// Options for restarting a tarantool instance.
	Opts StartOpts

	// Dialer to check that connection established.
	Dialer tarantool.Dialer
}

TarantoolInstance is a data for instance graceful shutdown and cleanup.

func StartTarantool

func StartTarantool(startOpts StartOpts) (TarantoolInstance, error)

StartTarantool starts a tarantool instance for tests with specifies parameters (refer to StartOpts). Process must be stopped with StopTarantool.

func StartTarantoolInstances

func StartTarantoolInstances(instsOpts []StartOpts) ([]TarantoolInstance, error)

Jump to

Keyboard shortcuts

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