VTC

Varnish测试用例语法

手册部分:

7

OVERVIEW

本文档描述了Varnish测试用例文件(.vtc)使用的语法。VTC文件描述具有不同脚本化的HTTP对话实体以及通常要测试的一个或多个Varnish实例的场景。

PARSING

VTC文件将逐字读取,标记化非常少,这意味着在测试实际到达测试中的相关操作之前,不会检测到语法错误。

解析错误在大多数情况下都会导致断言被触发。如果发生这种情况,请参考相关的源文件和行号。然而,本指南应该可以帮助您避免最常见的错误。

单词和字符串

解析器通过检测空格字符来拆分单词,字符串是由双引号(“...”)括起来的单词或同一行中的一系列单词,对于多行字符串,则用大括号({...})括起来。

评论

行的前导空格将被忽略。空行(或只包含空格的行)也会被忽略,以“#”开头的注释行也会被忽略。

行和命令

Test files take at most one command per line, with the first word of the line being the command and the following ones being its arguments. To continue over to a new line without breaking the argument string, you can escape the newline character (\n) with a backslash (\).

MACROS

在处理字符串时,将执行宏展开。宏的格式为 ${<name>[,<args>...]} ,它们有一个名称,后面跟一个可选的逗号或空格分隔的参数列表。前导空格和尾随空格将被忽略。

宏指令 ${foo,bar,baz}${ foo bar baz } 是等价的。如果参数包含空格或逗号,则可以将参数引起来。例如,宏 ${foo,"bar,baz"} 给出了一个论点 bar,baz 添加到名为 foo

除非另有说明,否则所有宏都是不带参数的简单宏。

内置宏

${bad_backend}

可靠地永远不接受连接的套接字地址。

${bad_ip}

一个不太可能的IPv4地址。

${date}

为HTTP设置格式的当前日期和时间。

${listen_addr}

默认侦听地址是各种组件使用的地址,默认情况下是本地主机上的随机端口。

${localhost}

解析为“Localhost”的第一个IP地址。

${pwd}

从中创建的工作目录 varnishtest 被处决了。

${string,<action>[,<args>...]}

这个 string 宏是文本生成的入口点,它对每个参数采取专门的操作。

${string,repeat,<uint>,<str>}

重复 uint 对字符串进行乘以 str

${testdir}

包含正在进行的测试用例执行的VTC脚本的目录。

${tmpdir}

用于正在进行的测试用例执行的专用工作目录,恰好也是当前的工作目录。需要工作目录的绝对路径时非常有用。

${topbuild}

仅在以下情况下出现 -i 选项用于在Varnish本身上运行,而不是常规安装。

SYNTAX

屏障

注意:只要给出命令,该命令就可用。

障碍允许您同步不同的线程,以确保事件以正确的顺序发生。甚至可以在VCL中使用它们。

首先,有必要声明障碍:

barrier bNAME TYPE NUMBER [-cyclic]

争论的理由是:

B名称

这是障碍的名称,用于在创建同步点时对其进行标识。它必须以‘b’开头。

TYPE

它可以是“cond”(互斥体)或“sock”(套接字),并设置内部行为。如果不需要VCL同步,可以使用cond。

NUMBER

通过障碍所需的同步点数量。

-循环

如果存在,障碍将自动重置,并准备好在通过后进行下一轮。

然后,要添加同步点::

barrier bNAME sync

这将阻塞父线程,直到bNAME的同步点数量达到屏障声明中给出的数量。

如果您希望同步VCL,则需要声明一个“SOCK”屏障。这将发出一个名为“bNAME_SOCK”的宏定义,您可以在VCL中使用该宏定义(在导入VTC vmod之后):

vtc.barrier_sync("${bNAME_sock}");

如果一切顺利,则此函数返回0,相当于 barrier bNAME sync 在职训局高层。

客户端/服务器

客户端和服务器线程是假的HTTP实体,用于测试您的Varnish和VCL。它们接受任意数量的参数,未被识别的参数(假设它们不以‘-’开头)被视为规范,列出要执行的操作:

client cNAME [...]
server sNAME [...]

客户端和服务器由一个字符串标识,这是第一个参数,客户端的名称以‘c’开头,服务器的名称以‘S’开头。

由于客户端和服务器命令共享大量参数和规范操作,因此它们被分组到这一节中,特定的项将被明确地标记为这样。

立论
-开始

在后台启动线程,处理最后一个给定的规范。

-等一下

阻塞,直到线程结束。

-运行(仅限客户端)

相当于“-开始-等待”。

-重复编号

不是只处理一次规范,而是多次处理。

-保持连接

对于重复操作,不要打开新连接,而是在同一连接中运行所有迭代

-中断(仅服务器)

停止服务器。

-监听字符串(仅服务器)

指定服务器的侦听套接字。字符串的格式为“IP Port”,或Unix域套接字的“/Path/to/Socket”。在后一种情况下,路径必须以‘/’开头,并且服务器必须能够创建它。

-连接字符串(仅限客户端)

指示要连接到的服务器。字符串的形式也是“IP端口”或“/Path/to/Socket”。与“服务器-监听”一样,当字符串以‘/’开头时,Unix域套接字被识别。

-派单(仅限服务器、仅限S0)

通常,为了简单起见,服务器线程一次只处理一个连接,但是-dispatch开关允许接受任意数量的连接,并按照给定的规范处理它们。

但是,只允许对服务器名为“S0”的服务器执行-Dispatch。

-proxy1字符串(仅限客户端)

对此连接使用代理协议版本1。字符串的格式为“CLIENTIP:PORT SERVERIP:PORT”。

-proxy2字符串(仅限客户端)

对此连接使用代理协议版本2。字符串的格式为“CLIENTIP:PORT SERVERIP:PORT”。

宏和自动行为

为了方便起见,在一般情况下,客户端将默认连接到名为v1的Varnish服务器。要连接到不同的Varnish服务器,请使用“-CONNECT${vNAME_SOCK}”。

的-vcl+后端开关 varnish 命令将所有声明的服务器添加为后端。不过请注意,服务器将默认侦听127.0.0.1 IP,并随机选择一个端口,并发布3个宏:SNAME_ADDR、SNAME_PORT和SNAME_SOCK,但仅在它们启动后才会发布。要使‘Varnish-vcl+Backend’创建具有正确值的vCL,必须首先启动服务器。

规格

它是一个字符串,可以用双引号“像这样”,但大多数时候都用大括号括起来,允许多行。在其中每行写一个命令,空行被忽略,长行可以用反斜杠换行。例如::

client c1 {
    txreq -url /foo \
          -hdr "bar: baz"

    rxresp
} -run
接受(仅服务器)

关闭当前连接(如果有)并接受新连接。请注意,这个新连接是HTTP/1.x。

组块字符串

将字符串作为分块编码发送。

Chunkedlen数

按如下方式行事 chunked 除了将为您生成长度为数字字符的字符串之外。

关闭(仅限服务器)

关闭连接。请注意,如果在HTTP/2模式下操作,则不会发送额外的(GOAWAY)帧,这只是一个TCP关闭。

预期STRING1操作STRING2

测试“STRING1 op STRING2”是否为真,如果不是,则测试失败。当STRING1和STRING2表示数字时,OP可以是==、<、<=、>、>=,在这种情况下,它是一个顺序运算符。如果STRING1和STRING2表示字符串OP是匹配运算符,则==(精确匹配)或~(正则表达式匹配)。

Varnishtest将首先尝试通过查看STRING1和STRING2是否具有特殊含义来解析它们,在这种情况下,解析的值将用于测试。请注意,此值可以是表示数字的字符串,允许进行以下测试:

expect req.http.x-num > 2

下面是可识别的字符串列表,大多数都很明显,因为它们要么匹配VCL逻辑,要么匹配txreq/txresp选项:

  • remote.ip

  • remote.port

  • remote.path

  • req.method

  • req.url

  • req.proto

  • resp.proto

  • resp.status

  • resp.reason

  • resp.chunklen

  • req.bodylen

  • req.body

  • resp.bodylen

  • resp.body

  • req.http.NAME

  • resp.http.NAME

expect_close

从连接读取,除了EOF外不需要读取任何内容。

fatal|non_fatal

控制此实体的失败是否应停止测试。

枪拉链

用枪把身体拉开。

接收编号

从连接读取数字字节。

Rxchunk

接收一个HTTP块。

Rxpri(仅服务器)

收到一篇前言。如果有效,则将服务器设置为HTTP/2,否则中止。

Rxreq(仅服务器)

接收并解析请求的头和正文。

Rxreq正文(仅服务器)

接收请求的正文。

Rxreqhdrs(仅服务器)

接收并解析请求的标头(但不是正文)。

Rxresp [-no_obj] (仅限客户端)

接收并解析响应的标头和正文。如果存在-no_obj,则只获取标头。

Rx响应体(仅限客户端)

接收响应的主体(的一部分)。

-max:本次接收的最大长度,全部为0

Rxresphdrs(仅限客户端)

接收并解析响应的标头。

发送字符串

按下连接上的绳子。

Send_n数字字符串

在插座号上写上几次字符串。

发送紧急字符串(_U)

将字符串作为TCP OOB紧急数据发送。你永远不会需要这个的。

Sendhex字符串

按字符串描述的方式发送字节。字符串应由十六进制对组成,可以用空格或换行符分隔。例如:“0F EE a5 3df2”。

设置-dectbl int

强制内部HTTP/2设置为特定值。目前仅支持设置解码表大小。

与顶级Shell相同。

溪流

HTTP/2引入了流的概念,这些流有它们自己的规范,并且由于它相当大,已经移到了它们自己的章节中。

超时次数

设置此实体的TCP超时。

Txpri(仅限客户端)

Send an HTTP/2 preface ("PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n") and set client to HTTP/2.

Txreq|txresp [...]

发送最少的请求或响应,但在必要时超载。

Txreq是客户端特定的,而txresp是服务器特定的。

除了谁可以发送它们之外,请求和响应之间唯一的不同之处在于第一行(请求行和状态行),因此所有选项基本上是相同的。

-方法字符串(仅限txreq)

使用什么方法(默认为“GET”)。

-请求字符串(仅限于txreq)

别名for-方法。

-url字符串(仅限txreq)

要使用的位置(默认为“/”)。

-原文字符串

状态行中使用的协议。(默认为“HTTP/1.1”)。

-状态号(仅限于txresp)

返回什么状态代码(默认为200)。

-原因字符串(仅限于txresp)

在状态行中放入什么消息(默认为“OK”)。

-noserver(仅限于txresp)

不要在服务器的ID中包含服务器标头。

-nouseragent(仅限于txreq)

不要在客户端的ID中包含User-Agent标头。

这三个开关可以以任何顺序出现,但必须在以下几个开关之前。

-无主机

请不要在请求中包含主机标头。也可以通过添加主机标头和 -hdr

-诺伦

不要包含内容长度的标题。也可以通过添加内容长度或传输编码报头来表示 -hdr

-无日期

不要在回复中包含日期标题。也隐含在添加一个带有 -hdr

-HDR字符串

添加字符串作为头部,必须遵循以下格式:“名称:值”。它可以被多次调用。

-hdrlen字符串号

将字符串作为标题添加,内容的字节数为1。

然后可以使用与正文相关的参数:

-正文字符串

输入字符串作为正文。

-BodyFrom文件

与正文相同,但内容是从文件中读取的。

-身体线数

生成并输入一个数字字节长的正文。

-gziplevel编号

设置GZIP级别(在任何其他GZIP开关之前调用它)。

-gzipresidual number

添加额外的GZIP比特。你永远不应该需要它。

-gzipbody字符串

GZIP字符串并将其作为正文发送。

-gziplen数

组合-bodylen和-gzipbody:生成一个长度数字字符串,将其压缩并作为正文发送。

写入正文字符串(_B)

将请求或响应的正文写入文件。通过使用Shell命令,可以对主体执行更高级别的检查(例如,XML、JSON等...)只要这样的检查可以委托给外部程序。

延迟

注意:只要给出命令,该命令就可用。

休眠参数中指定的秒数。该数字可以包括小数部分,例如1.5。

特征

测试一项测试所需的功能(S)是否可用,否则跳过测试;或更改测试的解释,如下所示。功能从该列表中获取任意数量的参数:

64位

环境为64位

IPV4

127.0.0.1作品

IPv6

[::1] 作品

DNS

域名系统查找工作正常

顶层构建

测试已以‘-i’开始

根部

该测试已被超级用户调用

user_varnish

Varnish用户在场

user_vcache

存在vcache用户

group_varnish

出现了Varnish小组

Cmd<命令行>

应该以零退出状态执行的命令行

ignore_unknown_macro

如果格式为${...}的字符串未被识别为宏,则不要使测试失败。

persistent_storage

Varnish是用过时的持久存储构建的。

覆盖率

Varnish是在启用代码覆盖率的情况下构建的。

阿山

Varnish是用地址消毒剂制成的。

MSAN

Varnish是用记忆消毒剂制成的。

灿烂

Varnish是用丝线消毒剂制成的。

子山

Varnish是用未定义的行为消毒剂制成的。

消毒剂

Varnish是用消毒剂制成的。

workspace_emulator

Varnish是用它的工作空间模拟器构建的。

abstract_uds

已成功创建抽象Unix域套接字

功能名称可以以感叹号(!)作为前缀如果该功能存在,则跳过测试。

使用IGNORE_UNKNOWN_MACRO要小心,因为它可能会导致带有拼写错误的宏的测试以静默方式失败。只有当您必须使用“${...}”形式的字符串运行测试时,才需要它。

文件写入

将字符串写入文件

文件写入 [-a] /某些文件“Hello”“”Worldn“

-a标志以追加模式打开文件。

HAProxy

定义haProxy实例并与其交互。

要定义haProxy服务器,您将使用以下语法::

haproxy hNAME -conf-OK CONFIG
haproxy hNAME -conf-BAD ERROR CONFIG
haproxy hNAME [-D] [-W] [-arg STRING] [-conf[+vcl] STRING]

第一 haproxy hNAME 调用将在后台启动haproxy主进程,等待 -start 切换以实际启动孩子。

论点:

姓名

使用字符串标识HAProxy服务器,它必须以‘h’开头。

-conf-OK配置
在‘-c’模式下运行haproxy以检查配置是否正常

Stdout/stderr应包含“配置文件有效”。退出代码应为0。

-conf-错误配置
在‘-c’模式下运行haproxy以检查配置是否错误。

“ERROR”应该是stdout/stderr诊断的一部分。退出代码应为%1。

-D

在守护程序模式下运行HAProxy。如果未指定,则使用‘-d’模式。

-W

在工作模式下启用HAProxy。

-S

在工作模式下启用HAProxy Master CLI

-arg字符串

将参数传递给haproxy,例如“-h Simple_List”。

-cli字符串

指定要由命令行界面(CLI)运行的规范。

-mcli字符串

指定要由主进程的命令行界面(CLI)运行的规范。

-会议字符串

指定此HAProxy实例要加载的配置。

-conf+后端字符串
指定此HAProxy实例要加载的配置,

所有服务器实例都将自动追加

-开始

启动此HAProxy实例。

-等一下

停止此HAProxy实例。

-期望值

期望haproxy使用此值退出(%3)

HAProxy CLI规范
预期操作符字符串

如果op为~,则正则表达式将CLI接收缓冲区与字符串匹配;反之,如果op为!~,则检查是否没有正则表达式匹配。

发送字符串

在CLI连接上按下字符串。字符串将以行尾字符(n)结尾。

LogExpect

读取VSL并查找与给定规范匹配的记录。它将处理尝试匹配第一个模式的记录,完成后将继续处理,尝试匹配以下模式。如果模式不匹配,测试将失败。

LogExpect线程是这样声明的::

logexpect lNAME -v <id> [-g <grouping>] [-d 0|1] [-q query] \
        [vsl arguments] {
                expect <skip> <vxid> <tag> <regex>
                expect <skip> <vxid> <tag> <regex>
                fail add <vxid> <tag> <regex>
                fail clear
                abort
                ...
        } [-start|-wait|-run]

一旦声明,您可以启动它们,或等待它们::

logexpect lNAME <-start|-wait>

有:

姓名

为LogExpect线程命名,它必须以‘L’开头。

-v ID

指定要使用的Varnish实例(大多数情况下,id=v1)。

-g<会话 |request| Vxid|RAW

决定记录的分组方式,请参见中的-g man varnishlog 以获取更多信息。

-d<0|1>

从日志的头部而不是尾部开始处理日志记录。

-Q查询

使用查询表达式筛选记录,请参见 man vsl-query 以获取更多信息。不支持多Q选项。

-m

还会发出未命中的日志记录(仅用于调试)

-错误

颠倒成功的含义。通常调用一次以预期LogExpect失败

-开始

在后台启动logExpect线程。

-等一下

等待logExpect线程完成

-运行

相当于“-开始-等待”。

VSL参数(类似于varnishlog选项):

-C

使用无大小写的正则表达式

-i<标记列表>

包括标签

-i< [taglist:] 正则表达式>

包括由正则表达式

-T<秒>

事务结束超时

预期规格:

跳过: [uint|*|?]

要跳过的最大记录数

Vxid: [uint|*|=]

要匹配的vxid

标签: [tagname|*|=]

要匹配的标记

正则表达式:

要匹配的正则表达式(可选)

对于跳过、vxid和标记,‘*’匹配任何内容,而‘=’需要前一条匹配记录的值。这个“?”标记等于零,应在下一条记录上匹配。不同之处在于“?”可在单个连续日志的顺序不确定时使用。换言之,替换项块中的行由“?”标记。可以以任何顺序匹配,但最终都需要匹配。

失败规范:

添加:添加到失败列表

参数等同于Expect,除了Skip Missing

清除:清除失败列表

在执行logExpect期间,任何数量的失败规范都可以处于活动状态。所有活动的失败规范都与每个日志行进行匹配,如果匹配,则logExpect立即失败。

对于要成功结束的logExpect,失败列表上不能有任何规范,因此logExpect应该始终以

期望清除失败

中止规范:

Abort(3)varnishtest,旨在帮助调试VSL客户端库本身。

循环播放

循环编号字符串

以工艺字符串为规范,数次。

这在所有规范字符串中都有效

制程

在伪终端上使用stdin+stdout运行进程,在管道上使用stderr运行进程。

来自伪终端的输出将被逐字复制到${pname_out},并且-log/-ump/-HEXDUMP标记也会将其放入vtc-log中。

伪终端未处于回显模式,但如果程序运行将其设置为回显模式(“stty sane”),则发送到进程的任何输入也将因为回显而出现在该流中。

Stderr-管道的输出将逐字复制到${pname_err},并始终包含在vtc_log中。

process pNAME SPEC [-allow-core] [-expect-exit N] [-expect-signal N]

[-dump] [-hexdump] [-log] [-run] [-close] [-kill SIGNAL] [-start] [-stop] [-wait] [-write STRING] [-writeln STRING] [-writehex HEXSTRING] [-need-bytes [+]NUMBER] [-screen-dump] [-winsz LINES COLUMNSS] [-ansi-response] [-expect-cursor LINE COLUMN] [-expect-text LINE COLUMN TEXT] [-match-text LINE COLUMN REGEXP]

Pname

进程的名称。它必须以“p”开头。

SPEC

在此进程中运行的命令(S)。

-十六进制转储

使用VTC_HEXDUMP()记录输出。必须在-开始/-运行之前。

-转储

使用VTC_DUMP()记录输出。必须在-开始/-运行之前。

-日志

使用VLU/VTC_LOG()记录输出。必须在-开始/-运行之前。

-开始

开始这一过程。

-预期-出口N

预期退出状态N

-预期-信号N

退出状态N中的预期信号

-允许核心

处于退出状态的核心转储正常

-等一下

等待该过程完成。

-运行

速记是--开始--等等。

在大多数情况下,如果您只想启动一个进程并等待其完成,则可以使用 shell 而不是命令。以下命令等效:

shell "do --something"

process p1 "do --something" -run

但是,您可以使用 process Variant可以方便地收集标准输入和输出,而无需自己处理Shell重定向。这个 shell 命令也可以期望来自任一输出的表达式,如果只需要匹配一个,请考虑使用它。

-密钥KEYSYM

发送模拟按键。KEYSYM可以是(NPAGE、PPAGE、HOME、END)之一

-取消信号

向进程发送信号。对于SIGTERM、SIGINT或SIGKILL信号,参数可以是字符串“TERM”、“INT”或“KILL”,也可以是后面跟信号编号的连字符(-)。

如果需要使用其他信号名称,可以使用 kill (1)命令直接::

shell "kill -USR1 ${pNAME_pid}"

请注意,在测试用例中不鼓励使用SIGHUP。

-停止

杀戮的速记术语。

-关闭

“-Kill HUP”的别名

-winsz行列

将端子窗口大小更改为LINE LINE和COL COLUNS。

-写入字符串

向进程的stdin写入一个字符串。

-写入字符串

与-WRITE后跟换行符(\n)相同。

-写入十六进制字符串

与-WRITE相同,但解释为十六进制字节。

-需要字节 [+] NUMBER

等待,直到至少总共接收到数目个字节。如果前缀为‘+’,则必须接收数量为新的字节。

-ansi-响应

响应终端响应回送序列

-预期-游标行列

预期游标位置

-Expect-文本行列文本

等待文本出现在虚拟屏幕上的LIN,COL。行和列的编号为1...N LIN==0表示“在任何行上”列==0表示“行上的任何位置”

-匹配-文本行列REGEXP

等待PAT正则表达式与虚拟屏幕上LIN,COL处的文本匹配。行和列的编号为1...N LIN==0表示“在任何行上”列==0表示“行上的任何位置”

-屏幕转储

将虚拟屏幕转储到vtc_log

设置环境

设置或更改环境变量::

setenv FOO "bar baz"

上面的代码会将环境变量$foo设置为提供的值。还有一个 -ifunset 仅在环境变量不存在时才设置值的参数::

setenv -ifunset FOO quux

注意:只要给出命令,该命令就可用。

将作为参数提供的字符串传递给Shell程序。如果要运行多个命令,可以使用大括号来描述多行脚本,例如::

shell {
        echo begin
        cat /etc/fstab
        echo end
}

默认情况下,预计退出代码为零,否则职训局将失败。

请注意,命令字符串以“exec 2>&1;”为前缀,以将stderr和stdout组合回测试流程。

可选参数:

-错误

应为非零退出代码。

-N号出口

预计退出代码为N而不是零。

-预期字符串

期望在stdout+err中找到字符串。

-匹配REGEXP

期望regexp与stdout+err输出匹配。

溪流

(注意:此部分位于顶层,便于导航,但它是客户端/服务器规范的一部分)

流大致映射到HTTP/2中的请求,请求在流N上发送,响应也是如此,然后流被丢弃。主要的异常是充当协调器的第一个流0。

流语法遵循客户端/服务器语法::

stream ID [SPEC] [ACTION]

Id是HTTP/2流号,而SPEC描述将在该流中执行的操作。如果ID具有值 next ,则根据最后一个来计算实际的流数。

请注意,在解析流操作时,如果实体未在HTTP/2模式下运行,则这些规范将在::

txpri/rxpri # client/server
stream 0 {
    txsettings
    rxsettings
    txsettings -ack
    rxsettings
    expect settings.ack == true
} -run

然后在解析规范之前激活HTTP/2模式。

行为
-开始

在线程中运行规范,立即归还控制权。

-等一下

等待启动的线程完成规范的运行。

-运行

相当于调用 -start 然后 -wait

规格

流的规范遵循与客户端或服务器完全相同的规则。

Txreq、txresp、txcont、txush

这四个命令用于发送报头。Txreq和txresp将发送报头帧;txcont将发送继续帧;txush推送帧。Txreq和txresp之间的唯一区别是它们各自设置的缺省报头。

-无添加

请勿添加默认标头。在使用发送默认标头时避免重复 -hdr-idxHdr-litIdxHdr

-状态int(Txresp)

设置:Status伪头。

-url字符串(txreq,txush)

设置:Path伪头。

-方法字符串(txreq,txush)

设置:方法伪头。

-请求字符串(txreq,txush)

别名for-方法。

-方案字符串(txreq,txush)

设置:方案伪头。

-HDR STRING1 STRING2

插入标题,名称为STRING1,值为STRING2。

-idxHdr int

插入索引头,使用int作为索引。

-litIdxHdr Inc. |not| Never int Huf|纯字符串

插入一个原封不动的索引标题。第一个参数指定如果/当重新传输时,头是否应该添加到表中、不应该被压缩还是必须不被压缩。

Int是要使用的标头名称的索引。

第三个参数告知关于Huffman编码:yes(Huf)或no(普通)。

最后一项是标头的文字值。

-litHdr Inc. |not| NOVER HUF|普通STRING1 HUF|普通STRING2

插入一个文字标头,第一个参数与 -litIdxHdr

第二个和第三个术语告诉标题的名称是什么,以及是否应该对其进行哈夫曼编码,而最后两个术语针对值执行相同的操作。

-正文字符串(txreq,txresp)

指定Body,有效地在发送Header帧后将字符串放入数据帧。

-bodyfrom文件(txreq,txresp)

相同于 -body 但内容是从文件中读取的。

-bodylen int(txreq,txresp)

做与做相同的事情 -body 而是为您生成一个整型长度的字符串。

-gzipbody字符串(txreq,txresp)

GZIP字符串并将其作为正文发送。

-gziplen编号(txreq,txresp)

组合-bodylen和-gzipbody:生成一个长度数字字符串,将其压缩并作为正文发送。

-nostrend(txreq,txresp)

不要自动设置END_STREAM标志,这会让对等点在报头之后期望一个正文。

-无定义

不要自动设置END_HEADERS标志,这会让对等点期待更多的标头帧。

-dep int(txreq,txresp)

告诉对等点,该内容依赖于具有int id的流。

-ex(txreq,txresp)

将依赖项设置为独占 (-dep 仍然需要)。

-权重(txreq,txresp)

设置依存关系的权重。

-承诺的int(Txush)

承诺流的ID。

-pad字符串/-padlen int(txreq,txresp,txush)

将字符串作为填充添加到框架中,无论是您提供的-Pad,还是为您生成的长度为int的字符串,都是-padlen case。

Txdata

默认情况下,数据框为空。由于在最后一个数据帧中设置了end_stream标志,因此接收端将知道整个正文已经发送,并且txdata自动设置它。

-数据字符串

要嵌入到框架中的数据。

-datalen int

生成要在帧中发送的整字节长字符串。

-Pad字符串/-Padlen int

将字符串作为填充添加到框架中,无论是您提供的-Pad,还是为您生成的长度为int的字符串,都是-padlen case。

-nostrend

不要设置END_STREAM标志,允许在该流上发送更多数据。

Rxreq、rxresp

这是两个方便的函数,用于接收传入请求或响应的头和正文。唯一的区别是rxreq只能由服务器发出,而rxresp只能由客户端发出。

Rxhdrs

rxhdrs 将期望一个标头帧,然后根据参数,零个或更多个连续帧。

-全部

继续等待连续帧,直到看到end_Headers标志。

-一些整型

检索标题帧之后的int-1个连续帧。

接收推送

它的工作原理如下 rxhdrs ,期望有一个推送帧,然后是零个或多个继续帧。

-全部

继续等待连续帧,直到看到end_Headers标志。

-一些整型

在推送帧之后检索int-1个连续帧。

接收数据

接收数据是使用 rxdata 关键字,并将检索一个数据帧,如果您希望接收更多,您可以使用这两个方便参数:

-全部

一直等待数据帧,直到设置END_STREAM标志

-一些整型

检索INT数据框。

接收一个帧,任何帧。

Sendhex

直接在线路上推送字节。Sendhex只有一个参数:以十六进制表示法描述字节的字符串,字节之间可能有空格。以下是一个示例:

sendhex "00 00 08 00 0900       8d"
Rxgoaway

接收GOAWAY帧。

Txgoaway

可能的选项包括:

-err字符串|int

设置错误代码以解释终止。第二个参数可以是整数或rfc7540#7中找到的错误代码的字符串版本。

-laststream int

GOAWAY帧的发送方可能已对其采取某些操作或仍可能对其采取操作的编号最高的流标识符的ID。

-调试

指定要追加到帧的调试数据(如果有)。

枪拉链

gunzip 用于HTTP/1的命令。

Rxping

接收ping帧。

Txping

发送ping帧。

-数据字符串

指定帧的有效负载,其中字符串为8个字符的字符串。

-确认

设置ACK标志。

Rxprio

接收优先级帧。

Txprio

发送优先级帧

-流整型

指示发送者流所依赖的流的ID。

-前

依赖项应设置为独占(仅此流依赖于父流)。

-权重整型

使用8位整数来平衡取决于相同流的流之间的优先级。

Rxrst

接收RST_STREAM帧。

Txrst

发送RST_STREAM帧。默认情况下,txrst将发送0错误代码(No_Error)。

-err字符串|int

设置要发送的错误代码。参数可以是整数或描述错误的字符串,例如NO_ERROR或CANCEL(有关更多字符串,请参见rfc7540#11.4)。

接收设置

接收设置框。

TXSETINGS

必须确认设置框,参数如下(大多数来自rfc7540#6.5.2):

-hdrtbl int

标题表大小

-推送BOOL

推流帧是否被接受

-MaxStreams整型

允许的最大并发流

-WinSize int

发件人的初始窗口大小

-帧大小整型

授权的最大帧大小

-hdrsize int

授权的表头列表的最大大小

-确认

设置ACK位

Rxwinup

接收WINDOW_UPDATE帧。

Txwinup

发送WINDOW_UPDATE帧,增加连接(从流0)或流(任何其他流)的信用量。

-大小整型

将INT积分给予同级。

写入正文字符串(_B)

write_body 用于HTTP/1的命令。

期望

Expect in stream的工作方式与其在客户端或服务器中的工作方式相同,只是比较的元素会有所不同。

这些元素中的大多数将是特定于帧的,这意味着在该流上接收的最后一帧必须是正确的类型。

下面是你可以查看的关键字列表。

GOAWAY特定
goaway.err

GOAWAY帧的错误代码(以整数表示)。

goaway.laststream

最后一个流ID

goaway.debug

调试数据(如果有)。

特定于Ping的
ping.data

Ping帧负载的8字节字符串。

Ping.ack(Ping)

如果设置了ACK标志,则为“True”,否则为“False”。

特定于优先级
prio.stream

宣布的流ID。

prio.exclusive

如果优先级是独占的,则为“True”,否则为“False”。

prio.weight

依赖项权重。

推送承诺特定(_M)
push.id

承诺流的ID。

特定于RESET_STREAM
rst.err

RESET_STREAM帧的错误代码(以整数表示)。

特定设置
settings.ack

如果设置了ACK标志,则为“”True“”,否则为“”False“”。

settings.push

如果推送设置设置为yes,则为“true”;如果设置为no,则为“False”;如果不存在,则为<undef>。

settings.hdrtbl

如果设置了HEADER_TABLE_SIZE的值,则返回<undef>。

settings.maxstreams

如果设置,则返回MAX_CURRENT_STREAMS的值,否则返回<undef>。

settings.winsize

如果设置了初始窗口大小的值,则返回<undef>。

setting.framesize

如果设置了MAX_FRAME_SIZE,则返回<undef>。

settings.hdrsize

如果设置,则为MAX_HEADER_LIST_SIZE的值,否则为<undef>。

窗口更新特定(_U)
winup.size

由WINDOW_UPDATE框架提供的升级大小。

通用框架
frame.data

最后一帧的有效载荷

frame.type

帧的类型,以整数表示。

frame.size

框架的大小。

frame.stream

帧的流(显然对应于执行此操作的那个流)。

框架填充(用于数据、标头、PUSH_PROMANE帧)

填充的字节数。

请求和响应

注意:可以在请求或响应仍在构造时(例如,在两个帧之间)检查该请求或响应。

Req.bodylen/res.bodylen

目前请求/响应的长度(以字节为单位)。

Req.Body/Res.Body

到目前为止请求/响应的正文。

Req.HTTP.STRING/res.HTTP.STRING

请求/响应中的标头字符串的值。

请求状态/响应状态

:状态伪头的值。

Req.url/res.url

:路径伪头的值。

请求方法/响应方法

:方法伪头的值。

请求权限/响应权限

:方法伪头的值。

请求方案/响应方案

:方法伪头的值。

溪流
stream.window

流的当前本地窗口大小,如果位于流0上,则为连接的当前本地窗口大小。

stream.peer_window

流的当前对等窗口大小,如果位于流0上,则为连接的当前对等窗口大小。

stream.weight

溪流的重量

stream.dependency

此流所依赖的流的ID。

索引表
Tbl.dec.size/tbl.enc.size

解码/编码表的大小(字节)。

Tbl.dec.size/tbl.enc.max

解码/编码表的最大大小(字节)。

Tbl.dec.length/tbl.enc.long

解码/编码表中的标头个数。

tbl.dec [INT] .key/tbl.enc [INT] .key

解码/编码表索引int处的标头名称。

tbl.dec [INT] .value/tbl.enc [INT] .值

解码/编码表的索引int处的标头的值。

系统日志

定义系统日志实例并与之交互(与haProxy配合使用)

要定义系统日志服务器,您将使用以下语法::

syslog SNAME

论点:

SNAME

使用必须以‘S’开头的字符串标识系统日志服务器。

-级别字符串

设置任何后续“recv”命令使用的默认系统日志优先级。任何不同级别的系统日志dgram都将被“recv”命令跳过。如果作为第一个参数“recv<Level>”提供,则此默认级别值可由“recv”命令取代。

-开始

在后台启动系统日志服务器线程。

-重复
不是只处理一次规范,而是这样做

数次。

-绑定

将系统日志套接字绑定到本地地址。

-等一下

等待该线程终止。

-停止

停止系统日志服务器线程。

隧道

隧道的目标是帮助控制双方之间的数据传输,例如在协议帧中间触发套接字超时,而无需更改双方的实现方式。

隧道接受连接,然后代表源连接到所需的目的地。一旦建立了这两个连接,隧道将在源和目的地之间原封不动地传输字节。传输可以被中断,通常是借助诸如屏障之类的同步方法。一旦暂停传输,就可以让特定数量的字节在任一方向上移动。

立论
-开始

在后台启动隧道,处理最后一个给定的规范。

-开始+暂停

正在启动隧道,但已暂停。

-等一下

阻塞,直到线程结束。

-监听字符串

指定服务器的侦听套接字。字符串的格式为“IP端口”或“主机端口”。

默认侦听本地随机端口。

-连接字符串

指示要连接到的服务器。字符串的形式也是“IP端口”或“主机端口”。

默认情况下连接到一个名为 v1

规格

该规范包含可与障碍和延迟相结合的隧道命令列表。例如::

tunnel t1 {
    barrier b1 sync
    pause
    delay 1
    send 42
    barrier b2 sync
    resume
} -start

如果隧道的一端在规范结束之前关闭,则测试用例将失败。以暂停状态结束的规范将隐含地恢复隧道。

暂停

等待传输中的字节并暂停隧道。

隧道肯定在运行。

接收编号

等待,直到数字字节从目标传输到源。

隧道必须暂停,之后仍处于暂停状态。

继续播放

恢复两个方向的字节传输。

隧道必须暂停。

发送号码

等待,直到将数量字节从源传输到目的地。

隧道必须暂停,之后仍处于暂停状态。

Varnish

定义Varnish实例并与之交互。

要定义Varnish服务器,您将使用以下语法::

varnish vNAME [-arg STRING] [-vcl STRING] [-vcl+backend STRING]
        [-errvcl STRING STRING] [-jail STRING] [-proto PROXY]

第一 varnish vNAME 调用将在后台启动varnishd主进程,等待 -start 切换以实际启动孩子。

以下描述中使用的类型:

PATTERN

是Shell文件名扩展中使用的‘GLOB’样式模式(即:fnMatch(3))。

论点:

虚拟名称

使用字符串标识Varnish服务器,它必须以‘v’开头。

-arg字符串

将参数传递给varnishd,例如“-h Simple_List”。

If the ${varnishd_args_prepend} or ${varnishd_args_append} macros are defined, they are expanded and inserted before / appended to the varnishd command line as constructed by varnishtest, before the command line itself is expanded. This enables tweaks to the varnishd command line without editing test cases. This macros can be defined using the -D option for varnishtest.

-VCL字符串

指定要在此Varnish实例上加载的VCL。您可能希望对此({...})使用多行字符串。

-VCL+后端字符串

执行与-vcl完全相同的操作,但添加了已知后端的定义块(即已定义)。

-errvclSTRING1 STRING2

将STRING2加载为VCL,预计它会失败,并使用Varnish发送与STRING1匹配的错误字符串

-监狱字符串

man varnishd (-j)了解更多信息。

-协议代理

让瓦尼什使用代理协议。请注意,这里的代理是实际的字符串。

您可以决定启动Varnish实例和/或等待以下几个事件:

varnish vNAME [-start] [-wait] [-wait-running] [-wait-stopped]
-开始

启动子进程。

成功启动后,以下宏可用于默认侦听地址: ${vNAME_addr}${vNAME_port}${vNAME_sock} 。还可以使用其他宏,包括vNAME监听的每个地址的监听地址名称,例如: ${vNAME_a0_addr}

-停止

停止该子进程。

-语法

设置此命令的VCL语法级别(默认为4.1)

-等一下

等待该实例终止。

-等待-正在运行

等待启动Varnish子进程。

-等待-已停止

等待Varnish子进程停止。

-清理

一旦停止使用Varnish,清洁它之后的所有东西。这只在很少的测试中使用,您永远不会需要它。

-期望值

期望varnishd使用此值退出(%3)

一旦启动了Varnish,您就可以与它对话(就像您通过 varnishadm )使用这些额外的交换机:

varnish vNAME [-cli STRING] [-cliok STRING] [-clierr STRING]
              [-clijson STRING]
-cli字符串|-cliok字符串|-clierr状态字符串|-cliexpect REGEXP字符串

这四种方法都会将字符串发送到CLI,唯一的区别是它们期望的结果是什么。-cli不期望任何内容,-cliok期望200,-clierr期望状态,-cliexpect期望REGEXP与返回的响应匹配。

-CLIMSON字符串

将字符串发送到CLI,期望成功(CLIS_OK/200),并检查响应是否可解析JSON。

它还可以与它的共享内存交互(就像您通过诸如 varnishstat ),带有其他交换机:

-期望!模式|模式操作号|模式操作模式

查看VSM并确保由模式识别的第一个VSC计数器具有正确的值。Op可以是==、>、>=、<、<=。例如::

varnish v1 -expect SM?.s1.g_space > 1000000
varnish v1 -expect cache_hit >= cache_hit_grace

在!如果计数器与模式匹配,则测试失败。

这个 MAIN. 模式中可以省略命名空间。

测试需要长达5秒的时间才会超时。

-vsc模式

转储与模式匹配的VSC计数器。

-vsl_Catchup

等待日志记录线程空闲,以确保刷新所有生成的日志

Varnish测试

“vtest”的别名,见上文。

VTEST

这应该是您的职业训练局中的第一个命令,因为它将使用简短但描述性的句子来识别测试用例。它只接受一个参数,一个字符串,例如::

vtest "Check that vtest is actually a valid command"

它还将在日志中打印该字符串。

HISTORY

本文由Guillaume Quintard撰写。

另请参阅