サーバー上のRAMの量がプロパティファイルにリストされているマウント以上かどうかを確認することを目的としたserverspecテストを作成しました
describe command('perl -n -e "if (/MemTotal:\s+(\d+)/) { print \$1; last; }" /proc/meminfo') do
its(:stdout){ should be >= "#{property['ram']}"}
end
コマンドでテストしているマシンでは、「7539944」が得られます
プロパティ ram が "888" に設定されている場合、文字列比較 "888" が "7539944" より大きいため、テストは誤って失敗します。
serverspec の文字列型で数値比較を行う方法はありますか?
このirbセッションは、Rubyがどのように動作していると信じているか、どのように動作させたいかを示しています
$ irb
1.9.3-p484 :001 > prop="888"
=> "888"
1.9.3-p484 :002 > command="7539944"
=> "7539944"
1.9.3-p484 :003 > command > prop
=> false
1.9.3-p484 :004 > command.to_i > prop.to_i
=> true
説明をこれに変更すると
describe command('perl -n -e "if (/MemTotal:\s+(\d+)/) { print \$1; last; }" /proc/meminfo') do
its(:stdout){ should be >= "#{property['ram']}".to_i}
end
このエラーが発生します
Failures:
1) std Command "perl -n -e "if (/MemTotal:\s+(\d+)/) { print \$1; last; }" /proc/meminfo" stdout should be >= 888
On host `foo.bar.org'
Failure/Error: its(:stdout){ should be >= "#{property['ram']}".to_i}
ArgumentError:
comparison of String with 888 failed
sudo -p 'Password: ' /bin/sh -c perl\ -n\ -e\ \"if\ \(/MemTotal:\\s\+\(\\d\+\)/\)\ \{\ print\ \\\$1\;\ last\;\ \}\"\ /proc/meminfo
7539944
Shared Example Group: "ram::init" called from ./spec/std/spec.rb:5
# ./spec/shared/ram/init.rb:4:in `block (3 levels) in <top (required)>'