170 lines
2.9 KiB
Ruby
Executable file
170 lines
2.9 KiB
Ruby
Executable file
#!/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
|