require File.dirname(__FILE__) + '/spec_helper.rb' require 'fault_injection.rb' include FaultInjection describe FaultConditionLine do it "raise if invalid arguments are specified" do Proc.new{ FaultConditionLine.new({:file=>'foo.rb', :line=>-5}) }.should raise_error(ArgumentError) end it "implements attr_accessors" do c = FaultConditionLine.new("foo.rb",300) c.file.should be_eql("foo.rb") c.line.should be_eql(300) end it "matches file name and line numbers" do c = FaultConditionLine.new("foo.rb",300) c.should_raise_on("foo.rb",300).should be_true c.should_raise_on("foo.rb",305).should_not be_true c.should_raise_on("bar.rb",300).should_not be_true c.should_raise_on("bar.rb",199).should_not be_true c.should_raise_on("dir/foo.rb",300).should be_true c.should_raise_on("dir/bar.rb",300).should_not be_true c.should_raise_on("dir/foo.rb",390).should_not be_true c.should_raise_on(caller).should_not be_true end it "can inject a fault with probability" do c = FaultConditionLine.new("foo.rb",99) c.probability = 0.5 try_count = 3000 raise_count = 0 try_count.times { raise_count += 1 if c.should_raise_on('foo.rb',99) } probab = raise_count.to_f / try_count probab.should be_close(0.5,0.05) c.should_raise_on('bar.rb',99).should_not be_true end it "can inject a fault with count limit." do c = FaultConditionLine.new('foo.rb',99) c.limit_times = 5 5.times do c.should_raise_on('foo.rb',99).should be_true c.should_raise_on('foo.rb',100).should_not be_true end c.limit_times.should be_eql(0) c.should_raise_on('foo.rb',99).should_not be_true c.should_raise_on('foo.rb',100).should_not be_true end it "can inject a fault with both count limit and probability" do try_count = 3000 c = FaultConditionLine.new("foo.rb",99) c.probability = 0.5 c.limit_times = try_count raise_count = 0 all_count = 0 while raise_count < try_count all_count += 1 raise_count += 1 if c.should_raise_on('foo.rb',99) end probab = raise_count.to_f / all_count probab.should be_close(0.5,0.05) c.limit_times.should be_eql(0) c.should_raise_on('foo.rb',99).should_not be_true end end