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
@@ -0,0 +1,89 @@
1
+ #!/usr/local/bin/ruby
2
+
3
+ require 'higgs/storage'
4
+ require 'test/unit'
5
+
6
+ module Higgs::Test
7
+ class StorageInitOptionsTest < Test::Unit::TestCase
8
+ # for ident(1)
9
+ CVS_ID = '$Id: test_storage_init_opts.rb 559 2007-09-25 15:20:20Z toki $'
10
+
11
+ include Higgs::Storage::InitOptions
12
+
13
+ def test_default
14
+ init_options({})
15
+ assert_equal(false, @read_only)
16
+ assert_equal(false, self.read_only)
17
+ assert_equal(2, @number_of_read_io)
18
+ assert_equal(2, self.number_of_read_io)
19
+ assert_instance_of(Higgs::LRUCache, @properties_cache) # auto: require 'higgs/cache'
20
+ assert_equal(false, @jlog_sync)
21
+ assert_equal(false, self.jlog_sync)
22
+ assert_equal(1024 * 256, @jlog_rotate_size)
23
+ assert_equal(1024 * 256, self.jlog_rotate_size)
24
+ assert_equal(1, @jlog_rotate_max)
25
+ assert_equal(1, self.jlog_rotate_max)
26
+ assert_equal(nil, @jlog_rotate_service_uri)
27
+ assert_equal(nil, self.jlog_rotate_service_uri)
28
+ assert_instance_of(Proc, @Logger)
29
+ end
30
+
31
+ def test_read_only_true
32
+ init_options(:read_only => true)
33
+ assert_equal(true, @read_only)
34
+ assert_equal(true, self.read_only)
35
+ end
36
+
37
+ def test_read_only_false
38
+ init_options(:read_only => false)
39
+ assert_equal(false, @read_only)
40
+ assert_equal(false, self.read_only)
41
+ end
42
+
43
+ def test_number_of_read_io
44
+ init_options(:number_of_read_io => 16)
45
+ assert_equal(16, @number_of_read_io)
46
+ assert_equal(16, self.number_of_read_io)
47
+ end
48
+
49
+ def test_properties_cache
50
+ init_options(:properties_cache => :dummy_cache)
51
+ assert_equal(:dummy_cache, @properties_cache)
52
+ end
53
+
54
+ def test_jlog_sync_true
55
+ init_options(:jlog_sync => true)
56
+ assert_equal(true, @jlog_sync)
57
+ assert_equal(true, self.jlog_sync)
58
+ end
59
+
60
+ def test_jlog_sync_false
61
+ init_options(:jlog_sync => false)
62
+ assert_equal(false, @jlog_sync)
63
+ assert_equal(false, self.jlog_sync)
64
+ end
65
+
66
+ def test_jlog_rotate_size
67
+ init_options(:jlog_rotate_size => 1024**2)
68
+ assert_equal(1024**2, @jlog_rotate_size)
69
+ assert_equal(1024**2, self.jlog_rotate_size)
70
+ end
71
+
72
+ def test_jlog_rotate_max
73
+ init_options(:jlog_rotate_max => 100)
74
+ assert_equal(100, @jlog_rotate_max)
75
+ assert_equal(100, self.jlog_rotate_max)
76
+ end
77
+
78
+ def test_jlog_rotate_service_uri
79
+ init_options(:jlog_rotate_service_uri => 'druby://localhost:14142')
80
+ assert_equal('druby://localhost:14142', @jlog_rotate_service_uri)
81
+ assert_equal('druby://localhost:14142', self.jlog_rotate_service_uri)
82
+ end
83
+
84
+ def test_logger
85
+ init_options(:logger => proc{|path| :dummy_logger })
86
+ assert_equal(:dummy_logger, @Logger.call('foo'))
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,211 @@
1
+ #!/usr/local/bin/ruby
2
+
3
+ require 'fileutils'
4
+ require 'higgs/store'
5
+ require 'logger'
6
+ require 'test/unit'
7
+
8
+ module Higgs::Test
9
+ class StoreTest < Test::Unit::TestCase
10
+ include Higgs
11
+
12
+ # for ident(1)
13
+ CVS_ID = '$Id: test_store.rb 559 2007-09-25 15:20:20Z toki $'
14
+
15
+ def setup
16
+ @test_dir = 'store_test'
17
+ FileUtils.rm_rf(@test_dir) # for debug
18
+ FileUtils.mkdir_p(@test_dir)
19
+ @name = File.join(@test_dir, 'foo')
20
+ @st = Store.new(@name,
21
+ :logger => proc{|path|
22
+ logger = Logger.new(path, 1)
23
+ logger.level = Logger::DEBUG
24
+ logger
25
+ })
26
+ end
27
+
28
+ def teardown
29
+ @st.shutdown unless @st.shutdown?
30
+ FileUtils.rm_rf(@test_dir) unless $DEBUG
31
+ end
32
+
33
+ def test_fetch_and_store
34
+ @st.transaction{|tx|
35
+ assert_equal(nil, tx[:foo])
36
+ assert_equal(nil, tx['bar'])
37
+ assert_equal(nil, tx[0])
38
+
39
+ assert_equal(false, (tx.key? :foo))
40
+ assert_equal(false, (tx.key? 'bar'))
41
+ assert_equal(false, (tx.key? 0))
42
+
43
+ tx[:foo] = :HALO
44
+ tx['bar'] = "Hello world.\n"
45
+ tx[0] = nil
46
+
47
+ assert_equal(:HALO, tx[:foo])
48
+ assert_equal("Hello world.\n", tx['bar'])
49
+ assert_equal(nil, tx[0])
50
+
51
+ assert_equal(true, (tx.key? :foo))
52
+ assert_equal(true, (tx.key? 'bar'))
53
+ assert_equal(true, (tx.key? 0))
54
+ }
55
+
56
+ @st.transaction{|tx|
57
+ assert_equal(:HALO, tx[:foo])
58
+ assert_equal("Hello world.\n", tx['bar'])
59
+ assert_equal(nil, tx[0])
60
+
61
+ assert_equal(true, (tx.key? :foo))
62
+ assert_equal(true, (tx.key? 'bar'))
63
+ assert_equal(true, (tx.key? 0))
64
+ }
65
+ end
66
+
67
+ def test_update
68
+ @st.transaction{|tx|
69
+ tx[:foo] = []
70
+ }
71
+
72
+ @st.transaction{|tx|
73
+ tx.update(:foo) {|a|
74
+ a << 'apple'
75
+ a << 'banana'
76
+ a << 'orange'
77
+ }
78
+ }
79
+
80
+ @st.transaction{|tx|
81
+ assert_equal(%w[ apple banana orange ], tx[:foo])
82
+ }
83
+ end
84
+
85
+ def test_update_with_default_value
86
+ @st.transaction{|tx|
87
+ assert(! (tx.key? :foo))
88
+ tx.update(:foo, []) {|a|
89
+ a << 'apple'
90
+ a << 'banana'
91
+ a << 'orange'
92
+ }
93
+ }
94
+
95
+ @st.transaction{|tx|
96
+ assert_equal(%w[ apple banana orange ], tx[:foo])
97
+ }
98
+ end
99
+
100
+ def test_update_IndexError
101
+ @st.transaction{|tx|
102
+ assert_raise(IndexError) {
103
+ tx.update(:foo) {|value|
104
+ flunk('not to reach.')
105
+ }
106
+ }
107
+ }
108
+ end
109
+
110
+ def test_string_only
111
+ @st.transaction{|tx|
112
+ assert_equal(nil, tx.property(:foo, :string_only))
113
+ tx[:foo] = 0
114
+ }
115
+
116
+ @st.transaction{|tx|
117
+ assert_equal(false, tx.property(:foo, :string_only))
118
+ assert_equal(0, tx[:foo])
119
+ tx.set_property(:foo, :string_only, true)
120
+ assert_equal(0, tx[:foo])
121
+ }
122
+
123
+ @st.transaction{|tx|
124
+ assert_equal(true, tx.property(:foo, :string_only))
125
+ assert_equal(Marshal.dump(0), tx[:foo])
126
+ tx[:foo] = "Hello world.\n"
127
+ }
128
+
129
+ @st.transaction{|tx|
130
+ assert_equal(true, tx.property(:foo, :string_only))
131
+ assert_equal("Hello world.\n", tx[:foo])
132
+ }
133
+ end
134
+
135
+ def test_string_only_TypeError_cant_convert_into_String
136
+ @st.transaction{|tx|
137
+ tx[:foo] = 0
138
+ tx.set_property(:foo, :string_only, true)
139
+ assert_raise(TypeError) { tx.commit }
140
+ tx.rollback
141
+ }
142
+ end
143
+
144
+ def test_rollback
145
+ @st.transaction{|tx|
146
+ tx[:foo] = %w[ apple banana orange ]
147
+ }
148
+
149
+ @st.transaction{|tx|
150
+ fruits = tx[:foo]
151
+ assert_equal(%w[ apple banana orange ], fruits)
152
+ assert_equal('orange', fruits.pop)
153
+ assert_equal(%w[ apple banana ], fruits)
154
+ tx[:foo] = fruits
155
+ tx.rollback
156
+ assert_equal(%w[ apple banana orange ], tx[:foo])
157
+ }
158
+
159
+ @st.transaction{|tx|
160
+ assert_equal(%w[ apple banana orange ], tx[:foo])
161
+ }
162
+ end
163
+
164
+ def test_replica_problem
165
+ @st.transaction{|tx|
166
+ tx[:foo] = 'a'
167
+ tx[:bar] = tx[:foo]
168
+
169
+ assert_equal('a', tx[:foo])
170
+ assert_equal('a', tx[:bar])
171
+ assert_same(tx[:foo], tx[:bar])
172
+
173
+ tx[:foo].succ!
174
+ assert_equal('b', tx[:foo])
175
+ assert_equal('b', tx[:bar])
176
+ assert_same(tx[:foo], tx[:bar])
177
+ }
178
+
179
+ @st.transaction{|tx|
180
+ assert_equal('b', tx[:foo])
181
+ assert_equal('b', tx[:bar])
182
+ assert_not_same(tx[:foo], tx[:bar])
183
+
184
+ tx[:foo].succ!
185
+ assert_equal('c', tx[:foo])
186
+ assert_equal('b', tx[:bar])
187
+ assert_not_same(tx[:foo], tx[:bar])
188
+ }
189
+ end
190
+
191
+ def test_each_key
192
+ @st.transaction{|tx|
193
+ tx[:foo] = 'apple'
194
+ tx[:bar] = ''
195
+ tx[:baz] = nil
196
+
197
+ expected_keys = [ :foo, :bar, :baz ]
198
+ tx.each_key do |key|
199
+ assert((expected_keys.include? key), key)
200
+ expected_keys.delete(key)
201
+ end
202
+ assert_equal([], expected_keys)
203
+ }
204
+ end
205
+ end
206
+ end
207
+
208
+ # Local Variables:
209
+ # mode: Ruby
210
+ # indent-tabs-mode: nil
211
+ # End: