Documentation ¶
Overview ¶
Package integration simplifies the creation of integration tests.
Index ¶
- Constants
- Variables
- func ExecuteTimed(name string, f func() error) error
- func ExtractUniqueDsts(pairs []IAPair) []*snet.UDPAddr
- func GenFile(file string) string
- func GetSCIONDAddress(networksFile string, ia addr.IA) (string, error)
- func GetSCIONDAddresses(networksFile string) (map[string]string, error)
- func GroupBySource(pairs []IAPair) map[*snet.UDPAddr][]*snet.UDPAddr
- func Init() error
- func ListenDone(dir string, onDone func(src, dst addr.IA)) (string, func(), error)
- func LoadNetworkAllocs() (map[addr.IA]*snet.UDPAddr, error)
- func LogDir() string
- func Run(ctx context.Context, cfg RunConfig) error
- func RunClient(in Integration, pair IAPair, timeout time.Duration, ...) error
- func RunUnaryTests(in Integration, pairs []IAPair, timeout time.Duration, ...) error
- func StartServer(in Integration, dst *snet.UDPAddr) (io.Closer, error)
- func TesterID(a *snet.UDPAddr) string
- func WithTimestamp(s string) string
- type BinaryWaiter
- type Cmd
- type HostAddr
- type IAPair
- type Integration
- type RunConfig
- type Waiter
Constants ¶
const ( // Daemon is a placeholder for the Daemon server in the arguments. Daemon = "<SCIOND>" // ServerPortReplace is a placeholder for the server port in the arguments. ServerPortReplace = "<ServerPort>" // SrcIAReplace is a placeholder for the source IA in the arguments. SrcIAReplace = "<SRCIA>" // SrcHostReplace is a placeholder for the source host in the arguments. SrcHostReplace = "<SRCHost>" // SrcAddrPattern is a placeholder for the source address in the arguments. SrcAddrPattern = SrcIAReplace + ",[" + SrcHostReplace + "]" // DstIAReplace is a placeholder for the destination IA in the arguments. DstIAReplace = "<DSTIA>" // DstHostReplace is a placeholder for the destination host in the arguments. DstHostReplace = "<DSTHost>" // DstAddrPattern is a placeholder for the destination address in the arguments. DstAddrPattern = DstIAReplace + ",[" + DstHostReplace + "]" // ReadySignal should be written to Stdout by the server once it is read to accept clients. // The message should always be `Listening ia=<IA>` // where <IA> is the IA the server is listening on. ReadySignal = "Listening ia=" // GoIntegrationEnv is an environment variable that is set for the binary under test. // It can be used to guard certain statements, like printing the ReadySignal, // in a program under test. GoIntegrationEnv = "SCION_GO_INTEGRATION" // WrapperCmd is the command used to run non-test binaries WrapperCmd = "./tools/integration/bin_wrapper.sh" )
const ( // StartServerTimeout is the timeout for starting a server. StartServerTimeout = 40 * time.Second // DefaultRunTimeout is the timeout when running a server or a client. DefaultRunTimeout = 20 * time.Second // CtxTimeout is the timeout a context waits before being killed CtxTimeout = 2 * time.Second // RetryTimeout is the timeout between different attempts RetryTimeout = time.Second / 2 // DaemonAddressesFile is the default file for SCIOND addresses in a topology created // with the topology generator. DaemonAddressesFile = "sciond_addresses.json" )
Variables ¶
var ( // ASList exposes the loaded ASList. ASList *util.ASList )
var ( // Docker indicates if the tests should be executed in a Docker container Docker = flag.Bool("d", false, "Run tests in a docker container") )
Functions ¶
func ExecuteTimed ¶
ExecuteTimed executes f and prints how long f took to StdOut. Returns the error of f.
func ExtractUniqueDsts ¶
ExtractUniqueDsts returns all unique destinations in pairs.
func GroupBySource ¶
GroupBySource groups the ISD-AS pairs by source.
func Init ¶
func Init() error
Init initializes the integration test, it adds and validates the command line flags, and initializes logging.
func ListenDone ¶
ListenDone opens a RPC server to listen for done signals.
func Run ¶
Run runs the commands of the run config. The caller must ensure that all commands are executable when run in a tester container. E.g., for end-to-end tests this means the source address is the same for all.
func RunClient ¶
func RunClient(in Integration, pair IAPair, timeout time.Duration, checkOutput func([]byte) error) error
RunClient runs a client on the given IAPair. If the client does not finish until timeout it is killed.
func RunUnaryTests ¶
func RunUnaryTests(in Integration, pairs []IAPair, timeout time.Duration, checkOutput func([]byte) error) error
RunUnaryTests runs the client for each IAPair. In case of an error the function is terminated immediately.
func StartServer ¶
StartServer runs a server. The server can be stopped by calling Close() on the returned Closer. To start a server with a custom context use in.StartServer directly.
func WithTimestamp ¶
WithTimestamp returns s with the now timestamp prefixed. This is helpful for logging staments to stdout/stderr or in a file where the logger isn't used.
Types ¶
type BinaryWaiter ¶
type BinaryWaiter struct {
// contains filtered or unexported fields
}
BinaryWaiter can be used to wait on completion of the process.
func (*BinaryWaiter) Output ¶
func (bw *BinaryWaiter) Output() []byte
Output is the output of the process, only available after Wait is returnred.
func (*BinaryWaiter) Wait ¶
func (bw *BinaryWaiter) Wait() error
Wait waits for completion of the process.
type HostAddr ¶
var DispAddr HostAddr = func(ia addr.IA) *snet.UDPAddr { if a := loadAddr(ia); a != nil { return a } if raw, err := os.ReadFile(GenFile("networks.conf")); err == nil { pattern := fmt.Sprintf("tester_%s = (.*)", addr.FormatIA(ia, addr.WithFileSeparator())) matches := regexp.MustCompile(pattern).FindSubmatch(raw) if len(matches) == 2 { return &snet.UDPAddr{IA: ia, Host: &net.UDPAddr{IP: net.ParseIP(string(matches[1]))}} } } path := GenFile( filepath.Join( addr.FormatAS(ia.AS(), addr.WithDefaultPrefix(), addr.WithFileSeparator()), "topology.json", ), ) topo, err := topology.RWTopologyFromJSONFile(path) if err != nil { log.Error("Error loading topology", "err", err) os.Exit(1) } cs := topo.CS["cs"+addr.FormatIA(ia, addr.WithFileSeparator())+"-1"] return &snet.UDPAddr{IA: ia, Host: cs.SCIONAddress} }
DispAddr reads the CS host Addr from the topology for the specified IA. In general this could be the IP of any service (PS/BS/CS) in that IA because they share the same dispatcher in the dockerized topology. The host IP is used as client or server address in the tests because the testing container is connecting to the dispatcher of the services.
type IAPair ¶
IAPair is a source, destination pair. The client (Src) will dial the server (Dst).
func UniqueIAPairs ¶
UniqueIAPairs returns all distinct IAPairs that should be tested.
type Integration ¶
type Integration interface { // Name returns the name of the test Name() string // StartServer should start the server listening on the address dst. // StartServer should return after it is ready to accept clients. // The context should be used to make the server cancellable. StartServer(ctx context.Context, dst *snet.UDPAddr) (Waiter, error) // StartClient should start the client on the src address connecting to the dst address. // StartClient should return immediately. // The context should be used to make the client cancellable. StartClient(ctx context.Context, src, dst *snet.UDPAddr) (*BinaryWaiter, error) }
Integration can be used to run integration tests.
func NewBinaryIntegration ¶
func NewBinaryIntegration(name string, cmd string, clientArgs, serverArgs []string) Integration
NewBinaryIntegration returns an implementation of the Integration interface. Start* will run the binary programm with name and use the given arguments for the client/server. Use SrcIAReplace and DstIAReplace in arguments as placeholder for the source and destination IAs. When starting a client/server the placeholders will be replaced with the actual values. The server should output the ReadySignal to Stdout once it is ready to accept clients.