Spec-Zone.ru › Varnish

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>}

Повторить строку str uint раз.

${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"

Она также выведет эту строку в журнале.

ИСТОРИЯ

Этот документ был написан Гийомом Кинтардом.

СМОТРИТЕ ТАКЖЕ

  • varnishtest
  • Модуль утилиты vtc для varnishtest

АВТОРСКИЕ ПРАВА

Этот документ лицензирован по той же лицензии, что и сам 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API