std/testing
On this page
Index
- type
TestOs - type
Expect - type
FakeNet- method
FakeNet.listen - method
FakeNet.dial - method
FakeNet.dial_timeout - method
FakeNet.lookup_host - method
FakeNet.interfaces - method
FakeNet.only - method
FakeNet.handle - method
FakeNet.handle_tls - method
FakeNet.fail - method
FakeNet.fail_next - method
FakeNet.clear_failures - method
FakeNet.requests
- method
- type
FakeClock- method
FakeClock.now - method
FakeClock.sleep - method
FakeClock.sleep_or_cancel - method
FakeClock.since - method
FakeClock.advance - method
FakeClock.set - method
FakeClock.sleeps
- method
- type
FsOp - type
MemFs- method
MemFs.sub - method
MemFs.cwd - method
MemFs.cwd_path - method
MemFs.read_only - method
MemFs.write_only - method
MemFs.case_sensitive - method
MemFs.stat - method
MemFs.exists - method
MemFs.disk_usage - method
MemFs.read - method
MemFs.read_text - method
MemFs.read_dir - method
MemFs.walk - method
MemFs.write - method
MemFs.create_temp - method
MemFs.rename - method
MemFs.remove - method
MemFs.remove_all - method
MemFs.create_dir_all - method
MemFs.set_modified - method
MemFs.open - method
MemFs.create - method
MemFs.open_append - method
MemFs.open_rw - method
MemFs.create_new - method
MemFs.append - method
MemFs.copy - method
MemFs.mode - method
MemFs.set_mode - method
MemFs.symlink - method
MemFs.read_link - method
MemFs.glob - method
MemFs.lock - method
MemFs.try_lock - method
MemFs.fail_next - method
MemFs.set_case_sensitive - method
MemFs.set_disk_usage - method
MemFs.files
- method
- type
FakeEnv- method
FakeEnv.get - method
FakeEnv.vars - method
FakeEnv.args - method
FakeEnv.program - method
FakeEnv.home - method
FakeEnv.only - method
FakeEnv.config_dir - method
FakeEnv.cache_dir - method
FakeEnv.hostname - method
FakeEnv.set - method
FakeEnv.set_args
- method
- type
FakeStdio- method
FakeStdio.print - method
FakeStdio.println - method
FakeStdio.eprint - method
FakeStdio.eprintln - method
FakeStdio.write - method
FakeStdio.read_line - method
FakeStdio.read_all - method
FakeStdio.lines - method
FakeStdio.stdin_is_tty - method
FakeStdio.stdout_is_tty - method
FakeStdio.stderr_is_tty - method
FakeStdio.width - method
FakeStdio.read_secret - method
FakeStdio.read_bytes - method
FakeStdio.read_all_bytes - method
FakeStdio.set_input - method
FakeStdio.set_tty - method
FakeStdio.set_input_bytes - method
FakeStdio.output - method
FakeStdio.errors
- method
- type
FakeProc- method
FakeProc.exit - method
FakeProc.set_grace - method
FakeProc.run - method
FakeProc.only - method
FakeProc.cmd - method
FakeProc.pipeline - method
FakeProc.exit_code - method
FakeProc.signal_after - method
FakeProc.on_run - method
FakeProc.kill - method
FakeProc.notify - method
FakeProc.stop_notify - method
FakeProc.request_stop - method
FakeProc.pid - method
FakeProc.ppid - method
FakeProc.usage - method
FakeProc.children_usage - method
FakeProc.killed
- method
- fn
expect - fn
gen - fn
logs - fn
fake_db - fn
run_main
Types
TestOs
struct TestOs {
net: FakeNet
fs: MemFs
clock: FakeClock
rand: Rand
env: FakeEnv
stdio: FakeStdio
proc: FakeProc
tasks: task.Group
}Expect
struct Expect[T] {}FakeNet
struct FakeNet {}FakeNet.listen
fn (n: FakeNet) listen(addr: Str) -> Listener ! NetErr uses net.listenFakeNet.dial
fn (n: FakeNet) dial(addr: Str) -> Conn ! NetErr uses net.dialFakeNet.dial_timeout
fn (n: FakeNet) dial_timeout(addr: Str, d: Duration) -> Conn ! NetErr uses net.dialFakeNet.lookup_host
fn (n: FakeNet) lookup_host(host: Str) -> List[Str] ! NetErr uses net.dialFakeNet.interfaces
fn (n: FakeNet) interfaces() -> List[NetInterface] ! NetErr uses net.listenFakeNet.only
fn (n: FakeNet) only(hosts: List[Str]) -> NetFakeNet.handle
fn (n: FakeNet) handle(pattern: Str, h: fn(http.Request) -> http.Response)FakeNet.handle_tls
fn (n: FakeNet) handle_tls(pattern: Str, cert: tls.TlsCert, h: fn(http.Request) -> http.Response)Like handle for an https pattern, with the certificate the server presents: a request it matches first runs the
client’s checks against cert as a real handshake would (the roots, the server name, with_verify,
with_verify_conn, with the handshake’s error texts) and fails before the handler when one refuses; the handler’s
tls_state() reports the server name the client sent (decision 0544).
FakeNet.fail
fn (n: FakeNet) fail(pattern: Str, err: http.ClientErr)Every matching request fails with err, until clear_failures. The handler is skipped, so it never sees the request: use requests() to see what was sent.
FakeNet.fail_next
fn (n: FakeNet) fail_next(pattern: Str, err: http.ClientErr)The next matching request fails with err, once; like fail, it skips the handler and requests() still lists it.
FakeNet.clear_failures
fn (n: FakeNet) clear_failures()FakeNet.requests
fn (n: FakeNet) requests() -> List[http.Request]FakeClock
struct FakeClock {}FakeClock.now
fn (c: FakeClock) now() -> Time uses clockFakeClock.sleep
fn (c: FakeClock) sleep(d: Duration) uses clockFakeClock.sleep_or_cancel
fn (c: FakeClock) sleep_or_cancel(d: Duration) -> () ! ClockErr uses clockFakeClock.since
fn (c: FakeClock) since(t: Time) -> Duration uses clockFakeClock.advance
fn (c: FakeClock) advance(d: Duration)FakeClock.set
fn (c: FakeClock) set(t: Time)FakeClock.sleeps
fn (c: FakeClock) sleeps() -> List[Duration]FsOp
enum FsOp {
Read
Write
Rename
Remove
CreateDir
ReadDir
}MemFs
struct MemFs {}MemFs.sub
fn (f: MemFs) sub(dir: Str) -> FsMemFs.cwd
fn (f: MemFs) cwd() -> FsMemFs.cwd_path
fn (f: MemFs) cwd_path() -> Str ! FsErrMemFs.read_only
fn (f: MemFs) read_only() -> FsMemFs.write_only
fn (f: MemFs) write_only() -> FsMemFs.case_sensitive
fn (f: MemFs) case_sensitive() -> BoolMemFs.stat
fn (f: MemFs) stat(path: Str) -> FileInfo? ! FsErr uses fs.readMemFs.exists
fn (f: MemFs) exists(path: Str) -> Bool ! FsErr uses fs.readMemFs.disk_usage
fn (f: MemFs) disk_usage(path: Str) -> DiskUsage ! FsErr uses fs.readMemFs.read
fn (f: MemFs) read(path: Str) -> Bytes ! FsErr uses fs.readMemFs.read_text
fn (f: MemFs) read_text(path: Str) -> Str ! FsErr uses fs.readMemFs.read_dir
fn (f: MemFs) read_dir(dir: Str) -> List[FileInfo] ! FsErr uses fs.readMemFs.walk
fn (f: MemFs) walk(dir: Str) -> List[FileInfo] ! FsErr uses fs.readMemFs.write
fn (f: MemFs) write(path: Str, data: Bytes) -> () ! FsErr uses fs.writeMemFs.create_temp
fn (f: MemFs) create_temp(dir: Str, prefix: Str) -> Str ! FsErr uses fs.writeMemFs.rename
fn (f: MemFs) rename(from: Str, to: Str) -> () ! FsErr uses fs.writeMemFs.remove
fn (f: MemFs) remove(path: Str) -> () ! FsErr uses fs.writeMemFs.remove_all
fn (f: MemFs) remove_all(path: Str) -> () ! FsErr uses fs.writeMemFs.create_dir_all
fn (f: MemFs) create_dir_all(dir: Str) -> () ! FsErr uses fs.writeMemFs.set_modified
fn (f: MemFs) set_modified(path: Str, t: Time) -> () ! FsErr uses fs.writeMemFs.open
fn (f: MemFs) open(path: Str) -> File ! FsErr uses fs.readMemFs.create
fn (f: MemFs) create(path: Str) -> File ! FsErr uses fs.writeMemFs.open_append
fn (f: MemFs) open_append(path: Str) -> File ! FsErr uses fs.writeMemFs.open_rw
fn (f: MemFs) open_rw(path: Str) -> File ! FsErr uses fs.writeLike Fs.open_rw.
MemFs.create_new
fn (f: MemFs) create_new(path: Str) -> File ! FsErr uses fs.writeMemFs.append
fn (f: MemFs) append(path: Str, data: Bytes) -> () ! FsErr uses fs.writeMemFs.copy
fn (f: MemFs) copy(from: Str, to: Str) -> () ! FsErr uses fsMemFs.mode
fn (f: MemFs) mode(path: Str) -> Int ! FsErr uses fs.readMemFs.set_mode
fn (f: MemFs) set_mode(path: Str, mode: Int) -> () ! FsErr uses fs.writeMemFs.symlink
fn (f: MemFs) symlink(target: Str, link: Str) -> () ! FsErr uses fs.writeMemFs.read_link
fn (f: MemFs) read_link(path: Str) -> Str? ! FsErr uses fs.readMemFs.glob
fn (f: MemFs) glob(pattern: Str) -> List[Str] ! FsErr uses fs.readMemFs.lock
fn (f: MemFs) lock(path: Str) -> FileLock ! FsErr uses fs.writeMemFs.try_lock
fn (f: MemFs) try_lock(path: Str) -> FileLock? ! FsErr uses fs.writeMemFs.fail_next
fn (f: MemFs) fail_next(op: FsOp, path: Str, err: FsErr)MemFs.set_case_sensitive
fn (f: MemFs) set_case_sensitive(on: Bool)MemFs.set_disk_usage
fn (f: MemFs) set_disk_usage(u: DiskUsage)What disk_usage answers for every path that exists (decision 0426).
MemFs.files
fn (f: MemFs) files() -> Map[Str, Bytes]FakeEnv
struct FakeEnv {}FakeEnv.get
fn (e: FakeEnv) get(name: Str) -> Str? uses envFakeEnv.vars
fn (e: FakeEnv) vars() -> Map[Str, Str] uses envFakeEnv.args
fn (e: FakeEnv) args() -> List[Str] uses envFakeEnv.program
fn (e: FakeEnv) program() -> Str uses envFakeEnv.home
fn (e: FakeEnv) home() -> Str ! EnvErr uses envFakeEnv.only
fn (e: FakeEnv) only(names: List[Str]) -> EnvFakeEnv.config_dir
fn (e: FakeEnv) config_dir() -> Str ! EnvErr uses envFakeEnv.cache_dir
fn (e: FakeEnv) cache_dir() -> Str ! EnvErr uses envFakeEnv.hostname
fn (e: FakeEnv) hostname() -> Str uses env“test”, or the value of HOSTNAME when the FakeEnv has one.
FakeEnv.set
fn (e: FakeEnv) set(name: Str, value: Str)FakeEnv.set_args
fn (e: FakeEnv) set_args(args: List[Str])FakeStdio
struct FakeStdio {}FakeStdio.print
fn (s: FakeStdio) print(text: Str) uses stdioFakeStdio.println
fn (s: FakeStdio) println(text: Str) uses stdioFakeStdio.eprint
fn (s: FakeStdio) eprint(text: Str) uses stdioFakeStdio.eprintln
fn (s: FakeStdio) eprintln(text: Str) uses stdioFakeStdio.write
fn (s: FakeStdio) write(data: Bytes) -> () ! IoErr uses stdioFakeStdio.read_line
fn (s: FakeStdio) read_line() -> Str? ! IoErr uses stdioFakeStdio.read_all
fn (s: FakeStdio) read_all() -> Str ! IoErr uses stdioFakeStdio.lines
fn (s: FakeStdio) lines() -> List[Str] ! IoErr uses stdioFakeStdio.stdin_is_tty
fn (s: FakeStdio) stdin_is_tty() -> Bool uses stdioFakeStdio.stdout_is_tty
fn (s: FakeStdio) stdout_is_tty() -> Bool uses stdioFakeStdio.stderr_is_tty
fn (s: FakeStdio) stderr_is_tty() -> Bool uses stdioFakeStdio.width
fn (s: FakeStdio) width() -> Int? uses stdioFakeStdio.read_secret
fn (s: FakeStdio) read_secret(prompt: Str) -> Str? ! IoErr uses stdioFakeStdio.read_bytes
fn (s: FakeStdio) read_bytes(max: Int) -> Bytes? ! IoErr uses stdioFakeStdio.read_all_bytes
fn (s: FakeStdio) read_all_bytes() -> Bytes ! IoErr uses stdioFakeStdio.set_input
fn (s: FakeStdio) set_input(text: Str)FakeStdio.set_tty
fn (s: FakeStdio) set_tty(width: Int)The streams are terminals of width columns (0: not terminals, the
default), for code that checks stdout_is_tty or width.
FakeStdio.set_input_bytes
fn (s: FakeStdio) set_input_bytes(data: Bytes)Standard input holds these bytes (any bytes, for read_bytes).
FakeStdio.output
fn (s: FakeStdio) output() -> StrFakeStdio.errors
fn (s: FakeStdio) errors() -> StrFakeProc
struct FakeProc {}FakeProc.exit
fn (p: FakeProc) exit(code: Int) -> Never uses procFakeProc.set_grace
fn (p: FakeProc) set_grace(d: Duration) uses procFakeProc.run
fn (p: FakeProc) run(cmd: Str, args: List[Str]) -> ProcOutput ! ProcErr uses procFakeProc.only
fn (p: FakeProc) only(cmds: List[Str]) -> ProcFakeProc.cmd
fn (p: FakeProc) cmd(name: Str, args: List[Str] = []) -> CmdFakeProc.pipeline
fn (p: FakeProc) pipeline(cmds: List[Cmd]) -> ProcOutput ! ProcErr uses procFakeProc.exit_code
fn (p: FakeProc) exit_code() -> Int?FakeProc.signal_after
fn (p: FakeProc) signal_after(d: Duration)FakeProc.on_run
fn (p: FakeProc) on_run(cmd: Str, out: ProcOutput)FakeProc.kill
fn (p: FakeProc) kill(pid: Int, signal: Str = "TERM") -> () ! ProcErr uses procRecords the signal; nothing is sent (decision 0190).
FakeProc.notify
fn (p: FakeProc) notify(signals: List[Signal]) -> Chan[Signal] uses procFakeProc.stop_notify
fn (p: FakeProc) stop_notify(c: Chan[Signal]) uses procFakeProc.request_stop
fn (p: FakeProc) request_stop() uses procFakeProc.pid
fn (p: FakeProc) pid() -> Int uses procFakeProc.ppid
fn (p: FakeProc) ppid() -> Int uses procFakeProc.usage
fn (p: FakeProc) usage() -> ProcUsage uses procFakeProc.children_usage
fn (p: FakeProc) children_usage() -> ProcUsage uses procFakeProc.killed
fn (p: FakeProc) killed() -> List[Str]The signals kill recorded, as “NAME PID”, oldest first.
Functions
expect
fn expect[T](x: T) -> Expect[T]gen
fn gen[T](seed: Int) -> Tlogs
fn logs() -> List[log.Record]The records logged so far in the current test, oldest first (std.md 8.6).
fake_db
fn fake_db(schema: Str) -> sql.Db ! sql.SqlErrAn in memory database created from schema (std.md 10.6); same as sql.memory.
run_main
fn run_main[fx: Effects](main: fn(Os) -> () ! Error uses fx, os: TestOs, args: List[Str] = []) -> Int uses fxRuns a program’s main against fakes and returns its exit status: 0, 1
for an error returned from main, or the code passed to exit (std.md 8.4).
std.md writes main: fn(Os) -> () ! Error without effects; a main
performs effects on its os, so the effects pass through an effect
variable here (a pure function type would reject every real main).