VTC
Синтаксис тестовых случаев Varnish
- Раздел руководства:
-
7
ОБЗОР
В данном документе описывается синтаксис, используемый в файлах тестовых случаев Varnish (.vtc). Файл .vtc описывает сценарий с различными управляемыми HTTP-сущностями и, как правило, одним или несколькими экземплярами Varnish для тестирования.
ПАРСИНГ
Файл .vtc будет читаться слово за словом, с минимальной токенизацией, что означает, что ошибка синтаксиса не будет обнаружена до тех пор, пока тест фактически не достигнет соответствующего действия в тесте.
Ошибка парсинга в большинстве случаев приведет к срабатыванию утверждения. В этом случае, пожалуйста, обратитесь к соответствующему исходному файлу и номеру строки. Однако это руководство должно помочь вам избежать наиболее распространенных ошибок.
Слова и строки
Парсер разделяет слова, обнаруживая пробельные символы, а строка — это слово или ряд слов в одной строке, заключённые в двойные кавычки («…») или, для многострочных строк, в фигурные скобки ({…}).
Строки и команды
Файлы тестов содержат не более одной команды на строку, причём первое слово в строке является командой, а последующие — её аргументами. Чтобы продолжить на новой строке без разрыва строки аргумента, можно экранировать символ новой строки (\n) обратной косой чертой (\).
МАКРОСЫ
При обработке строки выполняется расширение макросов. Макросы имеют вид ${<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-адрес, который разрешается в «localhost».
-
${pwd} -
Рабочий каталог, из которого был запущен
varnishtest. -
${string,<action>[,<args>...]} -
Макрос
stringявляется точкой входа для генерации текста, он выполняет специализированное действие с набором аргументов. -
${string,repeat,<uint>,<str>} -
Повторить строку
struintраз. -
${testdir} -
Директория, содержащая сценарий VTC для текущего выполнения тестового случая.
-
${tmpdir} -
Специальный рабочий каталог для текущего выполнения тестового случая, который также является текущим рабочим каталогом. Полезно, когда нужен абсолютный путь к рабочему каталогу.
-
${topbuild} -
Присутствует только при использовании опции
-i, для работы с самим Varnish вместо обычной установки.
СИНТАКСИС
barrier
ПРИМЕЧАНИЕ: Эта команда доступна везде, где разрешены команды.
Блокировки позволяют синхронизировать разные потоки, чтобы убедиться, что события происходят в правильном порядке. Их можно использовать даже в VCL.
Сначала необходимо объявить блокировку:
barrier bNAME TYPE NUMBER [-cyclic]
Аргументы:
- bNAME
-
имя блокировки, используемое для её идентификации при создании точек синхронизации. Оно должно начинаться с «b».
- TYPE
-
может быть «cond» (мьютекс) или «sock» (сокет) и устанавливает внутреннее поведение. Если вам не нужна синхронизация VCL, используйте cond.
- NUMBER
-
количество необходимых точек синхронизации для прохождения блокировки.
- -cyclic
-
если присутствует, блокировка сбросится и будет готова к новому раунду после прохождения.
Затем для добавления точки синхронизации:
barrier bNAME sync
Это заблокирует родительский поток до тех пор, пока количество точек синхронизации для bNAME не достигнет значения NUMBER, заданного в объявлении блокировки.
Если вам нужно синхронизировать VCL, необходимо объявить блокировку «sock». Это создаст определение макроса с именем «bNAME_sock», которое можно использовать в VCL (после импорта vmod vtc):
vtc.barrier_sync("${bNAME_sock}");
Эта функция возвращает 0, если всё прошло успешно, и эквивалентна barrier bNAME sync на верхнем уровне VTC.
client/server
Клиентские и серверные потоки — это фиктивные HTTP-сущности, используемые для тестирования вашего Varnish и VCL. Они принимают любое количество аргументов, а те, которые не распознаются, предполагая, что они не начинаются с «-», обрабатываются как спецификации, описывающие действия, которые необходимо выполнить:
client cNAME [...] server sNAME [...]
Клиенты и серверы идентифицируются строкой, которая является первым аргументом, имена клиентов начинаются с «c», а серверов — с «s».
Поскольку команды клиента и сервера используют значительное количество аргументов и действий со спецификациями, они сгруппированы в этом разделе, конкретные элементы будут явно отмечены как таковые.
Аргументы
- -start
-
Запустить поток в фоновом режиме, обрабатывая последнюю заданную спецификацию.
- -wait
-
Заблокировать, пока поток не завершится.
- -run (только для клиента)
-
Эквивалентно «-start -wait».
- -repeat NUMBER
-
Вместо обработки спецификации только один раз, обработать её NUMBER раз.
- -keepalive
-
Для повторения не открывать новые подключения, а вместо этого выполнять все итерации в одном подключении.
- -break (только для сервера)
-
Остановить сервер.
- -listen STRING (только для сервера)
-
Укажите сокет для прослушивания сервером. STRING имеет вид «IP PORT» или «/PATH/TO/SOCKET» для сокета Unix. В последнем случае путь должен начинаться с «/», и сервер должен иметь возможность его создать.
- -connect STRING (только для клиента)
-
Укажите сервер для подключения. STRING также имеет вид «IP PORT» или «/PATH/TO/SOCKET». Как и в случае с «server -listen», сокет Unix распознаётся, когда STRING начинается с «/».
- -dispatch (только для сервера, s0 только)
-
Обычно для простоты серверные потоки обрабатывают только одно подключение за раз, но переключатель -dispatch позволяет принять любое количество подключений и обработать их в соответствии с заданной спецификацией.
Однако -dispatch разрешён только для сервера с именем «s0».
- -proxy1 STRING (только для клиента)
-
Использовать протокол PROXY версии 1 для этого подключения. STRING имеет вид «CLIENTIP:PORT SERVERIP:PORT».
- -proxy2 STRING (только для клиента)
-
Использовать протокол PROXY версии 2 для этого подключения. STRING имеет вид «CLIENTIP:PORT SERVERIP:PORT».
Макросы и автоматическое поведение
Для упрощения в общем случае клиенты по умолчанию подключаются к серверу Varnish с именем v1. Для подключения к другому серверу Varnish используйте «-connect ${vNAME_sock}».
Переключатель -vcl+backend команды varnish добавит все объявленные серверы в качестве бэкэндов. Однако будьте внимательны, серверы по умолчанию будут прослушивать IP 127.0.0.1 и будут выбирать случайный порт, а также публиковать 3 макроса: sNAME_addr, sNAME_port и sNAME_sock, но только после их запуска. Для того, чтобы команда «varnish -vcl+backend» создала vcl с правильными значениями, сервер должен быть запущен первым.
Спецификация
Это строка, либо в двойных кавычках “как это”, но чаще всего заключённая в фигурные скобки, что позволяет использовать многострочные записи. В ней записывается одна команда на строку, пустые строки игнорируются, а длинные строки можно продолжить с помощью обратного слэша. Например:
client c1 {
txreq -url /foo \
-hdr "bar: baz"
rxresp
} -run
- accept (только для сервера)
-
Закрывает текущее соединение, если оно есть, и принимает новое. Обратите внимание, что это новое соединение использует HTTP/1.x.
- chunked STRING
-
Отправляет STRING в кодировке chunked.
- chunkedlen NUMBER
-
Делает то же, что и
chunked, за исключением того, что строка будет сгенерирована для вас с длиной в NUMBER символов.
- close (только для сервера)
-
Закрывает соединение. Обратите внимание, что если используется режим HTTP/2, то дополнительная рамка (GOAWAY) не отправляется; это просто закрытие TCP.
- expect STRING1 OP STRING2
-
Проверяет, является ли «STRING1 OP STRING2» истинным; если нет, тест завершается неудачей. OP может быть ==, <, <=, >, >=, когда STRING1 и STRING2 представляют числа, в этом случае это оператор сравнения. Если 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
-
Управляет тем, должна ли остановка тестирования при ошибке этой сущности.
- gunzip
-
Декомпрессирует тело в месте.
- recv NUMBER
-
Считывает NUMBER байтов из соединения.
- rxchunk
-
Получает HTTP-часть.
- rxpri (только для сервера)
-
Получает префикс. Если он корректен, устанавливает сервер в HTTP/2; в противном случае прерывается.
- rxreq (только для сервера)
-
Получает и анализирует заголовки и тело запроса.
- rxreqbody (только для сервера)
-
Получает тело запроса.
- rxreqhdrs (только для сервера)
-
Получает и анализирует заголовки запроса (но не тело).
- rxresp [-no_obj] (только для клиента)
-
Получает и анализирует заголовки и тело ответа. Если присутствует -no_obj, то получаются только заголовки.
- rxrespbody (только для клиента)
-
Получает (часть) тела ответа.
-max : максимальная длина этого приема, 0 — для всего
- rxresphdrs (только для клиента)
-
Получает и анализирует заголовки ответа.
- send STRING
-
Отправляет STRING по соединению.
- send_n NUMBER STRING
-
Записывает STRING в сокет NUMBER раз.
- send_urgent STRING
-
Отправляет строку как срочные данные TCP OOB. Вам это, скорее всего, не понадобится.
- sendhex STRING
-
Отправляет байты, как описано в STRING. STRING должен состоять из шестнадцатеричных пар, возможно, разделённых пробелами или переводами строк. Например: «0F EE a5 3df2».
- settings -dectbl INT
-
Принудительно устанавливает внутренние настройки HTTP/2 на определённые значения. В настоящее время поддерживается только установка размера таблицы декодирования.
- shell
-
То же, что и в командной оболочке верхнего уровня.
- stream
-
HTTP/2 вводит понятие потоков, и для них есть своя спецификация, которая довольно большая и перенесена в отдельную главу.
- timeout NUMBER
-
Устанавливает таймаут TCP для этой сущности.
- txpri (только для клиента)
-
Отправляет префикс HTTP/2 («PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n») и устанавливает клиент в HTTP/2.
- txreq|txresp […]
-
Отправляет минимальный запрос или ответ, но перегружает его при необходимости.
txreq специфичен для клиента, а txresp — для сервера.
Единственное отличие между запросом и ответом, кроме того, кто их отправляет, — это первая строка (строка запроса против строки состояния), поэтому все параметры практически одинаковы.
- -method STRING (только для txreq)
-
Используемый метод (по умолчанию: «GET»).
- -req STRING (только для txreq)
-
Псевдоним для -method.
- -url STRING (только для txreq)
-
Используемый путь (по умолчанию «/»).
- -proto STRING
-
Используемый протокол в строке состояния (по умолчанию «HTTP/1.1»).
- -status NUMBER (только для txresp)
-
Код состояния, который нужно вернуть (по умолчанию 200).
- -reason STRING (только для txresp)
-
Сообщение, которое нужно поместить в строку состояния (по умолчанию «OK»).
- -noserver (только для txresp)
-
Не включать заголовок Server с идентификатором сервера.
- -nouseragent (только для txreq)
-
Не включать заголовок User-Agent с идентификатором клиента.
Эти три переключателя могут быть в любом порядке, но должны предшествовать следующим.
- -nohost
-
Не включать заголовок Host в запрос. Также подразумевается добавление заголовка Host со значением
-hdr. - -nolen
-
Не включать заголовок Content-Length. Также подразумевается добавление заголовка Content-Length или Transfer-Encoding со значением
-hdr. - -nodate
-
Не включать заголовок Date в ответе. Также подразумевается добавление заголовка Date со значением
-hdr. - -hdr STRING
-
Добавляет STRING как заголовок, он должен иметь формат «name: value». Его можно вызывать несколько раз.
- -hdrlen STRING NUMBER
-
Добавляет STRING как заголовок с содержимым объёмом NUMBER байтов.
Затем можно использовать аргументы, относящиеся к телу:
- -body STRING
-
В качестве тела используется STRING.
- -bodyfrom FILE
-
Аналогично -body, но содержимое считывается из файла FILE.
- -bodylen NUMBER
-
Генерируется и вводится тело длиной в NUMBER байт.
- -gziplevel NUMBER
-
Устанавливает уровень gzip (вызывается перед любыми другими переключателями gzip).
- -gzipresidual NUMBER
-
Добавляются дополнительные биты gzip. Вам это, скорее всего, не понадобится.
- -gzipbody STRING
-
Сжимает STRING с помощью gzip и отправляет его как тело.
- -gziplen NUMBER
-
Сочетает -bodylen и -gzipbody: генерирует строку длиной NUMBER, сжимает её с помощью gzip и отправляет как тело.
- write_body STRING
-
Записывает тело запроса или ответа в файл. Используя команду оболочки, можно проводить проверки тела на более высоком уровне (например, XML, JSON), если такие проверки могут быть делегированы внешней программе.
delay
ПРИМЕЧАНИЕ: Эта команда доступна везде, где доступны команды.
Ожидание в течение указанного в аргументе количества секунд. Число может включать дробную часть, например, 1,5.
feature
Проверяет, доступны ли необходимые функции для теста, и пропускает тест в противном случае; или изменяет интерпретацию теста, как описано ниже. feature принимает любое количество аргументов из этого списка:
- 64bit
-
Среда 64-битная
- ipv4
-
127.0.0.1 работает
- ipv6
-
[::1] работает
- dns
-
Работают DNS-запросы
- topbuild
-
Тест запущен с флагом «-i»
- root
-
Тест запущен пользователем root
- user_varnish
-
Пользователь varnish существует
- user_vcache
-
Пользователь vcache существует
- group_varnish
-
Группа varnish существует
- cmd <command-line>
-
Командная строка, которая должна выполняться с нулевым кодом возврата
- ignore_unknown_macro
-
Не завершать тест, если строка вида ${…} не распознаётся как макрос.
- persistent_storage
-
Varnish был собран с устаревшим хранилищем persistent storage.
- coverage
-
Varnish был собран с включённым инструментом code coverage.
- asan
-
Varnish был собран с address sanitizer.
- msan
-
Varnish был собран с memory sanitizer.
- tsan
-
Varnish был собран с thread sanitizer.
- ubsan
-
Varnish был собран с undefined behavior sanitizer.
- sanitizer
-
Varnish был собран с sanitizer.
- workspace_emulator
-
Varnish был собран с его эмулятором рабочей области.
- abstract_uds
-
Создание абстрактного сокета unix domain socket прошло успешно
Имя функции может быть с префиксом «!» для пропуска теста, если функция присутствует.
Будьте осторожны с ignore_unknown_macro, так как это может привести к тому, что тест с ошибочно написанным макросом завершится неудачей без сообщения об ошибке. Вам это нужно только в том случае, если вам необходимо выполнить тест со строками вида «${…}».
filewrite
Запись строк в файл
filewrite [-a] /somefile “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 переключение фактически запустит дочерний процесс.
Аргументы:
- hNAME
-
Идентифицирует сервер HAProxy строкой, она должна начинаться с символа ‘h’.
- -conf-OK CONFIG
-
- Запустить haproxy в режиме ‘-c’ для проверки конфигурации на корректность
-
stdout/stderr должны содержать строку ‘Configuration file is valid’. Код возврата должен быть 0.
- -conf-BAD ERROR CONFIG
-
- Запустить haproxy в режиме ‘-c’ для проверки конфигурации на ошибки.
-
Строка “ERROR” должна быть частью диагностики в stdout/stderr. Код возврата должен быть 1.
- -D
-
Запустить HAproxy в режиме демона. Если не указан, используется режим ‘-d’.
- -W
-
Включить режим работы HAproxy в режиме Рабочего процесса.
- -S
-
Включить мастер-интерфейс командной строки HAproxy в режиме Рабочего процесса.
- -arg STRING
-
Передать аргумент haproxy, например “-h simple_list”.
- -cli STRING
-
Указать спецификацию для выполнения в командной строке (CLI).
- -mcli STRING
-
Указать спецификацию для выполнения в командной строке (CLI) мастера-процесса.
- -conf STRING
-
Указать конфигурацию, которую должен загрузить этот экземпляр HAProxy.
- -conf+backend STRING
-
- Указать конфигурацию, которую должен загрузить этот экземпляр HAProxy,
-
все экземпляры серверов будут автоматически добавлены
- -start
-
Запустить этот экземпляр HAProxy.
- -wait
-
Остановить этот экземпляр HAProxy.
- -expectexit NUMBER
-
Ожидать завершения работы haproxy с указанным значением
Спецификация CLI haproxy
- expect OP STRING
-
Сопоставить строку в буфере приема CLI с STRING, если OP — ~, или, наоборот, если OP — !~, проверить, что совпадения по регулярному выражению нет.
- send STRING
-
Отправить STRING по соединению CLI. STRING будет завершаться символом конца строки (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>
С помощью:
- lNAME
-
Назовите поток logexpect, он должен начинаться с символа ‘l’.
- -v id
-
Указать экземпляр varnish для использования (в большинстве случаев, id=v1).
- -g <session|request|vxid|raw
-
Определить, как группируются записи, см. -g в
man varnishlogдля получения дополнительной информации. - -d <0|1>
-
Начать обработку записей журнала с начала журнала, а не с конца.
- -q query
-
Фильтр записей с использованием запроса, см.
man vsl-queryдля получения дополнительной информации. Несколько опций -q не поддерживаются. - -m
-
Также отображать записи журнала для пропусков (только для отладки)
- -err
-
Инвертировать значение успешного выполнения. Обычно используется один раз, чтобы ожидать, что logexpect завершится неудачей
- -start
-
Запустить поток logexpect в фоновом режиме.
- -wait
-
Дождаться завершения потока logexpect
- -run
-
Эквивалентно “-start -wait”.
Аргументы VSL (аналогичны параметрам varnishlog):
- -C
-
Использовать регистронезависимое регулярное выражение
- -i <taglist>
-
Включить теги
- -I <[taglist:]regex>
-
Включить по регулярному выражению
- -T <seconds>
-
Таймаут завершения транзакции
Спецификация expect:
- skip: [uint|*|?]
-
Максимальное количество записей для пропуска
- vxid: [uint|*|=]
-
vxid для сопоставления
- tag: [tagname|*|=]
-
Тег для сопоставления
- regex:
-
регулярное выражение для сопоставления (необязательно)
Для skip, vxid и tag, ‘*’ сопоставляет все, ‘=’ ожидает значения предыдущей сопоставленной записи. Маркер ‘?’ эквивалентен нулю, ожидая совпадения в следующей записи. Различие заключается в том, что ‘?’ можно использовать, когда порядок отдельных последовательных логов не детерминирован. Другими словами, строки из блока альтернатив, помеченных ‘?’, могут быть сопоставлены в любом порядке, но все они должны быть сопоставлены в конечном итоге.
Спецификация fail:
add: Добавить в список ошибок
Аргументы эквивалентны expect, за исключением пропущенного skip.
clear: Очистить список ошибок
Во время выполнения logexpect может быть активно любое количество спецификаций fail. Все активные спецификации fail сопоставляются с каждой строкой лога, и если какое-либо совпадение найдено, logexpect немедленно завершается неудачей.
Для успешного завершения logexpect не должно быть спецификаций в списке ошибок, поэтому logexpect всегда должен завершаться
expect <skip> <vxid> <tag> <условие_завершения> fail clear
Спецификация abort:
abort(3) varnishtest, предназначена для отладки самой библиотеки клиента VSL.
loop
- loop NUMBER STRING
-
Обработать STRING как спецификацию NUMBER раз.
Это работает внутри всех строк спецификаций
process
Запустить процесс со stdin+stdout на псевдотерминале и stderr в pipe.
Вывод с псевдотерминала копируется дословно в ${pNAME_out}, а флаги -log/-dump/-hexdump также помещают его в vtc-log.
Псевдотерминал не находится в режиме ECHO, но если запущенные программы устанавливают его в режим ECHO (“stty sane”), любой ввод, отправленный процессу, также отобразится в этом потоке из-за ECHO.
Вывод из stderr-pipe копируется дословно в ${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
-
Команда(ы) для выполнения в этом процессе.
- -hexdump
-
Логировать вывод с использованием vtc_hexdump(). Должно быть указано до -start/-run.
- -dump
-
Логировать вывод с использованием vtc_dump(). Должно быть указано до -start/-run.
- -log
-
Логировать вывод с использованием VLU/vtc_log(). Должно быть указано до -start/-run.
- -start
-
Запустить процесс.
- -expect-exit N
-
Ожидать код возврата N
- -expect-signal N
-
Ожидать сигнал в коде возврата N
- -allow-core
-
Сброс ядра при выходе — OK
- -wait
-
Дождаться завершения процесса.
- -run
-
Сокращение для -start -wait.
В большинстве случаев, если вам нужно просто запустить процесс и дождаться его завершения, вы можете использовать вместо него команду
shell. Следующие команды эквивалентны:shell "do --something" process p1 "do --something" -run
Однако, вы можете использовать вариант
process, чтобы удобно собирать стандартный ввод и вывод, не занимаясь перенаправлением оболочки самостоятельно. Командаshellтакже может ожидать выражение из вывода, рассмотрите её использование, если вам нужно только сопоставить одно. - -key KEYSYM
-
Отправить эмулированное нажатие клавиши. KEYSYM может быть одним из (NPAGE, PPAGE, HOME, END)
- -kill SIGNAL
-
Отправить сигнал процессу. Аргументом может быть строка “TERM”, “INT” или “KILL” для сигналов SIGTERM, SIGINT или SIGKILL соответственно, или дефис (-) с номером сигнала.
Если вам нужно использовать другие имена сигналов, вы можете использовать команду
kill(1) напрямую:shell "kill -USR1 ${pNAME_pid}"Обратите внимание, что использование SIGHUP в тестовых случаях не рекомендуется.
- -stop
-
Сокращение для -kill TERM.
- -close
-
Псевдоним для “-kill HUP”
- -winsz LINES COLUMNS
-
Изменить размер окна терминала на LIN строк и COL столбцов.
- -write STRING
-
Записать строку в стандартный ввод процесса.
- -writeln STRING
-
То же, что -write, за которым следует символ новой строки (\n).
- -writehex HEXSTRING
-
То же, что -write, но интерпретируется как шестнадцатеричные байты.
- -need-bytes [+]NUMBER
-
Подождать, пока не будет получено как минимум NUMBER байтов в сумме. Если ‘+’ предваряет NUMBER, нужно получить NUMBER новых байтов.
- -ansi-response
-
Отвечать на последовательности ответа терминала
- -expect-cursor LINE COLUMN
-
Ожидать расположения курсора
- -expect-text LINE COLUMNS TEXT
-
Дождаться появления TEXT в позиции LIN,COL на виртуальном экране. Строки и столбцы нумеруются от 1 до N. LIN==0 означает “в любой строке”, COL==0 означает “в любом месте строки”
- -match-text LINE COLUMN REGEXP
-
Дождаться, пока REGEXP сопоставится с текстом в позиции LIN,COL на виртуальном экране. Строки и столбцы нумеруются от 1 до N. LIN==0 означает “в любой строке”, COL==0 означает “в любом месте строки”
- -screen-dump
-
Сделать дамп виртуального экрана в vtc_log
setenv
Установить или изменить переменную среды:
setenv FOO "bar baz"
Вышеуказанное действие установит переменную среды $FOO в указанное значение. Также есть аргумент -ifunset, который установит значение только в том случае, если переменная среды ещё не существует:
setenv -ifunset FOO quux
shell
ПРИМЕЧАНИЕ: Эта команда доступна везде, где доступны команды.
Передать строку, указанную в качестве аргумента, в оболочку. Если вам нужно выполнить несколько команд, вы можете использовать фигурные скобки для описания многострочного скрипта, например:
shell {
echo begin
cat /etc/fstab
echo end
}
По умолчанию ожидается код возврата 0, в противном случае vtc завершится неудачей.
Обратите внимание, что строка команды предваряется “exec 2>&1;” для объединения stderr и stdout обратно в тестовый процесс.
Необязательные аргументы:
- -err
-
Ожидать код возврата, отличный от нуля.
- -exit N
-
Ожидать код возврата N вместо нуля.
- -expect STRING
-
Ожидать, что строка будет найдена в stdout+err.
- -match REGEXP
-
Ожидать, что regexp будет сопоставлен с выводом stdout+err.
Поток
(примечание: этот раздел находится на верхнем уровне для удобства навигации, но он является частью спецификации клиент/сервер)
Потоки примерно соответствуют запросу в HTTP/2. Запрос отправляется по потоку N, ответ тоже, затем поток удаляется. Основное исключение — первый поток 0, который служит координатором.
Синтаксис потока следует за синтаксисом клиент/сервер:
stream ID [SPEC] [ACTION]
ID — это номер потока HTTP/2, а SPEC описывает, что будет сделано в этом потоке.
Обратите внимание, что при обработке действия потока, если приложение не работает в режиме HTTP/2, эта спецификация выполняется до:
txpri/rxpri # client/server
stream 0 {
txsettings
rxsettings
txsettings -ack
rxsettings
expect settings.ack == true
} -run
И режим HTTP/2 активируется перед обработкой спецификации.
Действия
- -start
-
Выполнить спецификацию в потоке, немедленно вернув управление.
- -wait
-
Подождать завершения выполнения спецификации запущенным потоком.
- -run
-
эквивалентно вызову
-startзатем-wait.
Спецификация
Спецификация потока следует тем же правилам, что и спецификация клиента или сервера.
txreq, txresp, txcont, txpush
Эти четыре команды связаны с отправкой заголовков. txreq и txresp отправят кадр HEADER; txcont отправит кадр CONTINUATION; txpush — кадр PUSH.
Единственное различие между txreq и txresp — это значения заголовков по умолчанию, устанавливаемые каждой из них.
- -noadd
-
Не добавлять заголовки по умолчанию. Полезно для предотвращения дублирования при отправке заголовков по умолчанию с помощью
-hdr,-idxHdrи-litIdxHdr. - -status INT (txresp)
-
Установить псевдозаголовок :status.
- -url STRING (txreq, txpush)
-
Установить псевдозаголовок :path.
- -method STRING (txreq, txpush)
-
Установить псевдозаголовок :method.
- -req STRING (txreq, txpush)
-
Псевдоним для -method.
- -scheme STRING (txreq, txpush)
-
Установить псевдозаголовок :scheme.
- -hdr STRING1 STRING2
-
Вставить заголовок, STRING1 — имя, STRING2 — значение.
- -idxHdr INT
-
Вставить индексированный заголовок, используя INT в качестве индекса.
- -litIdxHdr inc|not|never INT huf|plain STRING
-
Вставить литеральный, индексированный заголовок. Первый аргумент указывает, должен ли заголовок добавляться в таблицу, не должен или не должен быть сжат при повторной передаче.
INT — индекс имени заголовка для использования.
Третий аргумент указывает на кодирование Хаффмана: да (huf) или нет (plain).
Последний элемент — буквальное значение заголовка.
- -litHdr inc|not|never huf|plain STRING1 huf|plain STRING2
-
Вставить литеральный заголовок, с таким же первым аргументом, как и
-litIdxHdr.Второй и третий элементы указывают имя заголовка и нужно ли кодировать его с помощью Хаффмана, а последние два — то же самое для значения.
- -body STRING (txreq, txresp)
-
Указать тело, эффективно поместив STRING в кадр DATA после отправки кадра HEADER.
- -bodyfrom FILE (txreq, txresp)
-
То же, что и
-body, но содержимое читается из FILE. - -bodylen INT (txreq, txresp)
-
То же, что и
-body, но генерирует строку длиной INT. - -gzipbody STRING (txreq, txresp)
-
Сжать STRING с помощью gzip и отправить как тело.
- -gziplen NUMBER (txreq, txresp)
-
Сочетает -bodylen и -gzipbody: генерирует строку длиной NUMBER, сжимает её с помощью gzip и отправляет как тело.
- -nostrend (txreq, txresp)
-
Не устанавливать автоматически флаг END_STREAM, заставляя сопутствующее приложение ожидать тело после заголовков.
- -nohdrend
-
Не устанавливать автоматически флаг END_HEADERS, заставляя сопутствующее приложение ожидать дополнительные кадры HEADER.
- -dep INT (txreq, txresp)
-
Указать сопутствующему приложению, что это содержимое зависит от потока с ID INT.
- -ex (txreq, txresp)
-
Сделать зависимость эксклюзивной (
-depвсё ещё требуется). - -weight (txreq, txresp)
-
Установить вес для зависимости.
- -promised INT (txpush)
-
ID потока, который был обещан.
- -pad STRING / -padlen INT (txreq, txresp, txpush)
-
Добавить строку в качестве заполнения в кадр — либо указанную строку с помощью -pad, либо сгенерированную строку длиной INT в случае -padlen.
txdata
По умолчанию кадры данных пустые. Принимающая сторона узнает, что всё тело было передано благодаря флагу END_STREAM, установленного в последнем кадре DATA, и txdata автоматически его устанавливает.
- -data STRING
-
Данные, которые нужно вставить в кадр.
- -datalen INT
-
Сгенерировать и отправить строку длиной INT байт в кадре.
- -pad STRING / -padlen INT
-
Добавить строку в качестве заполнения в кадр — либо указанную строку с помощью -pad, либо сгенерированную строку длиной INT в случае -padlen.
- -nostrend
-
Не устанавливать флаг END_STREAM, позволяя отправить больше данных по этому потоку.
rxreq, rxresp
Это две вспомогательные функции для получения заголовков и тела входящего запроса или ответа. Единственное отличие — rxreq может использоваться только сервером, а rxresp — только клиентом.
rxhdrs
rxhdrs будет ожидать один кадр HEADER, а затем, в зависимости от аргументов, ноль или более кадров CONTINUATION.
- -all
-
Продолжать ожидать кадров CONTINUATION до тех пор, пока не будет виден флаг END_HEADERS.
- -some INT
-
Получить INT - 1 кадров CONTINUATION после кадра HEADER.
rxpush
Это работает как rxhdrs, ожидая кадр PUSH, а затем ноль или более кадров CONTINUATION.
- -all
-
Продолжать ожидать кадров CONTINUATION до тех пор, пока не будет виден флаг END_HEADERS.
- -some INT
-
Получить INT - 1 кадров CONTINUATION после кадра PUSH.
rxdata
Приём данных выполняется с помощью ключевых слов rxdata, и будет получен один кадр DATA. Если вы хотите получить больше, можно использовать следующие два удобных аргумента:
- -all
-
продолжать ожидать кадров DATA до тех пор, пока один из них не установит флаг END_STREAM
- -some INT
-
получить INT кадров DATA.
Принять любой кадр.
sendhex
Прямая отправка байтов по сети. sendhex принимает ровно один аргумент: строку, описывающую байты в шестнадцатеричном формате с возможными пробелами между ними. Вот пример:
sendhex "00 00 08 00 0900 8d"
rxgoaway
Получение кадра GOAWAY.
txgoaway
Возможные варианты включают:
- -err STRING|INT
-
установить код ошибки для пояснения завершения. Второй аргумент может быть целым числом или строковой версией кода ошибки, как указано в rfc7540#7.
- -laststream INT
-
ID «наибольшего номера идентификатора потока, для которого отправитель кадра GOAWAY мог выполнить какое-либо действие или может выполнить действие».
- -debug
-
указать данные отладки, если есть, для добавления к кадру.
gunzip
Аналогично команде gunzip для HTTP/1.
rxping
Приём кадра PING.
txping
Отправка кадра PING.
- -data STRING
-
указать полезную нагрузку кадра, где STRING — строка длиной 8 символов.
- -ack
-
установить флаг ACK.
rxprio
Приём кадра PRIORITY.
txprio
Отправка кадра PRIORITY.
- -stream INT
-
указать ID потока, от которого зависит поток отправителя.
- -ex
-
зависимость должна быть сделана эксклюзивной (только этот поток зависит от родительского потока).
- -weight INT
-
используется 8-битовое целое число для балансировки приоритета между потоками, зависящими от тех же потоков.
rxrst
Приём кадра RST_STREAM.
txrst
Отправка кадра RST_STREAM. По умолчанию txrst отправит код ошибки 0 (NO_ERROR).
- -err STRING|INT
-
устанавливает код ошибки для отправки. Аргументом может быть целое число или строка, описывающая ошибку, например, NO_ERROR или CANCEL (см. rfc7540#11.4 для других строк).
rxsettings
Приём кадра SETTINGS.
txsettings
Кадры SETTINGS должны быть подтверждены, аргументы следующие (большинство из них из rfc7540#6.5.2):
- -hdrtbl INT
-
размер таблицы заголовков
- -push BOOL
-
поддерживаются ли кадры push
- -maxstreams INT
-
максимальное количество одновременных потоков
- -winsize INT
-
начальный размер окна отправителя
- -framesize INT
-
размер самого большого кадра
- -hdrsize INT
-
максимальный размер списка заголовков
- -ack
-
установить бит подтверждения
rxwinup
Приём кадра WINDOW_UPDATE.
txwinup
Передача кадра WINDOW_UPDATE, увеличивая количество кредитов соединения (из потока 0) или потока (любой другой поток).
- -size INT
-
дать INT кредитов сопутствующему приложению.
- write_body STRING
-
Аналогично команде
write_bodyдля HTTP/1.
expect
expect в потоке работает так же, как и в клиенте или сервере, за исключением того, что сравниваемые элементы будут отличаться.
Большинство этих элементов будут специфичны для кадра, что означает, что последний полученный кадр в этом потоке должен быть правильного типа.
Вот список ключевых слов, которые вы можете изучить.
Специфика GOAWAY
- goaway.err
-
Код ошибки (как целое число) кадра GOAWAY.
- goaway.laststream
-
Последний идентификатор потока.
- goaway.debug
-
Данные отладки, если таковые имеются.
Специфика PING
- ping.data
-
Строка из 8 байтов полезной нагрузки кадра PING.
- ping.ack (PING)
-
“true”, если флаг ACK был установлен, “false” в противном случае.
Специфика PRIORITY
- prio.stream
-
Объявленный идентификатор потока.
- prio.exclusive
-
“true”, если приоритет является эксклюзивным, иначе “false”.
- prio.weight
-
Вес зависимости.
Специфика PUSH_PROMISE
- push.id
-
Идентификатор обещанного потока.
Специфика RESET_STREAM
- rst.err
-
Код ошибки (как целое число) кадра RESET_STREAM.
Специфика SETTINGS
- settings.ack
-
“true”, если флаг ACK был установлен, иначе “false”.
- settings.push
-
“true”, если настройки push были установлены в «да», “false”, если установлены в «нет», и <undef>, если отсутствуют.
- settings.hdrtbl
-
Значение HEADER_TABLE_SIZE, если установлено, <undef> в противном случае.
- settings.maxstreams
-
Значение MAX_CONCURRENT_STREAMS, если установлено, <undef> в противном случае.
- settings.winsize
-
Значение INITIAL_WINDOW_SIZE, если установлено, <undef> в противном случае.
- setting.framesize
-
Значение MAX_FRAME_SIZE, если установлено, <undef> в противном случае.
- settings.hdrsize
-
Значение MAX_HEADER_LIST_SIZE, если установлено, <undef> в противном случае.
Специфика WINDOW_UPDATE
- winup.size
-
Размер обновления, заданный кадром WINDOW_UPDATE.
Общий кадр
- frame.data
-
Полезная нагрузка последнего кадра.
- frame.type
-
Тип кадра, как целое число.
- frame.size
-
Размер кадра.
- frame.stream
-
Поток кадра (соответствует потоку, из которого вы выполняете это действие).
- frame.padding (для кадров DATA, HEADERS, PUSH_PROMISE)
-
Количество байтов заполнения.
Запрос и ответ
Примечание: возможно просмотреть запрос или ответ, пока он ещё формируется (например, между двумя кадрами).
- req.bodylen / resp.bodylen
-
Длина запроса/ответа в байтах на данный момент.
- req.body / resp.body
-
Тело запроса/ответа на данный момент.
- req.http.STRING / resp.http.STRING
-
Значение заголовка STRING в запросе/ответе.
- req.status / resp.status
-
Значение псевдозаголовка :status.
- req.url / resp.url
-
Значение псевдозаголовка :path.
- req.method / resp.method
-
Значение псевдозаголовка :method.
- req.authority / resp.authority
-
Значение псевдозаголовка :method.
- req.scheme / resp.scheme
-
Значение псевдозаголовка :method.
Поток
- stream.window
-
Текущий локальный размер окна потока или, если это поток 0, размер окна соединения.
- stream.peer_window
-
Текущий размер окна peer потока или, если это поток 0, размер окна соединения.
- stream.weight
-
Вес потока.
- stream.dependency
-
Идентификатор потока, от которого зависит этот поток.
Таблицы индексов
- tbl.dec.size / tbl.enc.size
-
Размер (в байтах) таблицы декодирования/кодирования.
- tbl.dec.size / tbl.enc.maxsize
-
Максимальный размер (в байтах) таблицы декодирования/кодирования.
- tbl.dec.length / tbl.enc.length
-
Количество заголовков в таблице декодирования/кодирования.
- tbl.dec[INT].key / tbl.enc[INT].key
-
Имя заголовка в индексе INT таблицы декодирования/кодирования.
- tbl.dec[INT].value / tbl.enc[INT].value
-
Значение заголовка в индексе INT таблицы декодирования/кодирования.
syslog
Определение и взаимодействие с экземплярами syslog (для использования с haproxy).
Для определения сервера syslog используется следующий синтаксис:
syslog SNAME
Аргументы:
- SNAME
-
Идентификатор сервера syslog строкой, которая должна начинаться с 'S'.
- -level STRING
-
Установите уровень приоритета syslog по умолчанию, используемый любым последующим командным «recv». Любой syslog-dgram с другим уровнем будет пропущен командой «recv». Это значение уровня по умолчанию может быть заменено командой «recv», если она указана в качестве первого аргумента: «recv <level>».
- -start
-
Запустите поток сервера syslog в фоновом режиме.
- -repeat
-
- Вместо обработки спецификации только один раз, обработайте ее
-
NUMBER раз.
- -bind
-
Свяжите сокет syslog с локальным адресом.
- -wait
-
Подождите завершения этого потока.
- -stop
-
Остановите поток сервера syslog.
tunnel
Цель туннеля — помочь контролировать передачу данных между двумя сторонами, например, для запуска тайм-аутов сокета в середине кадров протокола, без необходимости изменения реализации обеих сторон.
Туннель принимает соединение и затем подключается от имени источника к нужному пункту назначения. После установления обоих соединений туннель будет передавать байты без изменений между источником и пунктом назначения. Передача может быть прервана, обычно с помощью методов синхронизации, таких как барьеры. После приостановки передачи можно разрешить передачу определенного количества байтов в любом направлении.
Аргументы
- -start
-
Запустить туннель в фоновом режиме, обрабатывая последнюю заданную спецификацию.
- -start+pause
-
Запустить туннель, но уже приостановленным.
- -wait
-
Ожидать завершения потока.
- -listen STRING
-
Укажите сокет для прослушивания сервером. STRING имеет вид «IP PORT» или «HOST PORT».
По умолчанию прослушивает на случайном локальном порте.
- -connect STRING
-
Укажите сервер для подключения. STRING также имеет вид «IP PORT» или «HOST PORT».
По умолчанию подключается к экземпляру varnish под названием
v1.
Спецификация
Спецификация содержит список команд туннеля, которые могут быть объединены с барьерами и задержками. Например:
tunnel t1 {
barrier b1 sync
pause
delay 1
send 42
barrier b2 sync
resume
} -start
Если один конец туннеля будет закрыт до завершения спецификации, тест не пройдёт. Спецификация, завершающаяся в приостановленном состоянии, подразумевает возобновление туннеля.
- pause
-
Ожидание завершения передачи байтов и приостановка туннеля.
Туннель должен быть запущен.
- recv NUMBER
-
Ожидание передачи NUMBER байтов от пункта назначения к источнику.
Туннель должен быть приостановлен, он остаётся приостановленным.
- resume
-
Возобновление передачи байтов в обоих направлениях.
Туннель должен быть приостановлен.
- send NUMBER
-
Ожидание передачи NUMBER байтов от источника к пункту назначения.
Туннель должен быть приостановлен, он остаётся приостановленным.
varnish
Определите и взаимодействуйте с экземплярами varnish.
Чтобы определить сервер Varnish, используйте такой синтаксис:
varnish vNAME [-arg STRING] [-vcl STRING] [-vcl+backend STRING]
[-errvcl STRING STRING] [-jail STRING] [-proto PROXY]
Первое varnish vNAME вызов запустит мастер-процесс varnishd в фоновом режиме, ожидая переключения -start, чтобы фактически запустить дочерний процесс.
Типы, используемые в описании ниже:
- PATTERN
-
— шаблон в стиле «glob» (например, fnmatch(3)), как используется в расширении имен файлов оболочки.
Аргументы:
- vNAME
-
Идентифицирует сервер Varnish строкой, она должна начинаться с «v».
- -arg STRING
-
Передайте аргумент varnishd, например, «-h simple_list».
Если определены макросы ${varnishd_args_prepend} или ${varnishd_args_append}, они расширяются и вставляются перед / добавляются к командной строке varnishd, как построено varnishtest, перед расширением самой командной строки. Это позволяет вносить изменения в командную строку varnishd без редактирования тестовых случаев. Эти макросы можно определить, используя опцию
-Dдля varnishtest. - -vcl STRING
-
Укажите VCL для загрузки в этом экземпляре Varnish. Вероятно, вы захотите использовать многострочные строки для этого ({…}).
- -vcl+backend STRING
-
Делает то же самое, что и -vcl, но добавляет блок определения известных бэкэндов (т. е. уже определенных).
- -errvcl STRING1 STRING2
-
Загрузить STRING2 как VCL, ожидая его сбоя и отправки Varnish строки ошибки, соответствующей STRING1.
- -jail STRING
-
Посмотрите
man varnishd(-j) для получения дополнительной информации. - -proto PROXY
-
Используйте протокол проксирования Varnish. Обратите внимание, что PROXY здесь — это фактическая строка.
Вы можете выбрать запуск экземпляра Varnish и/или ожидание нескольких событий:
varnish vNAME [-start] [-wait] [-wait-running] [-wait-stopped]
- -start
-
Запустить дочерний процесс.
После успешного запуска следующие макросы доступны для стандартного адреса прослушивания:
${vNAME_addr},${vNAME_port}и${vNAME_sock}. Дополнительные макросы доступны, включая имя адреса прослушивания для каждого адреса, к которому слушает vNAME, например:${vNAME_a0_addr}. - -stop
-
Остановить дочерний процесс.
- -syntax
-
Установите уровень синтаксиса VCL для этой команды (по умолчанию: 4.1)
- -wait
-
Подождите завершения этого экземпляра.
- -wait-running
-
Подождите запуска дочернего процесса Varnish.
- -wait-stopped
-
Подождите остановки дочернего процесса Varnish.
- -cleanup
-
После остановки Varnish очистите все после него. Это используется только в очень немногих тестах, и вам, вероятно, это не понадобится.
- -expectexit NUMBER
-
Ожидайте завершения работы varnishd с этим значением.
После запуска Varnish вы можете взаимодействовать с ним (как вы бы делали через varnishadm) с помощью этих дополнительных переключателей:
varnish vNAME [-cli STRING] [-cliok STRING] [-clierr STRING]
[-clijson STRING]
- -cli STRING|-cliok STRING|-clierr STATUS STRING|-cliexpect REGEXP STRING
-
Все четыре из них отправят STRING в командную строку, единственное различие заключается в том, чего они ожидают в результате. -cli ничего не ожидает, -cliok ожидает 200, -clierr ожидает STATUS, а -cliexpect ожидает, что REGEXP соответствует возвращенному ответу.
- -clijson STRING
-
Отправить STRING в командную строку, ожидать успеха (CLIS_OK/200) и проверить, что ответ является разборчивым JSON.
Также возможно взаимодействовать с его общей памятью (как вы бы делали с помощью инструментов вроде varnishstat) с помощью дополнительных переключателей:
- -expect !PATTERN|PATTERN OP NUMBER|PATTERN OP PATTERN
-
Посмотрите в VSM и убедитесь, что у первого счетчика VSC, идентифицированного PATTERN, правильное значение. OP может быть ==, >, >=, <, <=. Например:
varnish v1 -expect SM?.s1.g_space > 1000000 varnish v1 -expect cache_hit >= cache_hit_grace
В форме ! тест терпит неудачу, если счетчик соответствует PATTERN.
Пространство имен
MAIN.можно опустить из PATTERN.Тест занимает до 5 секунд до истечения времени ожидания.
- -vsc PATTERN
-
Вывести счетчики VSC, соответствующие PATTERN.
- -vsl_catchup
-
Подождите, пока поток журналирования не будет простаивать, чтобы убедиться, что все сгенерированные журналы были выгружены.
varnishtest
Альтернативное имя для ‘vtest’, см. выше.
vtest
Эта команда должна быть первой в вашем vtc, так как она идентифицирует тестовый случай короткой, но описательной фразой. Она принимает ровно один аргумент, строку, например:
vtest "Check that vtest is actually a valid command"
Она также выведет эту строку в журнале.
ИСТОРИЯ
Этот документ был написан Гийомом Кинтардом.
СМОТРИТЕ ТАКЖЕ
АВТОРСКИЕ ПРАВА
Этот документ лицензирован по той же лицензии, что и сам Varnish. Подробности см. в файле LICENCE.
- Авторские права (c) 2006-2016 Varnish Software AS
Copyright © 2006 Verdens Gang AS
Copyright © 2006–2020 Varnish Software AS
Licensed under the BSD-2-Clause License.
https://varnish-cache.org/docs/7.4/reference/vtc.html
Комментарии
Ведущие пробелы в строках игнорируются. Пустые строки (или строки, состоящие только из пробелов) также игнорируются, как и строки, начинающиеся с «#», которые являются комментариями.