instiki/vendor/madeleine-0.7.1/test/test_persistence.rb
2005-01-15 20:26:54 +00:00

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