higgs 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. data/ChangeLog +208 -0
  2. data/LICENSE +26 -0
  3. data/README +2 -0
  4. data/Rakefile +75 -0
  5. data/bin/higgs_backup +67 -0
  6. data/bin/higgs_dump_index +43 -0
  7. data/bin/higgs_dump_jlog +42 -0
  8. data/bin/higgs_verify +37 -0
  9. data/lib/cgi/session/higgs.rb +72 -0
  10. data/lib/higgs/block.rb +192 -0
  11. data/lib/higgs/cache.rb +117 -0
  12. data/lib/higgs/dbm.rb +55 -0
  13. data/lib/higgs/exceptions.rb +31 -0
  14. data/lib/higgs/flock.rb +77 -0
  15. data/lib/higgs/index.rb +164 -0
  16. data/lib/higgs/jlog.rb +159 -0
  17. data/lib/higgs/lock.rb +189 -0
  18. data/lib/higgs/storage.rb +1086 -0
  19. data/lib/higgs/store.rb +228 -0
  20. data/lib/higgs/tar.rb +390 -0
  21. data/lib/higgs/thread.rb +370 -0
  22. data/lib/higgs/tman.rb +513 -0
  23. data/lib/higgs/utils/bman.rb +285 -0
  24. data/lib/higgs/utils.rb +22 -0
  25. data/lib/higgs/version.rb +21 -0
  26. data/lib/higgs.rb +59 -0
  27. data/misc/cache_bench/cache_bench.rb +43 -0
  28. data/misc/dbm_bench/.strc +8 -0
  29. data/misc/dbm_bench/Rakefile +78 -0
  30. data/misc/dbm_bench/dbm_multi_thread.rb +199 -0
  31. data/misc/dbm_bench/dbm_rnd_delete.rb +43 -0
  32. data/misc/dbm_bench/dbm_rnd_read.rb +44 -0
  33. data/misc/dbm_bench/dbm_rnd_update.rb +44 -0
  34. data/misc/dbm_bench/dbm_seq_read.rb +45 -0
  35. data/misc/dbm_bench/dbm_seq_write.rb +44 -0
  36. data/misc/dbm_bench/st_verify.rb +28 -0
  37. data/misc/io_bench/cksum_bench.rb +48 -0
  38. data/misc/io_bench/jlog_bench.rb +71 -0
  39. data/misc/io_bench/write_bench.rb +128 -0
  40. data/misc/thread_bench/lock_bench.rb +132 -0
  41. data/mkrdoc.rb +8 -0
  42. data/rdoc.yml +13 -0
  43. data/sample/count.rb +60 -0
  44. data/sample/dbmtest.rb +38 -0
  45. data/test/Rakefile +45 -0
  46. data/test/run.rb +32 -0
  47. data/test/test_block.rb +163 -0
  48. data/test/test_cache.rb +214 -0
  49. data/test/test_cgi_session.rb +142 -0
  50. data/test/test_flock.rb +162 -0
  51. data/test/test_index.rb +258 -0
  52. data/test/test_jlog.rb +180 -0
  53. data/test/test_lock.rb +320 -0
  54. data/test/test_online_backup.rb +169 -0
  55. data/test/test_storage.rb +439 -0
  56. data/test/test_storage_conf.rb +202 -0
  57. data/test/test_storage_init_opts.rb +89 -0
  58. data/test/test_store.rb +211 -0
  59. data/test/test_tar.rb +432 -0
  60. data/test/test_thread.rb +541 -0
  61. data/test/test_tman.rb +875 -0
  62. data/test/test_tman_init_opts.rb +56 -0
  63. data/test/test_utils_bman.rb +234 -0
  64. metadata +115 -0
data/test/test_tar.rb ADDED
@@ -0,0 +1,432 @@
1
+ #!/usr/local/bin/ruby
2
+
3
+ require 'fileutils'
4
+ require 'higgs/tar'
5
+ require 'test/unit'
6
+
7
+ module Higgs::Test
8
+ class TarBlockTest < Test::Unit::TestCase
9
+ include Higgs::Tar
10
+
11
+ # for ident(1)
12
+ CVS_ID = '$Id: test_tar.rb 559 2007-09-25 15:20:20Z toki $'
13
+
14
+ def test_padding_size
15
+ assert_equal(0, Block.padding_size(0))
16
+
17
+ assert_equal(511, Block.padding_size(1))
18
+ assert_equal(510, Block.padding_size(2))
19
+ assert_equal(509, Block.padding_size(3))
20
+
21
+ assert_equal(3, Block.padding_size(509))
22
+ assert_equal(2, Block.padding_size(510))
23
+ assert_equal(1, Block.padding_size(511))
24
+
25
+ assert_equal(0, Block.padding_size(512))
26
+
27
+ assert_equal(511, Block.padding_size(513))
28
+ assert_equal(510, Block.padding_size(514))
29
+ assert_equal(509, Block.padding_size(515))
30
+ end
31
+
32
+ def test_blocked_size
33
+ assert_equal(0, Block.blocked_size(0))
34
+
35
+ assert_equal(512, Block.blocked_size(1))
36
+ assert_equal(512, Block.blocked_size(2))
37
+ assert_equal(512, Block.blocked_size(3))
38
+
39
+ assert_equal(512, Block.blocked_size(509))
40
+ assert_equal(512, Block.blocked_size(510))
41
+ assert_equal(512, Block.blocked_size(511))
42
+
43
+ assert_equal(512, Block.blocked_size(512))
44
+
45
+ assert_equal(1024, Block.blocked_size(513))
46
+ assert_equal(1024, Block.blocked_size(514))
47
+ assert_equal(1024, Block.blocked_size(515))
48
+ end
49
+
50
+ def test_tar?
51
+ begin
52
+ FileUtils.mkdir_p('foo')
53
+ File.open('foo/bar', 'wb') {|w| w << "HALO\n" }
54
+ File.open('baz', 'wb') {|w| w << "Hello world.\n" }
55
+ system('tar cf foo.tar foo baz') # required unix tar command
56
+
57
+ assert((File.exist? 'foo.tar'))
58
+ assert_equal(true, (Block.tar? 'foo.tar'))
59
+ assert_equal(false, (Block.tar? 'foo'))
60
+ assert_equal(false, (Block.tar? 'foo/bar'))
61
+ assert_equal(false, (Block.tar? 'baz'))
62
+ ensure
63
+ FileUtils.rm_f %w[ foo.tar foo/bar baz ]
64
+ FileUtils.rm_rf('foo')
65
+ end
66
+ end
67
+ end
68
+
69
+ class TarIOReadTest < Test::Unit::TestCase
70
+ # for ident(1)
71
+ CVS_ID = '$Id: test_tar.rb 559 2007-09-25 15:20:20Z toki $'
72
+
73
+ def open_for_read(filename)
74
+ File.open(filename, 'rb')
75
+ end
76
+
77
+ def setup
78
+ File.open('foo.dat', 'wb') {|w| w << '0123456789' }
79
+ @io = open_for_read('foo.dat')
80
+ end
81
+
82
+ def teardown
83
+ @io.close
84
+ FileUtils.rm_f('foo.dat')
85
+ end
86
+
87
+ def test_read
88
+ assert_equal(0, @io.tell)
89
+ assert_equal('0', @io.read(1))
90
+ assert_equal(1, @io.pos)
91
+ assert_equal('12', @io.read(2))
92
+ assert_equal(3, @io.tell)
93
+ assert_equal('345', @io.read(3))
94
+ assert_equal(6, @io.pos)
95
+ assert_equal('6789', @io.read(5))
96
+ assert_equal(10, @io.tell)
97
+ assert_equal(nil, @io.read(7))
98
+ assert_equal(10, @io.tell)
99
+ end
100
+
101
+ def test_seek
102
+ @io.seek(10)
103
+ assert_equal(10, @io.tell)
104
+ assert_equal(nil, @io.read(1))
105
+ @io.pos = 9
106
+ assert_equal(9, @io.pos)
107
+ assert_equal('9', @io.read(1))
108
+ @io.seek(8)
109
+ assert_equal(8, @io.tell)
110
+ assert_equal('8', @io.read(1))
111
+ @io.pos = 7
112
+ assert_equal(7, @io.pos)
113
+ assert_equal('7', @io.read(1))
114
+ @io.seek(6)
115
+ assert_equal(6, @io.tell)
116
+ assert_equal('6', @io.read(1))
117
+ @io.pos = 5
118
+ assert_equal(5, @io.pos)
119
+ assert_equal('5', @io.read(1))
120
+ @io.seek(4)
121
+ assert_equal(4, @io.tell)
122
+ assert_equal('4', @io.read(1))
123
+ @io.pos = 3
124
+ assert_equal(3, @io.pos)
125
+ assert_equal('3', @io.read(1))
126
+ @io.seek(2)
127
+ assert_equal(2, @io.tell)
128
+ assert_equal('2', @io.read(1))
129
+ @io.pos = 1
130
+ assert_equal(1, @io.pos)
131
+ assert_equal('1', @io.read(1))
132
+ @io.seek(0)
133
+ assert_equal(0, @io.tell)
134
+ assert_equal('0', @io.read(1))
135
+ end
136
+ end
137
+
138
+ class TarIOSysreadTest < TarIOReadTest
139
+ include Higgs::Tar
140
+
141
+ # for ident(1)
142
+ CVS_ID = '$Id: test_tar.rb 559 2007-09-25 15:20:20Z toki $'
143
+
144
+ def open_for_read(filename)
145
+ RawIO.new(File.open(filename, 'rb'))
146
+ end
147
+ end
148
+
149
+ class TarArchiveReaderTest < Test::Unit::TestCase
150
+ include Higgs::Tar
151
+ include Higgs::Tar::Block
152
+
153
+ # for ident(1)
154
+ CVS_ID = '$Id: test_tar.rb 559 2007-09-25 15:20:20Z toki $'
155
+
156
+ def open_for_read(filename)
157
+ File.open(filename, 'rb')
158
+ end
159
+
160
+ def setup
161
+ # tar
162
+ FileUtils.mkdir_p('foo')
163
+ File.open('foo/bar', 'wb') {|w| w << "HALO\n" }
164
+ File.open('baz', 'wb') {|w| w << "Hello world.\n" }
165
+ FileUtils.touch 'zero'
166
+ system('tar cf foo.tar foo baz zero') # required unix tar command
167
+
168
+ # target
169
+ @input = open_for_read('foo.tar')
170
+ @tar = ArchiveReader.new(@input)
171
+ end
172
+
173
+ def teardown
174
+ @input.close unless @input.closed?
175
+ #system('cp foo.tar foo_debug.tar') # debug
176
+ FileUtils.rm_f %w[ foo.tar foo/bar baz zero ]
177
+ FileUtils.rm_rf('foo')
178
+ end
179
+
180
+ def test_fetch
181
+ head_and_body = @tar.fetch
182
+ assert('foo/' == head_and_body[:name] || 'foo' == head_and_body[:name])
183
+ assert_equal(0, head_and_body[:size])
184
+ assert_equal(File.stat('foo').mtime, head_and_body[:mtime])
185
+ assert_equal(DIRTYPE, head_and_body[:typeflag])
186
+ assert_equal(MAGIC, head_and_body[:magic])
187
+ assert_equal(nil, head_and_body[:body])
188
+
189
+ head_and_body = @tar.fetch
190
+ assert_equal('foo/bar', head_and_body[:name])
191
+ assert_equal(5, head_and_body[:size])
192
+ assert_equal(File.stat('foo/bar').mtime, head_and_body[:mtime])
193
+ assert_equal(REGTYPE, head_and_body[:typeflag])
194
+ assert_equal(MAGIC, head_and_body[:magic])
195
+ assert_equal("HALO\n", head_and_body[:body])
196
+
197
+ head_and_body = @tar.fetch
198
+ assert_equal('baz', head_and_body[:name])
199
+ assert_equal(13, head_and_body[:size])
200
+ assert_equal(File.stat('baz').mtime, head_and_body[:mtime])
201
+ assert_equal(REGTYPE, head_and_body[:typeflag])
202
+ assert_equal(MAGIC, head_and_body[:magic])
203
+ assert_equal("Hello world.\n", head_and_body[:body])
204
+
205
+ head_and_body = @tar.fetch
206
+ assert_equal('zero', head_and_body[:name])
207
+ assert_equal(0, head_and_body[:size])
208
+ assert_equal(File.stat('zero').mtime, head_and_body[:mtime])
209
+ assert_equal(REGTYPE, head_and_body[:typeflag])
210
+ assert_equal(MAGIC, head_and_body[:magic])
211
+ assert_equal('', head_and_body[:body])
212
+
213
+ head_and_body = @tar.fetch
214
+ assert_equal(nil, head_and_body)
215
+ end
216
+
217
+ def test_each
218
+ count = 0
219
+ @tar.each do |head_and_body|
220
+ case (count)
221
+ when 0
222
+ assert('foo/' == head_and_body[:name] || 'foo' == head_and_body[:name])
223
+ assert_equal(0, head_and_body[:size])
224
+ assert_equal(File.stat('foo').mtime, head_and_body[:mtime])
225
+ assert_equal(DIRTYPE, head_and_body[:typeflag])
226
+ assert_equal(MAGIC, head_and_body[:magic])
227
+ assert_equal(nil, head_and_body[:body])
228
+ when 1
229
+ assert_equal('foo/bar', head_and_body[:name])
230
+ assert_equal(5, head_and_body[:size])
231
+ assert_equal(File.stat('foo/bar').mtime, head_and_body[:mtime])
232
+ assert_equal(REGTYPE, head_and_body[:typeflag])
233
+ assert_equal(MAGIC, head_and_body[:magic])
234
+ assert_equal("HALO\n", head_and_body[:body])
235
+ when 2
236
+ assert_equal('baz', head_and_body[:name])
237
+ assert_equal(13, head_and_body[:size])
238
+ assert_equal(File.stat('baz').mtime, head_and_body[:mtime])
239
+ assert_equal(REGTYPE, head_and_body[:typeflag])
240
+ assert_equal(MAGIC, head_and_body[:magic])
241
+ assert_equal("Hello world.\n", head_and_body[:body])
242
+ when 3
243
+ assert_equal('zero', head_and_body[:name])
244
+ assert_equal(0, head_and_body[:size])
245
+ assert_equal(File.stat('zero').mtime, head_and_body[:mtime])
246
+ assert_equal(REGTYPE, head_and_body[:typeflag])
247
+ assert_equal(MAGIC, head_and_body[:magic])
248
+ assert_equal('', head_and_body[:body])
249
+ else
250
+ raise "unknown data: #{head_and_body.inspect}"
251
+ end
252
+ count += 1
253
+ end
254
+ assert_equal(4, count)
255
+ end
256
+
257
+ def test_close
258
+ @tar.close
259
+ assert(@input.closed?)
260
+ end
261
+ end
262
+
263
+ class TarArchiveReaderSyscallTest < TarArchiveReaderTest
264
+ # for ident(1)
265
+ CVS_ID = '$Id: test_tar.rb 559 2007-09-25 15:20:20Z toki $'
266
+
267
+ def open_for_read(filename)
268
+ RawIO.new(File.open(filename, 'rb'))
269
+ end
270
+ end
271
+
272
+ class TarArchiveWriterTest < Test::Unit::TestCase
273
+ include Higgs::Tar
274
+ include Higgs::Tar::Block
275
+
276
+ # for ident(1)
277
+ CVS_ID = '$Id: test_tar.rb 559 2007-09-25 15:20:20Z toki $'
278
+
279
+ def open_for_write(filename)
280
+ File.open(filename, 'wb')
281
+ end
282
+
283
+ def setup
284
+ # contents of tar
285
+ FileUtils.mkdir_p('foo')
286
+ File.open('foo/bar', 'wb') {|w| w << "HALO\n" }
287
+
288
+ # target
289
+ @output = open_for_write('foo.tar')
290
+ @tar = ArchiveWriter.new(@output)
291
+ end
292
+
293
+ def teardown
294
+ @output.close unless @output.closed?
295
+ #system('cp foo.tar foo_debug.tar') # debug
296
+ FileUtils.rm_f %w(foo.tar foo/bar)
297
+ FileUtils.rm_rf('foo')
298
+ end
299
+
300
+ def test_add
301
+ @tar.add_file('foo')
302
+ @tar.add_file('foo/bar')
303
+ timestamp = Time.now
304
+ @tar.add('baz', "Hello world.\n", :mtime => timestamp)
305
+ @tar.close
306
+ assert(@output.closed?)
307
+ File.open('foo.tar') {|r|
308
+ tar = ArchiveReader.new(r)
309
+ count = 0
310
+ for head_and_body in tar
311
+ case (count)
312
+ when 0
313
+ assert_equal('foo', head_and_body[:name])
314
+ assert_equal(0, head_and_body[:size])
315
+ assert_equal(File.stat('foo').mtime, head_and_body[:mtime])
316
+ assert_equal(DIRTYPE, head_and_body[:typeflag])
317
+ assert_equal(MAGIC, head_and_body[:magic])
318
+ assert_equal(nil, head_and_body[:body])
319
+ when 1
320
+ assert_equal('foo/bar', head_and_body[:name])
321
+ assert_equal(5, head_and_body[:size])
322
+ assert_equal(File.stat('foo/bar').mtime, head_and_body[:mtime])
323
+ assert_equal(REGTYPE, head_and_body[:typeflag])
324
+ assert_equal(MAGIC, head_and_body[:magic])
325
+ assert_equal("HALO\n", head_and_body[:body])
326
+ when 2
327
+ assert_equal('baz', head_and_body[:name])
328
+ assert_equal(13, head_and_body[:size])
329
+ assert_equal(timestamp.to_i, head_and_body[:mtime].to_i)
330
+ assert_equal(REGTYPE, head_and_body[:typeflag])
331
+ assert_equal(MAGIC, head_and_body[:magic])
332
+ assert_equal(Process.euid, head_and_body[:uid])
333
+ assert_equal(Process.egid, head_and_body[:gid])
334
+ assert_equal("Hello world.\n", head_and_body[:body])
335
+ else
336
+ raise "unknown data: #{head_and_body.inspect}"
337
+ end
338
+ count += 1
339
+ end
340
+ assert_equal(3, count)
341
+ }
342
+ end
343
+ end
344
+
345
+ class TarArchiveWriterSyscallTest < TarArchiveWriterTest
346
+ # for ident(1)
347
+ CVS_ID = '$Id: test_tar.rb 559 2007-09-25 15:20:20Z toki $'
348
+
349
+ def open_for_write(filename)
350
+ RawIO.new(File.open(filename, 'wb'))
351
+ end
352
+ end
353
+
354
+ class TarArchiveHeaderTest < Test::Unit::TestCase
355
+ include Higgs::Tar
356
+ include Higgs::Tar::Block
357
+
358
+ # for ident(1)
359
+ CVS_ID = '$Id: test_tar.rb 559 2007-09-25 15:20:20Z toki $'
360
+
361
+ def setup
362
+ @output = File.open('foo.tar', 'wb')
363
+ @input = File.open('foo.tar', 'rb')
364
+ @writer = ArchiveWriter.new(@output)
365
+ @reader = ArchiveReader.new(@input)
366
+ end
367
+
368
+ def teardown
369
+ @output.close unless @output.closed?
370
+ @input.close unless @input.closed?
371
+ FileUtils.rm_f('foo.tar')
372
+ end
373
+
374
+ def test_read_header_FormatError_unexpected_EOF
375
+ assert_equal(0, @input.stat.size)
376
+ assert_raise(FormatError) { @reader.read_header }
377
+ end
378
+
379
+ def test_read_header_FormatError_too_short_header
380
+ @output.write("foo\n")
381
+ @output.flush
382
+ assert_equal(4, @input.stat.size)
383
+ assert_raise(FormatError) { @reader.read_header }
384
+ end
385
+
386
+ def test_read_header_FormatError_not_of_EOA
387
+ @output.write("\0" * BLKSIZ)
388
+ @output.flush
389
+ assert_equal(BLKSIZ, @input.stat.size)
390
+ assert_raise(FormatError) { @reader.read_header }
391
+ end
392
+
393
+ def test_read_header_typeflag_AREGTYPE
394
+ @writer.add('foo', "Hello world.\n", :typeflag => AREGTYPE)
395
+ @output.flush
396
+ assert_equal(BLKSIZ * 2, @input.stat.size)
397
+ head = @reader.read_header
398
+ assert_equal(BLKSIZ, @input.pos)
399
+ assert_equal('foo', head[:name])
400
+ assert_equal(REGTYPE, head[:typeflag], 'AREGTYPE -> REGTYPE')
401
+ end
402
+
403
+ def test_read_header_MagicError_unknown_format
404
+ @writer.add('foo', "Hello world.\n", :magic => 'unknown')
405
+ @output.flush
406
+ assert_equal(BLKSIZ * 2, @input.stat.size)
407
+ assert_raise(MagicError) { @reader.read_header }
408
+ assert_equal(BLKSIZ, @input.pos)
409
+ end
410
+
411
+ def test_read_header_CheckSumError_broken_tar
412
+ @writer.add('foo', "Hello world.\n", :chksum => 0)
413
+ @output.flush
414
+ assert_equal(BLKSIZ * 2, @input.stat.size)
415
+ assert_raise(CheckSumError) { @reader.read_header }
416
+ assert_equal(BLKSIZ, @input.pos)
417
+ end
418
+
419
+ def test_read_header_skip_body
420
+ @writer.add('foo', "Hello world.\n")
421
+ @output.flush
422
+ assert_equal(BLKSIZ * 2, @input.stat.size)
423
+ @reader.read_header(true)
424
+ assert_equal(BLKSIZ * 2, @input.pos)
425
+ end
426
+ end
427
+ end
428
+
429
+ # Local Variables:
430
+ # mode: Ruby
431
+ # indent-tabs-mode: nil
432
+ # End: