// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package test implements initalization for unit and integration tests.
//
// Init configures logging, random number generators and other global state.
// Typical usage in _test.go files:
//
// import "v.io/x/ref/test"
//
// func TestMain(m *testing.M) {
//     test.Init()
//     os.Exit(m.Run())
// }
//
// InitForTest can be used within test functions as a safe alternative
// to v23.Init.
//
// func TestFoo(t *testing.T) {
//    ctx, shutdown := test.InitForTest()
//    defer shutdown()
//    ...
// }
//
// This package also defines flags for enabling and controlling
// the v23 integration tests in package v23tests:
// --v23.tests - run the integration tests
// --v23.tests.shell-on-fail - drop into a debug shell if the test fails.
//
// Typical usage is:
// $ v23 go test . --v23.tests
//
// Note that, like all flags not recognised by the go testing package, the
// v23.tests flags must follow the package spec.
//
// The sub-directories of this package provide either functionality that
// can be used within traditional go tests, or support for the v23 integration
// test framework. The v23 command is able to generate boilerplate code
// to support these tests. In summary, v23 test generate will generate
// go files to be checked in that include appropriate TestMain functions,
// registration calls for modules commands and wrapper functions for v23test
// tests. More detailed documentation is available via:
//
// $ v23 test generate --help
//
// Vanadium tests often need to run subprocesses to provide either common
// services that they depend (e.g. a mount table) and/or services that are
// specific to the tests. The modules and v23tests subdirectories contain
// packages that simplify this process.
//
// The subdirectories are:
// benchmark  - support for writing benchmarks.
// testutil   - utility functions used in tests.
// security   - security related utility functions used in tests.
// timekeeper - an implementation of the timekeeper interface for use within
//              tests.
// modules    - support for running subprocesses using a single binary
// v23tests   - support for integration tests, including compiling and running
//              arbirtrary go code and pre-existing system commands.
// expect     - support for testing the contents of input streams. The methods
//              provided are embedded in the types used by modules and v23tests
//              so this package is generally not used directly.
package test
