Соответствие регулярному выражению Chef ServerSpec не работает

Я пытаюсь вычислить регулярное выражение для стандартного вывода команды. Несмотря на то, что регулярное выражение должно совпадать, похоже, оно не работает как таковое:

> [#]        Command "pm2 list"
> [#]          stdout
> [#]            should match /.*online.*/ (FAILED - 1)
> [#]
> [#]        Failures:
> [#]
> [#]          1) Command "pm2 list" stdout should match /.*online.*/
> [#]             Failure/Error: its(:stdout) { should match /.*online.*/}
> [#]             ArgumentError:
> [#]               invalid byte sequence in US-ASCII
> [#]               /bin/sh -c pm2\ list
> [#]               ┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬─────────────┬─────────────┐
> [#]        │ App name │ id │ mode │ PID  │ status │ restarted │ uptime │      memory │    watching │
> [#]        ├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼─────────────┼─────────────┤
> [#]        │ app      │ 0  │ fork │ 3684 │ online │         0 │ 5m     │ 13.898 MB   │ unactivated │
> [#]        └──────────┴────┴──────┴──────┴────────┴───────────┴────────┴─────────────┴─────────────┘
> [#]         Use `pm2 desc[ribe] <id>` to get more details
> [#]
> [#]             # /tmp/busser/suites/serverspec/localhost/nodejs_spec.rb:10:in `block (2 levels) in <top (required)>'
> [#]
> [#]        Finished in 0.77549 seconds (files took 0.19867 seconds to load)
> [#]        3 examples, 1 failure

Почему регулярное выражение не соответствует?

Аналогичное регулярное выражение, работающее внутри поваренной книги, отлично работает:

...
process_check = Mixlib::ShellOut.new("pm2 list")
process_check.run_command
if process_check.stdout =~ /(stopped|online)/
...

person localhostv6    schedule 14.10.2014    source источник


Ответы (1)


Фактическая ошибка - invalid byte sequence in US-ASCII. Mixlib-shellout очень тщательно следит за кодировкой, но это не то, что Serverspec использует для запуска команд, насколько мне известно. Сопоставитель пытается преобразовать (вероятно) данные UTF-8 в строку ASCII, что не удается. Попробуйте should include('online') возможно? Вам придется погрузиться в код сопоставления в rspec, чтобы быть уверенным в том, как они обрабатывают строки.

person coderanger    schedule 14.10.2014