Serverspec で数値の範囲指定がしたいのですが、上手くいきません

  • 当方環境
    • serverspec-2.31.0
    • ruby 2.2.3p173

要件としては
config fileにある設定値に対し、あいまいな値によるテストがしたい
です。

    1. php-fpmのpool configに以下の設定がある
      start_servers = 10
    2. start_serversの値が 9以上20以下だったらTestをpassにしたいなど

file resource typeにはそのような判定機能がありません

そこでcommand resource typeを使い戻り値を Rspecの be_within + of による範囲指定(あいまいな検査)でTestを行おうと考えましたが、上手くいきませんでした

its(:stdout) { should be_within(9.0).of(20.0) }
とか
expect(:stdout).to be_within(9.0).of(20.0)
とか書いても
:stdout に当然Symbolで返ってきていて、String型で 10\nが入っています
それをCast (明示的な型変換)をしても0になってしまいます
(inspect.to_f or {to_s,inspect}.to_f などしても 0になってしまう)

また、start_with().and end_with()で指定しても成功しませんでした

describe command("awk '\$1~/start_servers/{ print \$3}' /etc/php-fpm.d/#{ENV['PJCODE']}.conf") do
    it "start_servers は 2から10までの値である" do
      expect(:stdout).to_s.to_i { start_with(2).and end_with(10) }
      expect(:stdout).to start_with(2).and end_with(10)
    end

    it "start_servers は 12から15までの値ではないのでerrorになる" do
      expect(:stdout).to_s.to_i { start_with(12).and end_with(15) }
      p expect(:stdout).to_s.to_i
    end
  end
  • Result
.......................................................................... Failed on 10.1.1.100
F0
...

Failures:

  1) Command "awk '$1~/start_servers/{ print $3}' /etc/php-fpm.d/wp-vagrant.conf" start_servers は 2から10までの値である
     On host `wordpress'
     Failure/Error: expect(:stdout).to start_with(2).and end_with(10)
          expected :stdout to start with 2

       ...and:

          expected :stdout to end with 10

     # ./spec/php-fpm/main_spec.rb:52:in `block (2 levels) in <top (required)>'

Finished in 4.27 seconds (files took 0.6914 seconds to load)
78 examples, 1 failure

やはり型変換ができていません

  • should be > の場合
its(:stdout) { should be.inspect.to_i > 12 }
its(:stdout) { should be.inspect.to_i > 9 }
its(:stdout) { should be.to_s.to_i > 12 }
its(:stdout) { should be.to_s.to_i > 9 }
its(:stdout) { should.inspect.to_i > 12 }
its(:stdout) { should.inspect.to_i > 9 }
its(:stdout) { should.to_s.to_i > 12 }
its(:stdout) { should.to_s.to_i > 9 }
  • これらは全てTestがスルー (無視でpassed)されてしまいます
    • この例ですと:stdoutが"10\n"なのでそれを数値に変換したとして > 12はfailed になってほしいです
  • どうもbe_within(), start_with()の時と同じく型変換で Falseになり、 0:Fixnum と変換されているのかと思いましたが、以下でしたので0になる原因がよくわかっていません...
[61] pry(main)> 0 === false ? true : false
=> false
[28] pry(main)> Process.wait
=> 18988
[29] pry(main)> $?.exitstatus
=> 0
[30] pry(main)> $?.exitstatus === true ? true : false
=> false
[31] pry(main)> $?.exitstatus
=> 0
[32] pry(main)> $?.exitstatus === false ? true : false
=> false

[33] pry(main)> p !0
false
=> false
[34] pry(main)> p !!0
true
=> true
[35] pry(main)> p 0
0
=> 0
[36] pry(main)> p !1
false
=> false
[37] pry(main)> p !!1
true
=> true

なにか良い方法をご存知の方いらっしゃいますでしょうか?
新しいresource typeを用意する以外は方法がなさそうでしょうか?

よろしくお願いいたします。