mirror of https://github.com/ceph/go-ceph
admintest: new helper pkg for */admin type test suites
All of our <foo>/admin/ test suites have similar needs for rados conn and wrapped debugging. Create a short package that is meant to only be consumed by our test suites. Signed-off-by: John Mulligan <jmulligan@redhat.com>
This commit is contained in:
parent
85208d213f
commit
8f69b10509
|
@ -0,0 +1,109 @@
|
|||
package admintest
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
"strconv"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
ccom "github.com/ceph/go-ceph/common/commands"
|
||||
"github.com/ceph/go-ceph/internal/commands"
|
||||
"github.com/ceph/go-ceph/rados"
|
||||
)
|
||||
|
||||
var errTimedOut = errors.New("timed out waiting for connect")
|
||||
|
||||
// DebugTraceEnabled returns true if the environment variable
|
||||
// GO_CEPH_TEST_DEBUG_TRACE indicates that the JSON requests and responses
|
||||
// should be traced (logged).
|
||||
func DebugTraceEnabled() bool {
|
||||
dt := os.Getenv("GO_CEPH_TEST_DEBUG_TRACE")
|
||||
ok, err := strconv.ParseBool(dt)
|
||||
return ok && err == nil
|
||||
}
|
||||
|
||||
// NewConn return a new rados connection based on the default config.
|
||||
func NewConn(t *testing.T) *rados.Conn {
|
||||
return NewConnFromConfig(t, "")
|
||||
}
|
||||
|
||||
// NewConnFromConfig returns a new rados connection based on the specified
|
||||
// config file. If configFile is the empty string, the default config is
|
||||
// used.
|
||||
func NewConnFromConfig(t *testing.T, configFile string) *rados.Conn {
|
||||
conn, err := rados.NewConn()
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, conn)
|
||||
if configFile == "" {
|
||||
err = conn.ReadDefaultConfigFile()
|
||||
require.NoError(t, err)
|
||||
} else {
|
||||
err = conn.ReadConfigFile(configFile)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
timeout := time.After(time.Second * 5)
|
||||
ch := make(chan error)
|
||||
go func(conn *rados.Conn) {
|
||||
ch <- conn.Connect()
|
||||
}(conn)
|
||||
select {
|
||||
case err = <-ch:
|
||||
case <-timeout:
|
||||
err = errTimedOut
|
||||
}
|
||||
require.NoError(t, err)
|
||||
|
||||
return conn
|
||||
}
|
||||
|
||||
// WrapConn wraps the given conn in as a "tracer" if so enabled in the
|
||||
// environment.
|
||||
func WrapConn(conn *rados.Conn) ccom.RadosCommander {
|
||||
var c ccom.RadosCommander = conn
|
||||
if DebugTraceEnabled() {
|
||||
c = commands.NewTraceCommander(conn)
|
||||
}
|
||||
return c
|
||||
}
|
||||
|
||||
// Connector is a caching and convenience type for rados connections.
|
||||
// Typically it is instantiated as a global in a go _test.go file.
|
||||
type Connector struct {
|
||||
conn *rados.Conn
|
||||
}
|
||||
|
||||
// NewConnector returns a new Connector.
|
||||
func NewConnector() *Connector {
|
||||
return &Connector{}
|
||||
}
|
||||
|
||||
func (c *Connector) realConn(t *testing.T) *rados.Conn {
|
||||
if c.conn == nil {
|
||||
c.conn = NewConn(t)
|
||||
}
|
||||
return c.conn
|
||||
}
|
||||
|
||||
// GetConn returns the underlying rados connection, either cached or
|
||||
// newly created.
|
||||
func (c *Connector) GetConn(t *testing.T) *rados.Conn {
|
||||
conn := c.realConn(t)
|
||||
// We sleep briefly before returning in order to ensure we have a mgr map
|
||||
// before we start executing the tests.
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
return conn
|
||||
}
|
||||
|
||||
// Get returns a RadosCommander that may or may not be wrapped.
|
||||
// Typically this is the one you want.
|
||||
func (c *Connector) Get(t *testing.T) ccom.RadosCommander {
|
||||
conn := WrapConn(c.realConn(t))
|
||||
// We sleep briefly before returning in order to ensure we have a mgr map
|
||||
// before we start executing the tests.
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
return conn
|
||||
}
|
Loading…
Reference in New Issue