Tenho minha própria implementação de um servidor Redis que gostaria de testar por meio de um script de shell.
A ideia geral é alimentá-lo com alguns comandos por meio de nc
, e como nc
imprime a saída do meu programa (resposta) para stdout
, capturar a resposta em uma variável de script e compará-la com a saída esperada.
Não consegui fazê-lo funcionar e não sei qual é o problema e como resolvê-lo.
Esta é uma parte do roteiro:
#!/bin/bash
set -eu
PORT=6380;
RUST_LOG=info ./run.sh --port $PORT 2>/dev/null & sleep 1; # Give it some time to start.
i=0;
i=$((i+1)); printf 'Running test #%d...' "$i";
response=$(printf "*1\r\n\$4\r\nPING\r\n" | nc localhost $PORT);
if [ "$response" = '+PONG\r\n' ]; then
printf ' PASSED'
else
printf ' FAILED\nGot:\n%s\n\n' "$response"
fi;
sleep 0.1;
pkill redis-server;
Este é apenas um exemplo de teste. Quando um usuário envia o PING
comando, a resposta esperada é PONG
, mas ela é codificada e enviada de volta como +PONG\r\n
.
A saída CLI deste teste ( $ ./test.sh
) é:
Running test #1... FAILED
Got:
+PONG
Então, parece que a variável $response
realmente contém o que deveria.
Tentei remover +
, \r
, \n
, \r\n
da saída de referência sem sucesso, só para ver se isso ajudaria.
Terei testes mais complicados que incluem um caractere que precisa ser escapado ( $
), como \$5\r\nHello
, na resposta.
A propósito, a configuração manual response
funciona conforme o esperado.
response='+PONG\r\n';
if [ "$response" = '+PONG\r\n' ]; then
echo Equal
else
echo Different
fi;
Isto imprime Equal
, como esperado.
Depois de adicionar a saída de depuração por meio de set -ex
, posso ver que $response
armazena +PONG\r
, ou seja, sem \n
.
Running test #1...++ printf '*1\r\n$4\r\nPING\r\n'
++ nc localhost 6380
+ response=$'+PONG\r'
+ '[' $'+PONG\r' = '+PONG\r\n' ']'
+ printf ' FAILED\nGot:\n%s\n\n' $'+PONG\r'
FAILED
Got:
+PONG
Certo, então definir a saída de referência +PONG\r
deve funcionar, certo?
Running test #1...++ printf '*1\r\n$4\r\nPING\r\n'
++ nc localhost 6380
+ response=$'+PONG\r'
+ '[' $'+PONG\r' = '+PONG\r' ']'
+ printf ' FAILED\nGot:\n%s\n\n' $'+PONG\r'
FAILED
Got:
+PONG
Claramente não.
Tentei encapsular response
em {}
, assim: if [ "${response}" = '+PONG\r' ]; then
, sem sucesso.
O que estou perdendo?
Também estou curioso para saber como e por que \n
me perdi.
Estou executando-o zsh
em um Mac, se isso for mencionado, mas o comando diz claramente para usar bash
.
Se eu executar ps -p $$
o script de teste, obtenho 51547 ttys003 0:00.02 /bin/bash ./test.sh
.