cassilds 0.9.1

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 (47) hide show
  1. data/CHANGELOG +53 -0
  2. data/LICENSE +202 -0
  3. data/Manifest +45 -0
  4. data/README.rdoc +83 -0
  5. data/Rakefile +9 -0
  6. data/bin/cassandra_helper +16 -0
  7. data/cassandra.gemspec +46 -0
  8. data/conf/cassandra.in.sh +47 -0
  9. data/conf/cassandra.yaml +113 -0
  10. data/conf/log4j.properties +38 -0
  11. data/conf/storage-conf.xml +342 -0
  12. data/lib/cassandra/0.6/cassandra.rb +68 -0
  13. data/lib/cassandra/0.6/columns.rb +35 -0
  14. data/lib/cassandra/0.6/protocol.rb +92 -0
  15. data/lib/cassandra/0.6.rb +7 -0
  16. data/lib/cassandra/0.7/cassandra.rb +272 -0
  17. data/lib/cassandra/0.7/column_family.rb +3 -0
  18. data/lib/cassandra/0.7/columns.rb +67 -0
  19. data/lib/cassandra/0.7/keyspace.rb +3 -0
  20. data/lib/cassandra/0.7/protocol.rb +139 -0
  21. data/lib/cassandra/0.7.rb +7 -0
  22. data/lib/cassandra/array.rb +8 -0
  23. data/lib/cassandra/cassandra.rb +302 -0
  24. data/lib/cassandra/columns.rb +79 -0
  25. data/lib/cassandra/comparable.rb +28 -0
  26. data/lib/cassandra/constants.rb +11 -0
  27. data/lib/cassandra/debug.rb +9 -0
  28. data/lib/cassandra/helpers.rb +40 -0
  29. data/lib/cassandra/long.rb +58 -0
  30. data/lib/cassandra/mock.rb +326 -0
  31. data/lib/cassandra/ordered_hash.rb +200 -0
  32. data/lib/cassandra/time.rb +11 -0
  33. data/lib/cassandra.rb +39 -0
  34. data/test/cassandra_client_test.rb +20 -0
  35. data/test/cassandra_mock_test.rb +73 -0
  36. data/test/cassandra_test.rb +412 -0
  37. data/test/comparable_types_test.rb +45 -0
  38. data/test/eventmachine_test.rb +42 -0
  39. data/test/ordered_hash_test.rb +380 -0
  40. data/test/test_helper.rb +14 -0
  41. data/vendor/0.6/gen-rb/cassandra.rb +1481 -0
  42. data/vendor/0.6/gen-rb/cassandra_constants.rb +12 -0
  43. data/vendor/0.6/gen-rb/cassandra_types.rb +482 -0
  44. data/vendor/0.7/gen-rb/cassandra.rb +1937 -0
  45. data/vendor/0.7/gen-rb/cassandra_constants.rb +12 -0
  46. data/vendor/0.7/gen-rb/cassandra_types.rb +679 -0
  47. metadata +176 -0
@@ -0,0 +1,412 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+
3
+ class CassandraTest < Test::Unit::TestCase
4
+ include Cassandra::Constants
5
+
6
+ def setup
7
+ @twitter = Cassandra.new('Twitter', "127.0.0.1:9160", :retries => 2, :exception_classes => [])
8
+ @twitter.clear_keyspace!
9
+
10
+ @blogs = Cassandra.new('Multiblog')
11
+ @blogs.clear_keyspace!
12
+
13
+ @blogs_long = Cassandra.new('MultiblogLong')
14
+ @blogs_long.clear_keyspace!
15
+
16
+ @uuids = (0..6).map {|i| SimpleUUID::UUID.new(Time.at(2**(24+i))) }
17
+ @longs = (0..6).map {|i| Long.new(Time.at(2**(24+i))) }
18
+ end
19
+
20
+ def test_inspect
21
+ assert_nothing_raised do
22
+ @blogs.inspect
23
+ @twitter.inspect
24
+ end
25
+ end
26
+
27
+ def test_get_key
28
+ @twitter.insert(:Users, key, {'body' => 'v', 'user' => 'v'})
29
+ assert_equal({'body' => 'v', 'user' => 'v'}, @twitter.get(:Users, key))
30
+ assert_equal(['body', 'user'].sort, @twitter.get(:Users, key).timestamps.keys.sort)
31
+ assert_equal({}, @twitter.get(:Users, 'bogus'))
32
+ end
33
+
34
+ def test_get_key_preserving_order
35
+ # In-order hash is preserved
36
+ hash = OrderedHash['a', '', 'b', '', 'c', '', 'd', '',]
37
+ @twitter.insert(:Users, key, hash)
38
+ assert_equal(hash.keys, @twitter.get(:Users, key).keys)
39
+
40
+ @twitter.remove(:Users, key)
41
+
42
+ # Out-of-order hash is returned sorted
43
+ hash = OrderedHash['b', '', 'c', '', 'd', '', 'a', '']
44
+ @twitter.insert(:Users, key, hash)
45
+ assert_equal(hash.keys.sort, @twitter.get(:Users, key).keys)
46
+ assert_equal(hash.timestamps.keys.sort, @twitter.get(:Users, key).timestamps.keys.sort)
47
+ assert_not_equal(hash.keys, @twitter.get(:Users, key).keys)
48
+ end
49
+
50
+ def test_get_first_time_uuid_column
51
+ @blogs.insert(:Blogs, key,
52
+ {@uuids[0] => 'I like this cat', @uuids[1] => 'Buttons is cuter', @uuids[2] => 'I disagree'})
53
+
54
+ assert_equal({@uuids[0] => 'I like this cat'}, @blogs.get(:Blogs, key, :count => 1))
55
+ assert_equal({@uuids[2] => 'I disagree'}, @blogs.get(:Blogs, key, :count => 1, :reversed => true))
56
+ assert_equal({}, @blogs.get(:Blogs, 'bogus'))
57
+ end
58
+
59
+ def test_get_multiple_time_uuid_columns
60
+ @blogs.insert(:Blogs, key,
61
+ {@uuids[0] => 'I like this cat', @uuids[1] => 'Buttons is cuter', @uuids[2] => 'I disagree'})
62
+
63
+ assert_equal(['I like this cat', 'Buttons is cuter'], @blogs.get_columns(:Blogs, key, @uuids[0..1]))
64
+ end
65
+
66
+ def test_get_first_long_column
67
+ @blogs_long.insert(:Blogs, key,
68
+ {@longs[0] => 'I like this cat', @longs[1] => 'Buttons is cuter', @longs[2] => 'I disagree'})
69
+
70
+ assert_equal({@longs[0] => 'I like this cat'}, @blogs_long.get(:Blogs, key, :count => 1))
71
+ assert_equal({@longs[2] => 'I disagree'}, @blogs_long.get(:Blogs, key, :count => 1, :reversed => true))
72
+ assert_equal({}, @blogs_long.get(:Blogs, 'bogus'))
73
+
74
+ assert_equal([@longs[0]], @blogs_long.get(:Blogs, key, :count => 1).timestamps.keys)
75
+ assert_equal([@longs[2]], @blogs_long.get(:Blogs, key, :count => 1, :reversed => true).timestamps.keys)
76
+ end
77
+
78
+ def test_long_remove_bug
79
+ @blogs_long.insert(:Blogs, key, {@longs[0] => 'I like this cat'})
80
+ @blogs_long.remove(:Blogs, key)
81
+ assert_equal({}, @blogs_long.get(:Blogs, key, :count => 1))
82
+
83
+ @blogs_long.insert(:Blogs, key, {@longs[0] => 'I really like this cat'})
84
+ assert_equal({@longs[0] => 'I really like this cat'}, @blogs_long.get(:Blogs, key, :count => 1))
85
+ assert_equal([@longs[0]], @blogs_long.get(:Blogs, key, :count => 1).timestamps.keys)
86
+ end
87
+
88
+ def test_get_with_count
89
+ @twitter.insert(:Statuses, key, {'1' => 'v', '2' => 'v', '3' => 'v'})
90
+ assert_equal 1, @twitter.get(:Statuses, key, :count => 1).size
91
+ assert_equal 2, @twitter.get(:Statuses, key, :count => 2).size
92
+ assert_equal 1, @twitter.get(:Statuses, key, :count => 1).timestamps.size
93
+ assert_equal 2, @twitter.get(:Statuses, key, :count => 2).timestamps.size
94
+ end
95
+
96
+ def test_get_value
97
+ @twitter.insert(:Statuses, key, {'body' => 'v'})
98
+ assert_equal 'v', @twitter.get(:Statuses, key, 'body')
99
+ assert_nil @twitter.get(:Statuses, 'bogus', 'body')
100
+
101
+ assert @twitter.exists?(:Statuses, key, 'body')
102
+ assert !@twitter.exists?(:Statuses, 'bogus', 'body')
103
+ end
104
+
105
+ def test_exists_with_only_key
106
+ @twitter.insert(:Statuses, key, {'body' => 'v'})
107
+ assert @twitter.exists?(:Statuses, key)
108
+ end
109
+
110
+ def test_get_super_key
111
+ columns = {'user_timelines' => {@uuids[4] => '4', @uuids[5] => '5'}}
112
+ @twitter.insert(:StatusRelationships, key, columns)
113
+ assert_equal(columns, @twitter.get(:StatusRelationships, key))
114
+ assert_equal(columns.keys, @twitter.get(:StatusRelationships, key).timestamps.keys)
115
+ assert_equal({}, @twitter.get(:StatusRelationships, 'bogus'))
116
+ end
117
+
118
+ def test_get_several_super_keys
119
+ columns = {
120
+ 'user_timelines' => {@uuids[1] => 'v1'},
121
+ 'mentions_timelines' => {@uuids[2] => 'v2'}}
122
+ @twitter.insert(:StatusRelationships, key, columns)
123
+
124
+ assert_equal(columns, @twitter.get(:StatusRelationships, key))
125
+ assert_equal(columns.keys, @twitter.get(:StatusRelationships, key).timestamps.keys)
126
+ assert_equal({}, @twitter.get(:StatusRelationships, 'bogus'))
127
+ end
128
+
129
+ def test_get_super_sub_keys_with_count
130
+ @twitter.insert(:StatusRelationships, key,
131
+ {'user_timelines' => {@uuids[1] => 'v1', @uuids[2] => 'v2', @uuids[3] => 'v3'}})
132
+ assert_equal({@uuids[1] => 'v1'},
133
+ @twitter.get(:StatusRelationships, key, "user_timelines", :count => 1))
134
+ assert_equal({@uuids[3] => 'v3'},
135
+ @twitter.get(:StatusRelationships, key, "user_timelines", :count => 1, :reversed => true))
136
+ assert_equal([@uuids[1]],
137
+ @twitter.get(:StatusRelationships, key, "user_timelines", :count => 1).timestamps.keys)
138
+ assert_equal([@uuids[3]],
139
+ @twitter.get(:StatusRelationships, key, "user_timelines", :count => 1, :reversed => true).timestamps.keys)
140
+ end
141
+
142
+ def test_get_super_sub_keys_with_ranges
143
+ @twitter.insert(:StatusRelationships, key,
144
+ {'user_timelines' => {
145
+ @uuids[1] => 'v1',
146
+ @uuids[2] => 'v2',
147
+ @uuids[3] => 'v3',
148
+ @uuids[4] => 'v4',
149
+ @uuids[5] => 'v5'}})
150
+
151
+ keys = @twitter.get(:StatusRelationships, key, "user_timelines").keys
152
+ assert_equal keys.sort, keys
153
+ assert_equal({@uuids[1] => 'v1'}, @twitter.get(:StatusRelationships, key, "user_timelines", :finish => @uuids[2], :count => 1))
154
+ assert_equal({@uuids[2] => 'v2'}, @twitter.get(:StatusRelationships, key, "user_timelines", :start => @uuids[2], :count => 1))
155
+ assert_equal 4, @twitter.get(:StatusRelationships, key, "user_timelines", :start => @uuids[2], :finish => @uuids[5]).size
156
+ assert_equal([@uuids[1]], @twitter.get(:StatusRelationships, key, "user_timelines", :finish => @uuids[2], :count => 1).timestamps.keys)
157
+ assert_equal([@uuids[2]], @twitter.get(:StatusRelationships, key, "user_timelines", :start => @uuids[2], :count => 1).timestamps.keys)
158
+ assert_equal 4, @twitter.get(:StatusRelationships, key, "user_timelines", :start => @uuids[2], :finish => @uuids[5]).timestamps.size
159
+ end
160
+
161
+ def test_get_super_sub_key
162
+ columns = {@uuids[1] => 'v1', @uuids[2] => 'v2'}
163
+ @twitter.insert(:StatusRelationships, key, {'user_timelines' => columns})
164
+ assert_equal(columns, @twitter.get(:StatusRelationships, key, 'user_timelines'))
165
+ assert_equal(columns.keys.sort, @twitter.get(:StatusRelationships, key, 'user_timelines').timestamps.keys.sort)
166
+ assert_equal({}, @twitter.get(:StatusRelationships, 'bogus', 'user_timelines'))
167
+ # FIXME Not sure if this is valid
168
+ # assert_nil @twitter.exists?(:StatusRelationships, 'bogus', 'user_timelines')
169
+ end
170
+
171
+ def test_get_super_value
172
+ columns = {@uuids[1] => 'v1'}
173
+ @twitter.insert(:StatusRelationships, key, {'user_timelines' => columns})
174
+ assert_equal('v1', @twitter.get(:StatusRelationships, key, 'user_timelines', columns.keys.first))
175
+ assert_nil @twitter.get(:StatusRelationships, 'bogus', 'user_timelines', columns.keys.first)
176
+ end
177
+
178
+
179
+ #TODO: add a OPP keyspace for this
180
+ # def test_get_range
181
+ # @twitter.insert(:Statuses, '2', {'body' => '1'})
182
+ # @twitter.insert(:Statuses, '3', {'body' => '1'})
183
+ # @twitter.insert(:Statuses, '4', {'body' => '1'})
184
+ # @twitter.insert(:Statuses, '5', {'body' => '1'})
185
+ # @twitter.insert(:Statuses, '6', {'body' => '1'})
186
+ # assert_equal(['3', '4', '5'], @twitter.get_range(:Statuses, :start => '3', :finish => '5'))
187
+ # end
188
+
189
+ def test_get_range_count
190
+ @twitter.insert(:Statuses, '2', {'body' => '1'})
191
+ @twitter.insert(:Statuses, '3', {'body' => '1'})
192
+ @twitter.insert(:Statuses, '4', {'body' => '1'})
193
+ @twitter.insert(:Statuses, '5', {'body' => '1'})
194
+ @twitter.insert(:Statuses, '6', {'body' => '1'})
195
+ assert_equal(3, @twitter.get_range(:Statuses, :count => 3).size)
196
+ end
197
+
198
+ def test_multi_get
199
+ @twitter.insert(:Users, key + '1', {'body' => 'v1', 'user' => 'v1'})
200
+ @twitter.insert(:Users, key + '2', {'body' => 'v2', 'user' => 'v2'})
201
+
202
+ expected = OrderedHash[key + '1', {'body' => 'v1', 'user' => 'v1'}, key + '2', {'body' => 'v2', 'user' => 'v2'}, 'bogus', {}]
203
+ result = @twitter.multi_get(:Users, [key + '1', key + '2', 'bogus'])
204
+ assert_equal expected, result
205
+ assert_equal expected.keys, result.keys
206
+ assert_equal expected.keys.sort, @twitter.multi_get(:Users, [key + '1', key + '2', 'bogus']).timestamps.keys.sort
207
+
208
+ expected = OrderedHash[key + '2', {'body' => 'v2', 'user' => 'v2'}, 'bogus', {}, key + '1', {'body' => 'v1', 'user' => 'v1'}]
209
+ result = @twitter.multi_get(:Users, [key + '2', 'bogus', key + '1'])
210
+ assert_equal expected, result
211
+ assert_equal expected.keys, result.keys
212
+ assert_equal expected.keys.sort, @twitter.multi_get(:Users, [key + '2', 'bogus', key + '1']).timestamps.keys.sort
213
+ end
214
+
215
+ def test_remove_key
216
+ @twitter.insert(:Statuses, key, {'body' => 'v'})
217
+ assert_equal({'body' => 'v'}, @twitter.get(:Statuses, key))
218
+
219
+ @twitter.remove(:Statuses, key)
220
+ assert_equal({}, @twitter.get(:Statuses, key))
221
+ end
222
+
223
+ def test_remove_value
224
+ @twitter.insert(:Statuses, key, {'body' => 'v'})
225
+ @twitter.remove(:Statuses, key, 'body')
226
+ assert_nil @twitter.get(:Statuses, key, 'body')
227
+ assert_nil @twitter.get(:Statuses, key).timestamps['body']
228
+ end
229
+
230
+ def test_remove_super_key
231
+ @twitter.insert(:StatusRelationships, key, {'user_timelines' => {@uuids[1] => 'v1'}})
232
+ @twitter.remove(:StatusRelationships, key)
233
+ assert_equal({}, @twitter.get(:StatusRelationships, key))
234
+ end
235
+
236
+ def test_remove_super_sub_key
237
+ @twitter.insert(:StatusRelationships, key, {'user_timelines' => {@uuids[1] => 'v1'}})
238
+ @twitter.remove(:StatusRelationships, key, 'user_timelines')
239
+ assert_equal({}, @twitter.get(:StatusRelationships, key, 'user_timelines'))
240
+ end
241
+
242
+ def test_remove_super_value
243
+ columns = {@uuids[1] => 'v1'}
244
+ @twitter.insert(:StatusRelationships, key, {'user_timelines' => columns})
245
+ @twitter.remove(:StatusRelationships, key, 'user_timelines', columns.keys.first)
246
+ assert_nil @twitter.get(:StatusRelationships, key, 'user_timelines', columns.keys.first)
247
+ assert_nil @twitter.get(:StatusRelationships, key, 'user_timelines').timestamps[columns.keys.first]
248
+ end
249
+
250
+ def test_clear_column_family
251
+ @twitter.insert(:Statuses, key + "1", {'body' => '1'})
252
+ @twitter.insert(:Statuses, key + "2", {'body' => '2'})
253
+ @twitter.insert(:Statuses, key + "3", {'body' => '3'})
254
+ @twitter.clear_column_family!(:Statuses)
255
+ assert_equal 0, @twitter.count_range(:Statuses)
256
+ end
257
+
258
+ def test_insert_key
259
+ @twitter.insert(:Statuses, key, {'body' => 'v', 'user' => 'v'})
260
+ assert_equal({'body' => 'v', 'user' => 'v'}, @twitter.get(:Statuses, key))
261
+ assert_equal(['body', 'user'], @twitter.get(:Statuses, key).timestamps.keys)
262
+ end
263
+
264
+ def test_insert_super_key
265
+ columns = {@uuids[1] => 'v1', @uuids[2] => 'v2'}
266
+ @twitter.insert(:StatusRelationships, key, {'user_timelines' => columns})
267
+ assert_equal(columns, @twitter.get(:StatusRelationships, key, 'user_timelines'))
268
+ assert_equal(columns.keys.sort, @twitter.get(:StatusRelationships, key, 'user_timelines').timestamps.keys.sort)
269
+ end
270
+
271
+ def test_get_columns
272
+ @twitter.insert(:Statuses, key, {'body' => 'v1', 'user' => 'v2'})
273
+ assert_equal(['v1' , 'v2'], @twitter.get_columns(:Statuses, key, ['body', 'user']))
274
+ end
275
+
276
+ def test_get_column_values_super
277
+ user_columns, mentions_columns = {@uuids[1] => 'v1'}, {@uuids[2] => 'v2'}
278
+ @twitter.insert(:StatusRelationships, key,
279
+ {'user_timelines' => user_columns, 'mentions_timelines' => mentions_columns})
280
+ assert_equal [user_columns, mentions_columns],
281
+ @twitter.get_columns(:StatusRelationships, key, ['user_timelines', 'mentions_timelines'])
282
+ end
283
+
284
+ def test_get_sub_column_values_super
285
+ user_columns = {@uuids[1] => 'v1', @uuids[2] => 'v2'}
286
+ @twitter.insert(:StatusRelationships, key, {'user_timelines' => user_columns})
287
+ assert_equal ['v1', 'v2'],
288
+ @twitter.get_columns(:StatusRelationships, key, 'user_timelines', @uuids[1..2])
289
+ end
290
+
291
+ def test_multi_get_columns
292
+ @twitter.insert(:Users, key + '1', {'body' => 'v1', 'user' => 'v1'})
293
+ @twitter.insert(:Users, key + '2', {'body' => 'v2', 'user' => 'v2'})
294
+ assert_equal(
295
+ OrderedHash[key + '1', ['v1', 'v1'], key + '2', ['v2', 'v2'], 'bogus', [nil, nil]],
296
+ @twitter.multi_get_columns(:Users, [key + '1', key + '2', 'bogus'], ['body', 'user']))
297
+ assert_equal(
298
+ OrderedHash[key + '2', ['v2', 'v2'], 'bogus', [nil, nil], key + '1', ['v1', 'v1']],
299
+ @twitter.multi_get_columns(:Users, [key + '2', 'bogus', key + '1'], ['body', 'user']))
300
+ assert_equal(
301
+ OrderedHash[key + '1', ['v1', 'v1'], key + '2', ['v2', 'v2'], 'bogus', [nil, nil]].keys.sort,
302
+ @twitter.multi_get_columns(:Users, [key + '1', key + '2', 'bogus'], ['body', 'user']).timestamps.keys.sort)
303
+ assert_equal(
304
+ OrderedHash[key + '2', ['v2', 'v2'], 'bogus', [nil, nil], key + '1', ['v1', 'v1']].keys.sort,
305
+ @twitter.multi_get_columns(:Users, [key + '2', 'bogus', key + '1'], ['body', 'user']).timestamps.keys.sort)
306
+ end
307
+
308
+ def test_count_keys
309
+ @twitter.insert(:Statuses, key + "1", {'body' => '1'})
310
+ @twitter.insert(:Statuses, key + "2", {'body' => '2'})
311
+ @twitter.insert(:Statuses, key + "3", {'body' => '3'})
312
+ assert_equal 3, @twitter.count_range(:Statuses)
313
+ end
314
+
315
+ def test_count_columns
316
+ @twitter.insert(:Statuses, key, {'body' => 'v1', 'user' => 'v2'})
317
+ assert_equal 2, @twitter.count_columns(:Statuses, key)
318
+ end
319
+
320
+ def test_count_super_columns
321
+ @twitter.insert(:StatusRelationships, key, {
322
+ 'user_timelines' => {@uuids[1] => 'v1'},
323
+ 'mentions_timelines' => {@uuids[2] => 'v2'}})
324
+ assert_equal 2, @twitter.count_columns(:StatusRelationships, key)
325
+ end
326
+
327
+ def test_count_super_sub_columns
328
+ @twitter.insert(:StatusRelationships, key, {'user_timelines' => {@uuids[1] => 'v1', @uuids[2] => 'v2'}})
329
+ assert_equal 2, @twitter.count_columns(:StatusRelationships, key, 'user_timelines')
330
+ end
331
+
332
+ def test_multi_count_columns
333
+ @twitter.insert(:Users, key + '1', {'body' => 'v1', 'user' => 'v1'})
334
+ @twitter.insert(:Users, key + '2', {'body' => 'v2', 'user' => 'v2'})
335
+ assert_equal(
336
+ OrderedHash[key + '1', 2, key + '2', 2, 'bogus', 0],
337
+ @twitter.multi_count_columns(:Users, [key + '1', key + '2', 'bogus']))
338
+ assert_equal(
339
+ OrderedHash[key + '2', 2, 'bogus', 0, key + '1', 2],
340
+ @twitter.multi_count_columns(:Users, [key + '2', 'bogus', key + '1']))
341
+ end
342
+
343
+ def test_batch_mutate
344
+ k = key
345
+
346
+ @twitter.insert(:Users, k + '1', {'body' => 'v1', 'user' => 'v1'})
347
+
348
+ @twitter.batch do
349
+ @twitter.insert(:Users, k + '2', {'body' => 'v2', 'user' => 'v2'})
350
+ @twitter.insert(:Users, k + '3', {'body' => 'bogus', 'user' => 'v3'})
351
+ @twitter.insert(:Users, k + '3', {'body' => 'v3', 'location' => 'v3'})
352
+ @twitter.insert(:Statuses, k + '3', {'body' => 'v'})
353
+
354
+ assert_equal({'body' => 'v1', 'user' => 'v1'}, @twitter.get(:Users, k + '1')) # Written
355
+ assert_equal({}, @twitter.get(:Users, k + '2')) # Not yet written
356
+ assert_equal({}, @twitter.get(:Statuses, k + '3')) # Not yet written
357
+
358
+ @twitter.remove(:Users, k + '1')
359
+ assert_equal({'body' => 'v1', 'user' => 'v1'}, @twitter.get(:Users, k + '1')) # Not yet removed
360
+
361
+ @twitter.remove(:Users, k + '4')
362
+ @twitter.insert(:Users, k + '4', {'body' => 'v4', 'user' => 'v4'})
363
+ assert_equal({}, @twitter.get(:Users, k + '4')) # Not yet written
364
+ end
365
+
366
+ assert_equal({'body' => 'v2', 'user' => 'v2'}, @twitter.get(:Users, k + '2')) # Written
367
+ assert_equal({'body' => 'v3', 'user' => 'v3', 'location' => 'v3'}, @twitter.get(:Users, k + '3')) # Written and compacted
368
+ assert_equal({'body' => 'v4', 'user' => 'v4'}, @twitter.get(:Users, k + '4')) # Written
369
+ assert_equal({'body' => 'v'}, @twitter.get(:Statuses, k + '3')) # Written
370
+ assert_equal({}, @twitter.get(:Users, k + '1')) # Removed
371
+
372
+ assert_equal({'body' => 'v2', 'user' => 'v2'}.keys.sort, @twitter.get(:Users, k + '2').timestamps.keys.sort) # Written
373
+ assert_equal({'body' => 'v3', 'user' => 'v3', 'location' => 'v3'}.keys.sort, @twitter.get(:Users, k + '3').timestamps.keys.sort) # Written and compacted
374
+ assert_equal({'body' => 'v4', 'user' => 'v4'}.keys.sort, @twitter.get(:Users, k + '4').timestamps.keys.sort) # Written
375
+ assert_equal({'body' => 'v'}.keys.sort, @twitter.get(:Statuses, k + '3').timestamps.keys.sort) # Written
376
+ end
377
+
378
+ def test_complain_about_nil_key
379
+ assert_raises(ArgumentError) do
380
+ @twitter.insert(:Statuses, nil, {'text' => 'crap'})
381
+ end
382
+ end
383
+
384
+ def test_raise_access_error_on_nonexistent_keyspace
385
+ nonexistent = Cassandra.new('Nonexistent')
386
+ assert_raises(Cassandra::AccessError) do
387
+ nonexistent.get "foo", "bar"
388
+ end
389
+ end
390
+
391
+ def test_nil_sub_column_value
392
+ @twitter.insert(:Index, 'asdf', {"thing" => {'jkl' => ''} })
393
+ end
394
+
395
+ def test_disconnect!
396
+ @twitter.disconnect!
397
+ assert_nil @twitter.instance_variable_get(:@client)
398
+ end
399
+
400
+ def test_super_allows_for_non_string_values_while_normal_does_not
401
+ columns = {'user_timelines' => {@uuids[4] => '4', @uuids[5] => '5'}}
402
+
403
+ @twitter.insert(:StatusRelationships, key, columns)
404
+ @twitter.insert(:Statuses, key, { 'body' => '1' })
405
+ end
406
+
407
+ private
408
+
409
+ def key
410
+ caller.first[/`(.*?)'/, 1]
411
+ end
412
+ end
@@ -0,0 +1,45 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+
3
+ class ComparableTypesTest < Test::Unit::TestCase
4
+ include Cassandra::Constants
5
+
6
+ def test_long_sort
7
+ ary = []
8
+ 10.times { ary << Long.new }
9
+ assert_equal ary.sort, ary
10
+ end
11
+
12
+ def test_long_equality
13
+ long = Long.new
14
+ assert_equal long, Long.new(long)
15
+ assert_equal long, Long.new(long.to_s)
16
+ assert_equal long, Long.new(long.to_i)
17
+ assert_equal long, Long.new(long.to_guid)
18
+ end
19
+
20
+ def test_long_error
21
+ assert_raises(Cassandra::Comparable::TypeError) do
22
+ Long.new("bogus")
23
+ end
24
+ end
25
+
26
+ def test_types_behave_well
27
+ assert !(Long.new() == false)
28
+ end
29
+
30
+ def test_casting_unknown_class
31
+ assert_raises(Cassandra::Comparable::TypeError) do
32
+ Cassandra::Long.new({})
33
+ end
34
+ end
35
+
36
+ def test_long_inspect
37
+ obj = Long.new("\000\000\000\000\000\000\000\000")
38
+ if RUBY_VERSION < '1.9'
39
+ assert_equal "<Cassandra::Long##{obj.object_id} time: Thu Jan 01 00:00:00 UTC 1970, usecs: 0, jitter: 0, guid: 00000000-0000-0000>", obj.inspect
40
+ else
41
+ assert_equal "<Cassandra::Long##{obj.object_id} time: 1970-01-01 00:00:00 UTC, usecs: 0, jitter: 0, guid: 00000000-0000-0000>", obj.inspect
42
+ end
43
+ end
44
+
45
+ end
@@ -0,0 +1,42 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
+
3
+ if RUBY_VERSION < '1.9'
4
+ puts "Skipping EventMachine test"
5
+ else
6
+
7
+ require 'thrift_client/event_machine'
8
+
9
+ class EventmachineTest < Test::Unit::TestCase
10
+
11
+ def test_twitter
12
+ @twitter = Cassandra.new('Twitter', "127.0.0.1:9160", :retries => 2, :exception_classes => [], :transport => Thrift::EventMachineTransport, :transport_wrapper => nil)
13
+ @twitter.clear_keyspace!
14
+ end
15
+
16
+ private
17
+
18
+ def em_test(name)
19
+ EM.run do
20
+ Fiber.new do
21
+ begin
22
+ send("raw_#{name}".to_sym)
23
+ ensure
24
+ EM.stop
25
+ end
26
+ end.resume
27
+ end
28
+ end
29
+
30
+ def self.wrap_tests
31
+ self.public_instance_methods.select { |m| m =~ /^test_/ }.each do |meth|
32
+ alias_method :"raw_#{meth}", meth
33
+ define_method(meth) do
34
+ em_test(meth)
35
+ end
36
+ end
37
+ end
38
+
39
+ wrap_tests
40
+
41
+ end
42
+ end