170 lines
2.9 KiB
Ruby
170 lines
2.9 KiB
Ruby
|
#!/usr/local/bin/ruby -w
|
||
|
#
|
||
|
# Copyright(c) 2003 Anders Bengtsson
|
||
|
#
|
||
|
# PersistenceTest is based on the unit tests from Prevayler,
|
||
|
# Copyright(c) 2001-2003 Klaus Wuestefeld.
|
||
|
#
|
||
|
|
||
|
$LOAD_PATH.unshift("lib")
|
||
|
|
||
|
require 'madeleine'
|
||
|
require 'test/unit'
|
||
|
|
||
|
class AddingSystem
|
||
|
attr_reader :total
|
||
|
|
||
|
def initialize
|
||
|
@total = 0
|
||
|
end
|
||
|
|
||
|
def add(value)
|
||
|
@total += value
|
||
|
@total
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
class Addition
|
||
|
|
||
|
attr_reader :value
|
||
|
|
||
|
def initialize(value)
|
||
|
@value = value
|
||
|
end
|
||
|
|
||
|
def execute(system)
|
||
|
system.add(@value)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
class PersistenceTest < Test::Unit::TestCase
|
||
|
|
||
|
def setup
|
||
|
@madeleine = nil
|
||
|
end
|
||
|
|
||
|
def teardown
|
||
|
delete_prevalence_files(prevalence_base)
|
||
|
Dir.delete(prevalence_base)
|
||
|
end
|
||
|
|
||
|
def verify(expected_total)
|
||
|
assert_equal(expected_total, prevalence_system().total(), "Total")
|
||
|
end
|
||
|
|
||
|
def prevalence_system
|
||
|
@madeleine.system
|
||
|
end
|
||
|
|
||
|
def prevalence_base
|
||
|
"PrevalenceBase"
|
||
|
end
|
||
|
|
||
|
def clear_prevalence_base
|
||
|
@madeleine.close unless @madeleine.nil?
|
||
|
delete_prevalence_files(prevalence_base())
|
||
|
end
|
||
|
|
||
|
def delete_prevalence_files(directory_name)
|
||
|
return unless File.exist?(directory_name)
|
||
|
Dir.foreach(directory_name) {|file_name|
|
||
|
next if file_name == '.'
|
||
|
next if file_name == '..'
|
||
|
file_name.untaint
|
||
|
assert(File.delete(directory_name + File::SEPARATOR + file_name) == 1,
|
||
|
"Unable to delete #{file_name}")
|
||
|
}
|
||
|
end
|
||
|
|
||
|
def crash_recover
|
||
|
@madeleine.close unless @madeleine.nil?
|
||
|
@madeleine = create_madeleine()
|
||
|
end
|
||
|
|
||
|
def create_madeleine
|
||
|
SnapshotMadeleine.new(prevalence_base()) { AddingSystem.new }
|
||
|
end
|
||
|
|
||
|
def snapshot
|
||
|
@madeleine.take_snapshot
|
||
|
end
|
||
|
|
||
|
def add(value, expected_total)
|
||
|
total = @madeleine.execute_command(Addition.new(value))
|
||
|
assert_equal(expected_total, total, "Total")
|
||
|
end
|
||
|
|
||
|
def verify_snapshots(expected_count)
|
||
|
count = 0
|
||
|
Dir.foreach(prevalence_base) {|name|
|
||
|
if name =~ /\.snapshot$/
|
||
|
count += 1
|
||
|
end
|
||
|
}
|
||
|
assert_equal(expected_count, count, "snapshots")
|
||
|
end
|
||
|
|
||
|
def test_main
|
||
|
clear_prevalence_base
|
||
|
|
||
|
# There is nothing to recover at first.
|
||
|
# A new system will be created.
|
||
|
crash_recover
|
||
|
|
||
|
crash_recover
|
||
|
add(40,40)
|
||
|
add(30,70)
|
||
|
verify(70)
|
||
|
|
||
|
crash_recover
|
||
|
verify(70)
|
||
|
|
||
|
add(20,90)
|
||
|
add(15,105)
|
||
|
verify_snapshots(0)
|
||
|
snapshot
|
||
|
verify_snapshots(1)
|
||
|
snapshot
|
||
|
verify_snapshots(2)
|
||
|
verify(105)
|
||
|
|
||
|
crash_recover
|
||
|
snapshot
|
||
|
add(10,115)
|
||
|
snapshot
|
||
|
add(5,120)
|
||
|
add(4,124)
|
||
|
verify(124)
|
||
|
|
||
|
crash_recover
|
||
|
add(3,127)
|
||
|
verify(127)
|
||
|
|
||
|
verify_snapshots(4)
|
||
|
|
||
|
clear_prevalence_base
|
||
|
snapshot
|
||
|
|
||
|
crash_recover
|
||
|
add(10,137)
|
||
|
add(2,139)
|
||
|
crash_recover
|
||
|
verify(139)
|
||
|
end
|
||
|
|
||
|
def test_main_in_safe_level_one
|
||
|
thread = Thread.new {
|
||
|
$SAFE = 1
|
||
|
test_main
|
||
|
}
|
||
|
thread.join
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
def add_persistence_tests(suite)
|
||
|
suite << PersistenceTest.suite
|
||
|
end
|