Xo is experimental. The source is now public on GitHub, or try Xo in your browser.
Menu · testing

Docs

std/testing

On this page

Index

Types

TestOs

struct TestOs {
  net: FakeNet
  fs: MemFs
  clock: FakeClock
  rand: Rand
  env: FakeEnv
  stdio: FakeStdio
  proc: FakeProc
  tasks: task.Group
}

Source: std/testing.xo:17

Expect

struct Expect[T] {}

Source: std/testing.xo:29

FakeNet

struct FakeNet {}

Source: std/testing.xo:41

FakeNet.listen

fn (n: FakeNet) listen(addr: Str) -> Listener ! NetErr uses net.listen

Source: std/testing.xo:42

FakeNet.dial

fn (n: FakeNet) dial(addr: Str) -> Conn ! NetErr uses net.dial

Source: std/testing.xo:43

FakeNet.dial_timeout

fn (n: FakeNet) dial_timeout(addr: Str, d: Duration) -> Conn ! NetErr uses net.dial

Source: std/testing.xo:44

FakeNet.lookup_host

fn (n: FakeNet) lookup_host(host: Str) -> List[Str] ! NetErr uses net.dial

Source: std/testing.xo:45

FakeNet.interfaces

fn (n: FakeNet) interfaces() -> List[NetInterface] ! NetErr uses net.listen

Source: std/testing.xo:46

FakeNet.only

fn (n: FakeNet) only(hosts: List[Str]) -> Net

Source: std/testing.xo:47

FakeNet.handle

fn (n: FakeNet) handle(pattern: Str, h: fn(http.Request) -> http.Response)

Source: std/testing.xo:48

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).

Source: std/testing.xo:53

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.

Source: std/testing.xo:56

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.

Source: std/testing.xo:58

FakeNet.clear_failures

fn (n: FakeNet) clear_failures()

Source: std/testing.xo:59

FakeNet.requests

fn (n: FakeNet) requests() -> List[http.Request]

Source: std/testing.xo:60

FakeClock

struct FakeClock {}

Source: std/testing.xo:63

FakeClock.now

fn (c: FakeClock) now() -> Time uses clock

Source: std/testing.xo:64

FakeClock.sleep

fn (c: FakeClock) sleep(d: Duration) uses clock

Source: std/testing.xo:65

FakeClock.sleep_or_cancel

fn (c: FakeClock) sleep_or_cancel(d: Duration) -> () ! ClockErr uses clock

Source: std/testing.xo:66

FakeClock.since

fn (c: FakeClock) since(t: Time) -> Duration uses clock

Source: std/testing.xo:67

FakeClock.advance

fn (c: FakeClock) advance(d: Duration)

Source: std/testing.xo:68

FakeClock.set

fn (c: FakeClock) set(t: Time)

Source: std/testing.xo:69

FakeClock.sleeps

fn (c: FakeClock) sleeps() -> List[Duration]

Source: std/testing.xo:70

FsOp

enum FsOp {
  Read
  Write
  Rename
  Remove
  CreateDir
  ReadDir
}

Source: std/testing.xo:73

MemFs

struct MemFs {}

Source: std/testing.xo:82

MemFs.sub

fn (f: MemFs) sub(dir: Str) -> Fs

Source: std/testing.xo:83

MemFs.cwd

fn (f: MemFs) cwd() -> Fs

Source: std/testing.xo:84

MemFs.cwd_path

fn (f: MemFs) cwd_path() -> Str ! FsErr

Source: std/testing.xo:85

MemFs.read_only

fn (f: MemFs) read_only() -> Fs

Source: std/testing.xo:86

MemFs.write_only

fn (f: MemFs) write_only() -> Fs

Source: std/testing.xo:87

MemFs.case_sensitive

fn (f: MemFs) case_sensitive() -> Bool

Source: std/testing.xo:88

MemFs.stat

fn (f: MemFs) stat(path: Str) -> FileInfo? ! FsErr uses fs.read

Source: std/testing.xo:89

MemFs.exists

fn (f: MemFs) exists(path: Str) -> Bool ! FsErr uses fs.read

Source: std/testing.xo:90

MemFs.disk_usage

fn (f: MemFs) disk_usage(path: Str) -> DiskUsage ! FsErr uses fs.read

Source: std/testing.xo:91

MemFs.read

fn (f: MemFs) read(path: Str) -> Bytes ! FsErr uses fs.read

Source: std/testing.xo:92

MemFs.read_text

fn (f: MemFs) read_text(path: Str) -> Str ! FsErr uses fs.read

Source: std/testing.xo:93

MemFs.read_dir

fn (f: MemFs) read_dir(dir: Str) -> List[FileInfo] ! FsErr uses fs.read

Source: std/testing.xo:94

MemFs.walk

fn (f: MemFs) walk(dir: Str) -> List[FileInfo] ! FsErr uses fs.read

Source: std/testing.xo:95

MemFs.write

fn (f: MemFs) write(path: Str, data: Bytes) -> () ! FsErr uses fs.write

Source: std/testing.xo:96

MemFs.create_temp

fn (f: MemFs) create_temp(dir: Str, prefix: Str) -> Str ! FsErr uses fs.write

Source: std/testing.xo:97

MemFs.rename

fn (f: MemFs) rename(from: Str, to: Str) -> () ! FsErr uses fs.write

Source: std/testing.xo:98

MemFs.remove

fn (f: MemFs) remove(path: Str) -> () ! FsErr uses fs.write

Source: std/testing.xo:99

MemFs.remove_all

fn (f: MemFs) remove_all(path: Str) -> () ! FsErr uses fs.write

Source: std/testing.xo:100

MemFs.create_dir_all

fn (f: MemFs) create_dir_all(dir: Str) -> () ! FsErr uses fs.write

Source: std/testing.xo:101

MemFs.set_modified

fn (f: MemFs) set_modified(path: Str, t: Time) -> () ! FsErr uses fs.write

Source: std/testing.xo:102

MemFs.open

fn (f: MemFs) open(path: Str) -> File ! FsErr uses fs.read

Source: std/testing.xo:103

MemFs.create

fn (f: MemFs) create(path: Str) -> File ! FsErr uses fs.write

Source: std/testing.xo:104

MemFs.open_append

fn (f: MemFs) open_append(path: Str) -> File ! FsErr uses fs.write

Source: std/testing.xo:105

MemFs.open_rw

fn (f: MemFs) open_rw(path: Str) -> File ! FsErr uses fs.write

Like Fs.open_rw.

Source: std/testing.xo:107

MemFs.create_new

fn (f: MemFs) create_new(path: Str) -> File ! FsErr uses fs.write

Source: std/testing.xo:108

MemFs.append

fn (f: MemFs) append(path: Str, data: Bytes) -> () ! FsErr uses fs.write

Source: std/testing.xo:109

MemFs.copy

fn (f: MemFs) copy(from: Str, to: Str) -> () ! FsErr uses fs

Source: std/testing.xo:110

MemFs.mode

fn (f: MemFs) mode(path: Str) -> Int ! FsErr uses fs.read

Source: std/testing.xo:111

MemFs.set_mode

fn (f: MemFs) set_mode(path: Str, mode: Int) -> () ! FsErr uses fs.write

Source: std/testing.xo:112

fn (f: MemFs) symlink(target: Str, link: Str) -> () ! FsErr uses fs.write

Source: std/testing.xo:113

fn (f: MemFs) read_link(path: Str) -> Str? ! FsErr uses fs.read

Source: std/testing.xo:114

MemFs.glob

fn (f: MemFs) glob(pattern: Str) -> List[Str] ! FsErr uses fs.read

Source: std/testing.xo:115

MemFs.lock

fn (f: MemFs) lock(path: Str) -> FileLock ! FsErr uses fs.write

Source: std/testing.xo:116

MemFs.try_lock

fn (f: MemFs) try_lock(path: Str) -> FileLock? ! FsErr uses fs.write

Source: std/testing.xo:117

MemFs.fail_next

fn (f: MemFs) fail_next(op: FsOp, path: Str, err: FsErr)

Source: std/testing.xo:118

MemFs.set_case_sensitive

fn (f: MemFs) set_case_sensitive(on: Bool)

Source: std/testing.xo:119

MemFs.set_disk_usage

fn (f: MemFs) set_disk_usage(u: DiskUsage)

What disk_usage answers for every path that exists (decision 0426).

Source: std/testing.xo:121

MemFs.files

fn (f: MemFs) files() -> Map[Str, Bytes]

Source: std/testing.xo:122

FakeEnv

struct FakeEnv {}

Source: std/testing.xo:125

FakeEnv.get

fn (e: FakeEnv) get(name: Str) -> Str? uses env

Source: std/testing.xo:126

FakeEnv.vars

fn (e: FakeEnv) vars() -> Map[Str, Str] uses env

Source: std/testing.xo:127

FakeEnv.args

fn (e: FakeEnv) args() -> List[Str] uses env

Source: std/testing.xo:128

FakeEnv.program

fn (e: FakeEnv) program() -> Str uses env

Source: std/testing.xo:129

FakeEnv.home

fn (e: FakeEnv) home() -> Str ! EnvErr uses env

Source: std/testing.xo:130

FakeEnv.only

fn (e: FakeEnv) only(names: List[Str]) -> Env

Source: std/testing.xo:131

FakeEnv.config_dir

fn (e: FakeEnv) config_dir() -> Str ! EnvErr uses env

Source: std/testing.xo:132

FakeEnv.cache_dir

fn (e: FakeEnv) cache_dir() -> Str ! EnvErr uses env

Source: std/testing.xo:133

FakeEnv.hostname

fn (e: FakeEnv) hostname() -> Str uses env

“test”, or the value of HOSTNAME when the FakeEnv has one.

Source: std/testing.xo:135

FakeEnv.set

fn (e: FakeEnv) set(name: Str, value: Str)

Source: std/testing.xo:136

FakeEnv.set_args

fn (e: FakeEnv) set_args(args: List[Str])

Source: std/testing.xo:137

FakeStdio

struct FakeStdio {}

Source: std/testing.xo:139

FakeStdio.print

fn (s: FakeStdio) print(text: Str) uses stdio

Source: std/testing.xo:140

FakeStdio.println

fn (s: FakeStdio) println(text: Str) uses stdio

Source: std/testing.xo:141

FakeStdio.eprint

fn (s: FakeStdio) eprint(text: Str) uses stdio

Source: std/testing.xo:142

FakeStdio.eprintln

fn (s: FakeStdio) eprintln(text: Str) uses stdio

Source: std/testing.xo:143

FakeStdio.write

fn (s: FakeStdio) write(data: Bytes) -> () ! IoErr uses stdio

Source: std/testing.xo:144

FakeStdio.read_line

fn (s: FakeStdio) read_line() -> Str? ! IoErr uses stdio

Source: std/testing.xo:145

FakeStdio.read_all

fn (s: FakeStdio) read_all() -> Str ! IoErr uses stdio

Source: std/testing.xo:146

FakeStdio.lines

fn (s: FakeStdio) lines() -> List[Str] ! IoErr uses stdio

Source: std/testing.xo:147

FakeStdio.stdin_is_tty

fn (s: FakeStdio) stdin_is_tty() -> Bool uses stdio

Source: std/testing.xo:148

FakeStdio.stdout_is_tty

fn (s: FakeStdio) stdout_is_tty() -> Bool uses stdio

Source: std/testing.xo:149

FakeStdio.stderr_is_tty

fn (s: FakeStdio) stderr_is_tty() -> Bool uses stdio

Source: std/testing.xo:150

FakeStdio.width

fn (s: FakeStdio) width() -> Int? uses stdio

Source: std/testing.xo:151

FakeStdio.read_secret

fn (s: FakeStdio) read_secret(prompt: Str) -> Str? ! IoErr uses stdio

Source: std/testing.xo:152

FakeStdio.read_bytes

fn (s: FakeStdio) read_bytes(max: Int) -> Bytes? ! IoErr uses stdio

Source: std/testing.xo:153

FakeStdio.read_all_bytes

fn (s: FakeStdio) read_all_bytes() -> Bytes ! IoErr uses stdio

Source: std/testing.xo:154

FakeStdio.set_input

fn (s: FakeStdio) set_input(text: Str)

Source: std/testing.xo:155

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.

Source: std/testing.xo:158

FakeStdio.set_input_bytes

fn (s: FakeStdio) set_input_bytes(data: Bytes)

Standard input holds these bytes (any bytes, for read_bytes).

Source: std/testing.xo:160

FakeStdio.output

fn (s: FakeStdio) output() -> Str

Source: std/testing.xo:161

FakeStdio.errors

fn (s: FakeStdio) errors() -> Str

Source: std/testing.xo:162

FakeProc

struct FakeProc {}

Source: std/testing.xo:164

FakeProc.exit

fn (p: FakeProc) exit(code: Int) -> Never uses proc

Source: std/testing.xo:165

FakeProc.set_grace

fn (p: FakeProc) set_grace(d: Duration) uses proc

Source: std/testing.xo:166

FakeProc.run

fn (p: FakeProc) run(cmd: Str, args: List[Str]) -> ProcOutput ! ProcErr uses proc

Source: std/testing.xo:167

FakeProc.only

fn (p: FakeProc) only(cmds: List[Str]) -> Proc

Source: std/testing.xo:168

FakeProc.cmd

fn (p: FakeProc) cmd(name: Str, args: List[Str] = []) -> Cmd

Source: std/testing.xo:169

FakeProc.pipeline

fn (p: FakeProc) pipeline(cmds: List[Cmd]) -> ProcOutput ! ProcErr uses proc

Source: std/testing.xo:170

FakeProc.exit_code

fn (p: FakeProc) exit_code() -> Int?

Source: std/testing.xo:171

FakeProc.signal_after

fn (p: FakeProc) signal_after(d: Duration)

Source: std/testing.xo:172

FakeProc.on_run

fn (p: FakeProc) on_run(cmd: Str, out: ProcOutput)

Source: std/testing.xo:173

FakeProc.kill

fn (p: FakeProc) kill(pid: Int, signal: Str = "TERM") -> () ! ProcErr uses proc

Records the signal; nothing is sent (decision 0190).

Source: std/testing.xo:175

FakeProc.notify

fn (p: FakeProc) notify(signals: List[Signal]) -> Chan[Signal] uses proc

Source: std/testing.xo:176

FakeProc.stop_notify

fn (p: FakeProc) stop_notify(c: Chan[Signal]) uses proc

Source: std/testing.xo:177

FakeProc.request_stop

fn (p: FakeProc) request_stop() uses proc

Source: std/testing.xo:178

FakeProc.pid

fn (p: FakeProc) pid() -> Int uses proc

Source: std/testing.xo:179

FakeProc.ppid

fn (p: FakeProc) ppid() -> Int uses proc

Source: std/testing.xo:180

FakeProc.usage

fn (p: FakeProc) usage() -> ProcUsage uses proc

Source: std/testing.xo:181

FakeProc.children_usage

fn (p: FakeProc) children_usage() -> ProcUsage uses proc

Source: std/testing.xo:182

FakeProc.killed

fn (p: FakeProc) killed() -> List[Str]

The signals kill recorded, as “NAME PID”, oldest first.

Source: std/testing.xo:184

Functions

expect

fn expect[T](x: T) -> Expect[T]

Source: std/testing.xo:30

gen

fn gen[T](seed: Int) -> T

Source: std/testing.xo:32

logs

fn logs() -> List[log.Record]

The records logged so far in the current test, oldest first (std.md 8.6).

Source: std/testing.xo:35

fake_db

fn fake_db(schema: Str) -> sql.Db ! sql.SqlErr

An in memory database created from schema (std.md 10.6); same as sql.memory.

Source: std/testing.xo:38

run_main

fn run_main[fx: Effects](main: fn(Os) -> () ! Error uses fx, os: TestOs, args: List[Str] = []) -> Int uses fx

Runs 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).

Source: std/testing.xo:191

↑ index