higgs 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +208 -0
- data/LICENSE +26 -0
- data/README +2 -0
- data/Rakefile +75 -0
- data/bin/higgs_backup +67 -0
- data/bin/higgs_dump_index +43 -0
- data/bin/higgs_dump_jlog +42 -0
- data/bin/higgs_verify +37 -0
- data/lib/cgi/session/higgs.rb +72 -0
- data/lib/higgs/block.rb +192 -0
- data/lib/higgs/cache.rb +117 -0
- data/lib/higgs/dbm.rb +55 -0
- data/lib/higgs/exceptions.rb +31 -0
- data/lib/higgs/flock.rb +77 -0
- data/lib/higgs/index.rb +164 -0
- data/lib/higgs/jlog.rb +159 -0
- data/lib/higgs/lock.rb +189 -0
- data/lib/higgs/storage.rb +1086 -0
- data/lib/higgs/store.rb +228 -0
- data/lib/higgs/tar.rb +390 -0
- data/lib/higgs/thread.rb +370 -0
- data/lib/higgs/tman.rb +513 -0
- data/lib/higgs/utils/bman.rb +285 -0
- data/lib/higgs/utils.rb +22 -0
- data/lib/higgs/version.rb +21 -0
- data/lib/higgs.rb +59 -0
- data/misc/cache_bench/cache_bench.rb +43 -0
- data/misc/dbm_bench/.strc +8 -0
- data/misc/dbm_bench/Rakefile +78 -0
- data/misc/dbm_bench/dbm_multi_thread.rb +199 -0
- data/misc/dbm_bench/dbm_rnd_delete.rb +43 -0
- data/misc/dbm_bench/dbm_rnd_read.rb +44 -0
- data/misc/dbm_bench/dbm_rnd_update.rb +44 -0
- data/misc/dbm_bench/dbm_seq_read.rb +45 -0
- data/misc/dbm_bench/dbm_seq_write.rb +44 -0
- data/misc/dbm_bench/st_verify.rb +28 -0
- data/misc/io_bench/cksum_bench.rb +48 -0
- data/misc/io_bench/jlog_bench.rb +71 -0
- data/misc/io_bench/write_bench.rb +128 -0
- data/misc/thread_bench/lock_bench.rb +132 -0
- data/mkrdoc.rb +8 -0
- data/rdoc.yml +13 -0
- data/sample/count.rb +60 -0
- data/sample/dbmtest.rb +38 -0
- data/test/Rakefile +45 -0
- data/test/run.rb +32 -0
- data/test/test_block.rb +163 -0
- data/test/test_cache.rb +214 -0
- data/test/test_cgi_session.rb +142 -0
- data/test/test_flock.rb +162 -0
- data/test/test_index.rb +258 -0
- data/test/test_jlog.rb +180 -0
- data/test/test_lock.rb +320 -0
- data/test/test_online_backup.rb +169 -0
- data/test/test_storage.rb +439 -0
- data/test/test_storage_conf.rb +202 -0
- data/test/test_storage_init_opts.rb +89 -0
- data/test/test_store.rb +211 -0
- data/test/test_tar.rb +432 -0
- data/test/test_thread.rb +541 -0
- data/test/test_tman.rb +875 -0
- data/test/test_tman_init_opts.rb +56 -0
- data/test/test_utils_bman.rb +234 -0
- metadata +115 -0
@@ -0,0 +1,142 @@
|
|
1
|
+
#!/usr/local/bin/ruby
|
2
|
+
|
3
|
+
require 'cgi/session/higgs'
|
4
|
+
require 'cgi/session/pstore'
|
5
|
+
require 'fileutils'
|
6
|
+
require 'logger'
|
7
|
+
require 'test/unit'
|
8
|
+
|
9
|
+
module Higgs::Test
|
10
|
+
module CGISessionTest
|
11
|
+
# for ident(1)
|
12
|
+
CVS_ID = '$Id: test_cgi_session.rb 560 2007-09-25 15:34:24Z toki $'
|
13
|
+
|
14
|
+
def new_store(session, options={})
|
15
|
+
options.update('tmpdir' => @tmpdir, :logger => @logger)
|
16
|
+
store_type.new(session, options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def setup
|
20
|
+
@tmpdir = 'cgi_tmp'
|
21
|
+
FileUtils.rm_rf(@tmpdir) if $DEBUG
|
22
|
+
FileUtils.mkdir_p(@tmpdir)
|
23
|
+
@logger = proc{|path|
|
24
|
+
logger = Logger.new(path, 1)
|
25
|
+
logger.level = Logger::WARN
|
26
|
+
logger
|
27
|
+
}
|
28
|
+
@session = Object.new
|
29
|
+
class << @session
|
30
|
+
attr_accessor :session_id
|
31
|
+
attr_accessor :new_session
|
32
|
+
end
|
33
|
+
@session.session_id = 'foo'
|
34
|
+
@session.new_session = true
|
35
|
+
@store = new_store(@session)
|
36
|
+
end
|
37
|
+
|
38
|
+
def teardown
|
39
|
+
@store.close
|
40
|
+
FileUtils.rm_rf(@tmpdir) unless $DEBUG
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_restore_update_close
|
44
|
+
hash = @store.restore
|
45
|
+
hash['key'] = { 'k' => 'v' }
|
46
|
+
@store.update
|
47
|
+
@store.close
|
48
|
+
|
49
|
+
@store = new_store(@session)
|
50
|
+
assert_equal({ 'key' => { 'k' => 'v' } }, @store.restore)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_delete
|
54
|
+
hash = @store.restore
|
55
|
+
hash['key'] = { 'k' => 'v' }
|
56
|
+
@store.update
|
57
|
+
@store.delete
|
58
|
+
|
59
|
+
@store = new_store(@session)
|
60
|
+
assert_equal({}, @store.restore)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_not_new_session
|
64
|
+
@store.delete
|
65
|
+
|
66
|
+
@session.new_session = false
|
67
|
+
assert_raise(CGI::Session::NoSession) {
|
68
|
+
@store = new_store(@session)
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_multiproc_counter
|
73
|
+
@store.close
|
74
|
+
num_of_procs = 2
|
75
|
+
count_by_proc = 1000
|
76
|
+
pid_list = []
|
77
|
+
ready_latch = File.join(@tmpdir, '.ready_latch')
|
78
|
+
start_latch = File.join(@tmpdir, '.start_latch')
|
79
|
+
|
80
|
+
begin
|
81
|
+
num_of_procs.times do |i|
|
82
|
+
pid_list << fork{
|
83
|
+
FileUtils.touch("#{ready_latch}.#{i}")
|
84
|
+
until (File.exist? start_latch)
|
85
|
+
# spin lock
|
86
|
+
end
|
87
|
+
count_by_proc.times do
|
88
|
+
@store = new_store(@session)
|
89
|
+
hash = @store.restore
|
90
|
+
hash['count'] = (hash['count'] || 0).succ
|
91
|
+
@store.close
|
92
|
+
end
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
num_of_procs.times do |i|
|
97
|
+
until (File.exist? "#{ready_latch}.#{i}")
|
98
|
+
# spin lock
|
99
|
+
end
|
100
|
+
end
|
101
|
+
FileUtils.touch(start_latch)
|
102
|
+
|
103
|
+
for pid in pid_list
|
104
|
+
Process.waitpid(pid)
|
105
|
+
end
|
106
|
+
|
107
|
+
@store = new_store(@session)
|
108
|
+
assert_equal(num_of_procs * count_by_proc, @store.restore['count'])
|
109
|
+
ensure
|
110
|
+
num_of_procs.times do |i|
|
111
|
+
FileUtils.rm_f("#{ready_latch}.#{i}")
|
112
|
+
end
|
113
|
+
FileUtils.rm_f(start_latch)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
class CGISessionPstoreTest < Test::Unit::TestCase
|
119
|
+
include CGISessionTest
|
120
|
+
|
121
|
+
# for ident(1)
|
122
|
+
CVS_ID = '$Id: test_cgi_session.rb 560 2007-09-25 15:34:24Z toki $'
|
123
|
+
|
124
|
+
def store_type
|
125
|
+
CGI::Session::PStore
|
126
|
+
end
|
127
|
+
|
128
|
+
# race condition
|
129
|
+
undef test_multiproc_counter
|
130
|
+
end
|
131
|
+
|
132
|
+
class CGISessionHiggsStoreTest < Test::Unit::TestCase
|
133
|
+
include CGISessionTest
|
134
|
+
|
135
|
+
# for ident(1)
|
136
|
+
CVS_ID = '$Id: test_cgi_session.rb 560 2007-09-25 15:34:24Z toki $'
|
137
|
+
|
138
|
+
def store_type
|
139
|
+
CGI::Session::HiggsStore
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
data/test/test_flock.rb
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
#!/usr/local/bin/ruby
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'higgs/flock'
|
5
|
+
require 'test/unit'
|
6
|
+
|
7
|
+
module Higgs::Test
|
8
|
+
class FileLockTest < Test::Unit::TestCase
|
9
|
+
include Higgs
|
10
|
+
|
11
|
+
# for ident(1)
|
12
|
+
CVS_ID = '$Id: test_flock.rb 559 2007-09-25 15:20:20Z toki $'
|
13
|
+
|
14
|
+
def setup
|
15
|
+
@test_dir = 'flock_test'
|
16
|
+
FileUtils.rm_rf(@test_dir) # for debug
|
17
|
+
FileUtils.mkdir_p(@test_dir)
|
18
|
+
@count_path = File.join(@test_dir, 'count')
|
19
|
+
@lock_path = File.join(@test_dir, 'lock')
|
20
|
+
end
|
21
|
+
|
22
|
+
def teardown
|
23
|
+
FileUtils.rm_rf(@test_dir) unless $DEBUG
|
24
|
+
end
|
25
|
+
|
26
|
+
def make_flock(*args)
|
27
|
+
flock = FileLock.new(@lock_path, *args)
|
28
|
+
begin
|
29
|
+
yield(flock)
|
30
|
+
ensure
|
31
|
+
flock.close
|
32
|
+
end
|
33
|
+
end
|
34
|
+
private :make_flock
|
35
|
+
|
36
|
+
def test_write_lock_single_process
|
37
|
+
make_flock{|flock|
|
38
|
+
File.open(@count_path, 'w') {|f| f << '0' }
|
39
|
+
100.times do
|
40
|
+
flock.synchronize(:EX) {
|
41
|
+
value = IO.read(@count_path)
|
42
|
+
value.succ!
|
43
|
+
File.open(@count_path, 'w') {|f| f << value }
|
44
|
+
}
|
45
|
+
end
|
46
|
+
assert_equal('100', IO.read(@count_path))
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_write_lock_multi_process
|
51
|
+
File.open(@count_path, 'w') {|f| f << '0' }
|
52
|
+
|
53
|
+
writers = 10
|
54
|
+
each_count = 1000
|
55
|
+
w_pid_list = []
|
56
|
+
|
57
|
+
writers.times do |i|
|
58
|
+
w_pid_list << fork{
|
59
|
+
make_flock{|flock|
|
60
|
+
each_count.times do
|
61
|
+
flock.synchronize(:EX) {
|
62
|
+
value = IO.read(@count_path)
|
63
|
+
value.succ!
|
64
|
+
File.open(@count_path, 'w') {|f| f << value }
|
65
|
+
}
|
66
|
+
end
|
67
|
+
}
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
w_st_list = []
|
72
|
+
for w_pid in w_pid_list
|
73
|
+
Process.waitpid(w_pid)
|
74
|
+
w_st_list << $?.exitstatus
|
75
|
+
end
|
76
|
+
|
77
|
+
w_st_list.each_with_index do |exitstatus, i|
|
78
|
+
assert_equal(0, exitstatus, "writer process: #{i}")
|
79
|
+
end
|
80
|
+
|
81
|
+
assert_equal(writers * each_count, IO.read(@count_path).to_i)
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_read_write_lock_multi_process
|
85
|
+
File.open(@count_path, 'w') {|f| f << '0' }
|
86
|
+
|
87
|
+
writers = 3
|
88
|
+
readers = 10
|
89
|
+
each_count = 1000
|
90
|
+
w_pid_list = []
|
91
|
+
r_pid_list = []
|
92
|
+
|
93
|
+
writers.times do |i|
|
94
|
+
w_pid_list << fork{
|
95
|
+
make_flock{|flock|
|
96
|
+
each_count.times do
|
97
|
+
flock.synchronize(:EX) {
|
98
|
+
File.open(@count_path, 'w') {|f| f << '1' }
|
99
|
+
File.open(@count_path, 'w') {|f| f << '0' }
|
100
|
+
}
|
101
|
+
end
|
102
|
+
}
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
readers.times do |i|
|
107
|
+
r_pid_list << fork{
|
108
|
+
make_flock(true) {|flock|
|
109
|
+
each_count.times do
|
110
|
+
flock.synchronize(:SH) {
|
111
|
+
assert_equal('0', IO.read(@count_path))
|
112
|
+
}
|
113
|
+
end
|
114
|
+
}
|
115
|
+
}
|
116
|
+
end
|
117
|
+
|
118
|
+
w_st_list = []
|
119
|
+
for w_pid in w_pid_list
|
120
|
+
Process.waitpid(w_pid)
|
121
|
+
w_st_list << $?.exitstatus
|
122
|
+
end
|
123
|
+
|
124
|
+
r_st_list = []
|
125
|
+
for r_pid in r_pid_list
|
126
|
+
Process.waitpid(r_pid)
|
127
|
+
r_st_list << $?.exitstatus
|
128
|
+
end
|
129
|
+
|
130
|
+
w_st_list.each_with_index do |exitstatus, i|
|
131
|
+
assert_equal(0, exitstatus, "writer process: #{i}")
|
132
|
+
end
|
133
|
+
|
134
|
+
r_st_list.each_with_index do |exitstatus, i|
|
135
|
+
assert_equal(0, exitstatus, "reader process: #{i}")
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_read_only_lock_failed_to_write_lock
|
140
|
+
make_flock(true) {|flock|
|
141
|
+
assert_raise(RuntimeError) {
|
142
|
+
flock.write_lock
|
143
|
+
}
|
144
|
+
}
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_synchronize_unknown_mode_error
|
148
|
+
make_flock(true) {|flock|
|
149
|
+
assert_raise(ArgumentError) {
|
150
|
+
flock.synchronize(:UNKNOWN) {
|
151
|
+
flunk('not to reach')
|
152
|
+
}
|
153
|
+
}
|
154
|
+
}
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
# Local Variables:
|
160
|
+
# mode: Ruby
|
161
|
+
# indent-tabs-mode: nil
|
162
|
+
# End:
|
data/test/test_index.rb
ADDED
@@ -0,0 +1,258 @@
|
|
1
|
+
#!/usr/local/bin/ruby
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'higgs/block'
|
5
|
+
require 'higgs/index'
|
6
|
+
require 'test/unit'
|
7
|
+
|
8
|
+
module Higgs::Test
|
9
|
+
class IndexChangeNumberTest < Test::Unit::TestCase
|
10
|
+
include Higgs
|
11
|
+
|
12
|
+
# for ident(1)
|
13
|
+
CVS_ID = '$Id: test_index.rb 559 2007-09-25 15:20:20Z toki $'
|
14
|
+
|
15
|
+
def setup
|
16
|
+
@idx = Index.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_change_number
|
20
|
+
assert_equal(0, @idx.change_number)
|
21
|
+
@idx.succ!
|
22
|
+
assert_equal(1, @idx.change_number)
|
23
|
+
@idx.succ!
|
24
|
+
assert_equal(2, @idx.change_number)
|
25
|
+
@idx.succ!
|
26
|
+
assert_equal(3, @idx.change_number)
|
27
|
+
@idx.succ!
|
28
|
+
assert_equal(4, @idx.change_number)
|
29
|
+
@idx.succ!
|
30
|
+
assert_equal(5, @idx.change_number)
|
31
|
+
@idx.succ!
|
32
|
+
assert_equal(6, @idx.change_number)
|
33
|
+
@idx.succ!
|
34
|
+
assert_equal(7, @idx.change_number)
|
35
|
+
@idx.succ!
|
36
|
+
assert_equal(8, @idx.change_number)
|
37
|
+
@idx.succ!
|
38
|
+
assert_equal(9, @idx.change_number)
|
39
|
+
@idx.succ!
|
40
|
+
assert_equal(10, @idx.change_number)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class IndexFreeListTest < Test::Unit::TestCase
|
45
|
+
include Higgs
|
46
|
+
|
47
|
+
# for ident(1)
|
48
|
+
CVS_ID = '$Id: test_index.rb 559 2007-09-25 15:20:20Z toki $'
|
49
|
+
|
50
|
+
def setup
|
51
|
+
@idx = Index.new
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_free_single
|
55
|
+
assert_equal(nil, @idx.free_fetch(512))
|
56
|
+
@idx.free_store(0, 512)
|
57
|
+
assert_equal(0, @idx.free_fetch(512))
|
58
|
+
assert_equal(nil, @idx.free_fetch(512))
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_free_multi_size
|
62
|
+
@idx.free_store(0, 1024)
|
63
|
+
@idx.free_store(3584, 8192)
|
64
|
+
assert_equal(nil, @idx.free_fetch(512))
|
65
|
+
assert_equal(0, @idx.free_fetch(1024))
|
66
|
+
assert_equal(3584, @idx.free_fetch(8192))
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_free_multi_segment
|
70
|
+
@idx.free_store(0, 512)
|
71
|
+
@idx.free_store(8192, 512)
|
72
|
+
@idx.free_store(9782, 512)
|
73
|
+
assert_equal(0, @idx.free_fetch(512))
|
74
|
+
assert_equal(8192, @idx.free_fetch(512))
|
75
|
+
assert_equal(9782, @idx.free_fetch(512))
|
76
|
+
assert_equal(nil, @idx.free_fetch(512))
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_free_fetch_at
|
80
|
+
@idx.free_store(0, 512)
|
81
|
+
@idx.free_store(8192, 512)
|
82
|
+
@idx.free_store(9782, 512)
|
83
|
+
assert_equal(0, @idx.free_fetch_at(0, 512))
|
84
|
+
assert_equal(8192, @idx.free_fetch_at(8192, 512))
|
85
|
+
assert_equal(9782, @idx.free_fetch_at(9782, 512))
|
86
|
+
assert_equal(nil, @idx.free_fetch(512))
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
class IndexTest < Test::Unit::TestCase
|
91
|
+
include Higgs
|
92
|
+
|
93
|
+
# for ident(1)
|
94
|
+
CVS_ID = '$Id: test_index.rb 559 2007-09-25 15:20:20Z toki $'
|
95
|
+
|
96
|
+
def setup
|
97
|
+
@idx = Index.new
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_single_entry
|
101
|
+
assert_equal(nil, @idx['foo'])
|
102
|
+
@idx['foo'] = 0
|
103
|
+
assert_equal(0, @idx['foo'])
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_multi_entry
|
107
|
+
assert_equal(nil, @idx['foo'])
|
108
|
+
assert_equal(nil, @idx['bar'])
|
109
|
+
@idx['foo'] = 0
|
110
|
+
@idx['bar'] = 8192
|
111
|
+
assert_equal(0, @idx['foo'])
|
112
|
+
assert_equal(8192, @idx['bar'])
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_key
|
116
|
+
assert_equal(false, (@idx.key? 'foo'))
|
117
|
+
@idx['foo'] = 0
|
118
|
+
assert_equal(true, (@idx.key? 'foo'))
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_keys
|
122
|
+
assert_equal([], @idx.keys)
|
123
|
+
@idx['foo'] = 0
|
124
|
+
assert_equal(%w[ foo ].sort, @idx.keys.sort)
|
125
|
+
@idx['bar'] = 512
|
126
|
+
assert_equal(%w[ foo bar ].sort, @idx.keys.sort)
|
127
|
+
@idx['baz'] = 1024
|
128
|
+
assert_equal(%w[ foo bar baz ].sort, @idx.keys.sort)
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_each_key
|
132
|
+
assert_equal(@idx, @idx.each_key{|key| assert_fail('not to reach') })
|
133
|
+
|
134
|
+
@idx['foo'] = 0
|
135
|
+
expected_keys = %w[ foo ]
|
136
|
+
@idx.each_key do |key|
|
137
|
+
assert(expected_keys.delete(key), "key: #{key}")
|
138
|
+
end
|
139
|
+
assert_equal([], expected_keys)
|
140
|
+
|
141
|
+
@idx['bar'] = 512
|
142
|
+
expected_keys = %w[ foo bar ]
|
143
|
+
@idx.each_key do |key|
|
144
|
+
assert(expected_keys.delete(key), "key: #{key}")
|
145
|
+
end
|
146
|
+
assert_equal([], expected_keys)
|
147
|
+
|
148
|
+
@idx['baz'] = 1024
|
149
|
+
expected_keys = %w[ foo bar baz ]
|
150
|
+
@idx.each_key do |key|
|
151
|
+
assert(expected_keys.delete(key), "key: #{key}")
|
152
|
+
end
|
153
|
+
assert_equal([], expected_keys)
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_delete
|
157
|
+
assert_equal(nil, @idx.delete('foo'))
|
158
|
+
@idx['foo'] = 0
|
159
|
+
assert_equal(0, @idx.delete('foo'))
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
class IndexIdentitiesTest < Test::Unit::TestCase
|
164
|
+
include Higgs
|
165
|
+
|
166
|
+
# for ident(1)
|
167
|
+
CVS_ID = '$Id: test_index.rb 559 2007-09-25 15:20:20Z toki $'
|
168
|
+
|
169
|
+
def setup
|
170
|
+
@idx = Index.new
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_identity
|
174
|
+
@idx[:foo] = 0
|
175
|
+
assert_equal('foo', @idx.identity(:foo))
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_identity_not_defined
|
179
|
+
assert_nil(@idx.identity(:foo))
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_identity_dup
|
183
|
+
@idx[:foo] = 0
|
184
|
+
@idx['foo'] = 1
|
185
|
+
@idx[ %w[ f o o ] ] = 2
|
186
|
+
assert_equal('foo', @idx.identity(:foo))
|
187
|
+
assert_equal('foo.a', @idx.identity('foo'))
|
188
|
+
assert_equal('foo.b', @idx.identity(%w[ f o o ]))
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_delete
|
192
|
+
@idx[:foo] = 0
|
193
|
+
@idx['foo'] = 1
|
194
|
+
@idx.delete(:foo)
|
195
|
+
assert_equal(nil, @idx.identity(:foo))
|
196
|
+
assert_equal('foo.a', @idx.identity('foo'))
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
class IndexLoadSaveTest < Test::Unit::TestCase
|
201
|
+
include Higgs
|
202
|
+
|
203
|
+
# for ident(1)
|
204
|
+
CVS_ID = '$Id: test_index.rb 559 2007-09-25 15:20:20Z toki $'
|
205
|
+
|
206
|
+
def setup
|
207
|
+
@path = 'test.idx'
|
208
|
+
end
|
209
|
+
|
210
|
+
def teardown
|
211
|
+
FileUtils.rm_f(@path)
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_save_load
|
215
|
+
i = Index.new
|
216
|
+
i.succ!
|
217
|
+
i.free_store(0, 512)
|
218
|
+
i[:foo] = 1024
|
219
|
+
i.eoa = 2048
|
220
|
+
i.save(@path)
|
221
|
+
|
222
|
+
j = Index.new
|
223
|
+
j.load(@path)
|
224
|
+
assert_equal(1, j.change_number)
|
225
|
+
assert_equal(2048, j.eoa)
|
226
|
+
assert_equal(0, j.free_fetch(512))
|
227
|
+
assert_equal(1024, j[:foo])
|
228
|
+
assert_equal('foo', j.identity(:foo))
|
229
|
+
end
|
230
|
+
|
231
|
+
def test_migration
|
232
|
+
index_data_0_0 = {
|
233
|
+
:version => [ 0, 0 ],
|
234
|
+
:change_number => 0,
|
235
|
+
:eoa => 1024,
|
236
|
+
:free_lists => { 512 => [ 512 ] },
|
237
|
+
:index => { :foo => 0 }
|
238
|
+
}
|
239
|
+
File.open(@path, 'w') {|w|
|
240
|
+
w.binmode
|
241
|
+
Block.block_write(w, Index::MAGIC_SYMBOL, Marshal.dump(index_data_0_0))
|
242
|
+
}
|
243
|
+
|
244
|
+
i = Index.new
|
245
|
+
i.load(@path)
|
246
|
+
assert_equal(0, i.change_number)
|
247
|
+
assert_equal(1024, i.eoa)
|
248
|
+
assert_equal(512, i.free_fetch(512))
|
249
|
+
assert_equal(0, i[:foo])
|
250
|
+
assert_equal('foo', i.identity(:foo))
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
# Local Variables:
|
256
|
+
# mode: Ruby
|
257
|
+
# indent-tabs-mode: nil
|
258
|
+
# End:
|