sedna 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +18 -0
- data/README +35 -13
- data/Rakefile +3 -3
- data/ext/extconf.rb +4 -9
- data/ext/sedna.c +429 -118
- data/test/sedna_test.rb +447 -317
- metadata +2 -2
data/test/sedna_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
|
-
# Copyright 2008 Voormedia B.V.
|
4
|
+
# Copyright 2008, 2009 Voormedia B.V.
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
7
|
# you may not use this file except in compliance with the License.
|
@@ -30,53 +30,42 @@ require 'socket'
|
|
30
30
|
class SednaTest < Test::Unit::TestCase
|
31
31
|
# Support declarative specification of test methods.
|
32
32
|
def self.test name, &block
|
33
|
-
|
34
|
-
defined = instance_method(test_name) rescue false
|
35
|
-
raise "#{test_name} is already defined in #{self}" if defined
|
36
|
-
if block_given?
|
37
|
-
define_method test_name, &block
|
38
|
-
else
|
39
|
-
define_method test_name do
|
40
|
-
flunk "No implementation provided for #{test_name}"
|
41
|
-
end
|
42
|
-
end
|
33
|
+
define_method "test_#{name.gsub(/\s+/,'_')}".to_sym, &block
|
43
34
|
end
|
44
35
|
|
36
|
+
# Backward compatibility if __method__ is not available.
|
45
37
|
alias :__method__ :method_name if method_defined? :method_name
|
46
38
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
39
|
+
@@spec = {
|
40
|
+
:database => "test",
|
41
|
+
:host => "localhost",
|
42
|
+
:username => "SYSTEM",
|
43
|
+
:password => "MANAGER",
|
44
|
+
}
|
45
|
+
|
46
|
+
# Test the remote socket before continuing.
|
47
|
+
port = 5050
|
48
|
+
begin
|
49
|
+
socket = TCPSocket.new @@spec[:host], port
|
50
|
+
rescue Errno::ECONNREFUSED, SocketError
|
51
|
+
# No DB appears to be running; fail fatally. Do not run the other tests and just exit.
|
52
|
+
puts "\nConnection to port #{port} on #{@@spec[:host]} could not be established.\nCheck if the Sedna XML database is running before running this test suite.\n\n"
|
53
|
+
exit 1
|
54
|
+
end
|
55
|
+
socket.close
|
56
|
+
|
57
|
+
# Create re-usable connection. Word of warning: because we re-use the connection,
|
58
|
+
# if one particular test screws it up, subsequent tests may fail.
|
59
|
+
@@sedna = Sedna.connect @@spec
|
56
60
|
|
57
|
-
# Faux test that just checks if we can connect, otherwise the test
|
58
|
-
# suite is aborted.
|
59
|
-
test "aaa connection" do
|
60
|
-
port = 5050
|
61
|
-
begin
|
62
|
-
s = TCPSocket.new @connection[:host], port
|
63
|
-
rescue Errno::ECONNREFUSED, SocketError
|
64
|
-
# No DB appears to be running; fail fatally. Do not run the other tests and just exit.
|
65
|
-
puts "Connection to port #{port} on #{@connection[:host]} could not be established. Check if the Sedna XML database is running before running this test suite."
|
66
|
-
exit 1
|
67
|
-
end
|
68
|
-
assert s
|
69
|
-
s.close
|
70
|
-
end
|
71
|
-
|
72
61
|
# Test Sedna.version.
|
73
|
-
test "version should return 3
|
62
|
+
test "version should return 3.0" do
|
74
63
|
assert_equal "3.0", Sedna.version
|
75
64
|
end
|
76
65
|
|
77
66
|
# Test Sedna.blocking?
|
78
67
|
test "blocking should return true if ruby 18 and false if ruby 19" do
|
79
|
-
if RUBY_VERSION < "1.9"
|
68
|
+
if RUBY_VERSION < "1.9.1"
|
80
69
|
assert Sedna.blocking?
|
81
70
|
else
|
82
71
|
assert !Sedna.blocking?
|
@@ -85,7 +74,7 @@ class SednaTest < Test::Unit::TestCase
|
|
85
74
|
|
86
75
|
# Test Sedna.connect.
|
87
76
|
test "connect should return Sedna object" do
|
88
|
-
sedna = Sedna.connect
|
77
|
+
sedna = Sedna.connect @@spec
|
89
78
|
assert_kind_of Sedna, sedna
|
90
79
|
sedna.close
|
91
80
|
end
|
@@ -98,32 +87,40 @@ class SednaTest < Test::Unit::TestCase
|
|
98
87
|
|
99
88
|
test "connect should raise exception when host not found" do
|
100
89
|
assert_raises Sedna::ConnectionError do
|
101
|
-
Sedna.connect
|
90
|
+
Sedna.connect @@spec.merge(:host => "non-existent-host")
|
102
91
|
end
|
103
92
|
end
|
104
93
|
|
105
94
|
test "connect should raise exception when credentials are incorrect" do
|
106
95
|
assert_raises Sedna::AuthenticationError do
|
107
|
-
Sedna.connect
|
96
|
+
Sedna.connect @@spec.merge(:username => "non-existent-user")
|
108
97
|
end
|
109
98
|
end
|
110
99
|
|
111
100
|
test "connect should return nil on error" do
|
112
101
|
begin
|
113
|
-
sedna = Sedna.connect
|
102
|
+
sedna = Sedna.connect @@spec.merge(:username => "non-existent-user")
|
114
103
|
rescue
|
115
104
|
end
|
116
105
|
assert_nil sedna
|
117
106
|
end
|
118
107
|
|
108
|
+
test "connect should not execute block if connection fails" do
|
109
|
+
assert_nothing_raised do
|
110
|
+
sedna = Sedna.connect @@spec.merge(:username => "non-existent-user") do
|
111
|
+
raise "block should not be run"
|
112
|
+
end rescue nil
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
119
116
|
test "connect should return nil if block given" do
|
120
|
-
sedna = Sedna.connect
|
117
|
+
sedna = Sedna.connect @@spec do |s| end
|
121
118
|
assert_nil sedna
|
122
119
|
end
|
123
120
|
|
124
121
|
test "connect should close connection after block" do
|
125
122
|
sedna = nil
|
126
|
-
Sedna.connect
|
123
|
+
Sedna.connect @@spec do |s|
|
127
124
|
sedna = s
|
128
125
|
end
|
129
126
|
assert_raises Sedna::ConnectionError do
|
@@ -134,7 +131,7 @@ class SednaTest < Test::Unit::TestCase
|
|
134
131
|
test "connect should close connection if exception is raised inside block" do
|
135
132
|
sedna = nil
|
136
133
|
begin
|
137
|
-
Sedna.connect
|
134
|
+
Sedna.connect @@spec do |s|
|
138
135
|
sedna = s
|
139
136
|
raise Exception
|
140
137
|
end
|
@@ -148,7 +145,7 @@ class SednaTest < Test::Unit::TestCase
|
|
148
145
|
test "connect should close connection if something is thrown inside block" do
|
149
146
|
sedna = nil
|
150
147
|
catch :ball do
|
151
|
-
Sedna.connect
|
148
|
+
Sedna.connect @@spec do |s|
|
152
149
|
sedna = s
|
153
150
|
throw :ball
|
154
151
|
end
|
@@ -160,69 +157,142 @@ class SednaTest < Test::Unit::TestCase
|
|
160
157
|
|
161
158
|
test "connect should re-raise exceptions from inside block" do
|
162
159
|
assert_raises Exception do
|
163
|
-
Sedna.connect
|
160
|
+
Sedna.connect @@spec do
|
164
161
|
raise Exception
|
165
162
|
end
|
166
163
|
end
|
167
164
|
end
|
168
165
|
|
166
|
+
test "connect should set instance variables for keys in connection specification" do
|
167
|
+
assert_equal @@spec.values, @@spec.keys.collect { |k| @@sedna.instance_variable_get "@#{k.to_s}".to_sym }
|
168
|
+
end
|
169
|
+
|
169
170
|
# Test sedna.close.
|
170
171
|
test "close should return nil" do
|
171
|
-
sedna = Sedna.connect
|
172
|
+
sedna = Sedna.connect @@spec
|
172
173
|
assert_nil sedna.close
|
173
174
|
end
|
174
175
|
|
175
176
|
test "close should fail silently if connection is already closed" do
|
176
|
-
sedna = Sedna.connect
|
177
|
+
sedna = Sedna.connect @@spec
|
177
178
|
assert_nothing_raised do
|
178
179
|
sedna.close
|
179
180
|
sedna.close
|
180
181
|
end
|
181
182
|
end
|
182
183
|
|
183
|
-
# Test sedna.
|
184
|
-
test "
|
185
|
-
|
186
|
-
|
187
|
-
|
184
|
+
# Test sedna.connected?.
|
185
|
+
test "connected? should return true if connected" do
|
186
|
+
assert_equal true, @@sedna.connected?
|
187
|
+
end
|
188
|
+
|
189
|
+
test "connected? should return false if closed" do
|
190
|
+
sedna = Sedna.connect @@spec
|
191
|
+
sedna.close
|
192
|
+
assert_equal false, sedna.connected?
|
193
|
+
end
|
194
|
+
|
195
|
+
# Test sedna.reset.
|
196
|
+
test "reset should return nil" do
|
197
|
+
assert_nil @@sedna.reset
|
198
|
+
end
|
199
|
+
|
200
|
+
test "reset should break current transaction" do
|
201
|
+
assert_raises Sedna::TransactionError do
|
202
|
+
@@sedna.transaction do
|
203
|
+
@@sedna.reset
|
188
204
|
end
|
189
205
|
end
|
190
206
|
end
|
191
207
|
|
192
|
-
test "
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
sedna.execute
|
208
|
+
test "reset should implicitly roll back current transaction" do
|
209
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
210
|
+
@@sedna.execute "create document '#{__method__}'"
|
211
|
+
@@sedna.transaction do
|
212
|
+
@@sedna.execute "update insert <test>test</test> into doc('#{__method__}')"
|
213
|
+
@@sedna.reset
|
214
|
+
end rescue nil
|
215
|
+
assert_equal 0, @@sedna.execute("count(doc('#{__method__}')/test)").first.to_i
|
216
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
217
|
+
end
|
218
|
+
|
219
|
+
test "reset should close and reconnect if the connection is open" do
|
220
|
+
@@sedna.reset
|
221
|
+
assert_nothing_raised do
|
222
|
+
@@sedna.execute "<test/>"
|
197
223
|
end
|
198
224
|
end
|
199
225
|
|
200
|
-
test "
|
201
|
-
|
202
|
-
|
226
|
+
test "reset should reconnect if the connection is closed" do
|
227
|
+
@@sedna.close
|
228
|
+
@@sedna.reset
|
229
|
+
assert_nothing_raised do
|
230
|
+
@@sedna.execute "<test/>"
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
test "reset should raise exception when host not found" do
|
235
|
+
sedna = Sedna.connect @@spec
|
236
|
+
sedna.instance_variable_set :@host, "non-existent-host"
|
237
|
+
assert_raises Sedna::ConnectionError do
|
238
|
+
sedna.reset
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
test "reset should raise exception when credentials are incorrect" do
|
243
|
+
sedna = Sedna.connect @@spec
|
244
|
+
sedna.instance_variable_set :@username, "non-existent-user"
|
245
|
+
assert_raises Sedna::AuthenticationError do
|
246
|
+
sedna.reset
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
test "reset should preserve disabled autocommit status" do
|
251
|
+
Sedna.connect @@spec do |sedna|
|
252
|
+
sedna.autocommit = false
|
253
|
+
sedna.reset
|
254
|
+
assert_raises Sedna::Exception do
|
255
|
+
sedna.execute "<test/>"
|
256
|
+
end
|
203
257
|
end
|
204
258
|
end
|
205
259
|
|
206
|
-
|
207
|
-
|
208
|
-
|
260
|
+
# Test sedna.execute / sedna.query.
|
261
|
+
test "execute should raise TypeError if argument cannot be converted to String" do
|
262
|
+
assert_raises TypeError do
|
263
|
+
@@sedna.execute Object.new
|
209
264
|
end
|
210
265
|
end
|
211
266
|
|
267
|
+
test "execute should return nil for data structure query" do
|
268
|
+
@@sedna.execute("drop document '#{__method__}'") rescue nil
|
269
|
+
assert_nil @@sedna.execute("create document '#{__method__}'")
|
270
|
+
@@sedna.execute("drop document '#{__method__}'") rescue nil
|
271
|
+
end
|
272
|
+
|
273
|
+
test "execute should return subclass of array for select query" do
|
274
|
+
assert_kind_of Array, @@sedna.execute("<test/>")
|
275
|
+
end
|
276
|
+
|
277
|
+
test "execute should return array with single string for single select query" do
|
278
|
+
assert_equal ["<test/>"], @@sedna.execute("<test/>")
|
279
|
+
end
|
280
|
+
|
212
281
|
test "execute should return array with strings for select query" do
|
213
|
-
|
214
|
-
assert_equal ["<test/>", "<test/>", "<test/>"], sedna.execute("<test/>, <test/>, <test/>")
|
215
|
-
end
|
282
|
+
assert_equal ["<test/>", "<test/>", "<test/>"], @@sedna.execute("<test/>, <test/>, <test/>")
|
216
283
|
end
|
217
284
|
|
218
285
|
test "execute should return tainted strings" do
|
219
|
-
|
220
|
-
|
221
|
-
|
286
|
+
assert @@sedna.execute("<test/>").first.tainted?
|
287
|
+
end
|
288
|
+
|
289
|
+
test "execute should return utf-8 strings" do
|
290
|
+
str = "<utf8> Ѩ 乗 </utf8>"
|
291
|
+
assert_equal [str], @@sedna.execute(str)
|
222
292
|
end
|
223
293
|
|
224
294
|
test "execute should fail if autocommit is false" do
|
225
|
-
Sedna.connect
|
295
|
+
Sedna.connect @@spec do |sedna|
|
226
296
|
sedna.autocommit = false
|
227
297
|
assert_raises Sedna::Exception do
|
228
298
|
sedna.execute "<test/>"
|
@@ -231,15 +301,13 @@ class SednaTest < Test::Unit::TestCase
|
|
231
301
|
end
|
232
302
|
|
233
303
|
test "execute should fail with Sedna::Exception for invalid statements" do
|
234
|
-
Sedna
|
235
|
-
|
236
|
-
sedna.execute "INVALID"
|
237
|
-
end
|
304
|
+
assert_raises Sedna::Exception do
|
305
|
+
@@sedna.execute "INVALID"
|
238
306
|
end
|
239
307
|
end
|
240
308
|
|
241
309
|
test "execute should fail with Sedna::ConnectionError if connection is closed" do
|
242
|
-
Sedna.connect
|
310
|
+
Sedna.connect @@spec do |sedna|
|
243
311
|
sedna.close
|
244
312
|
assert_raises Sedna::ConnectionError do
|
245
313
|
sedna.execute "<test/>"
|
@@ -248,165 +316,107 @@ class SednaTest < Test::Unit::TestCase
|
|
248
316
|
end
|
249
317
|
|
250
318
|
test "execute should strip first newline of all but first results" do
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
sedna.execute("drop document '#{__method__}'") rescue Sedna::Exception
|
257
|
-
end
|
319
|
+
@@sedna.execute("drop document '#{__method__}'") rescue nil
|
320
|
+
@@sedna.execute("create document '#{__method__}'")
|
321
|
+
@@sedna.execute("update insert <test><a>\n\nt</a><a>\n\nt</a><a>\n\nt</a></test> into doc('#{__method__}')")
|
322
|
+
assert_equal ["\n\nt", "\n\nt", "\n\nt"], @@sedna.execute("doc('#{__method__}')/test/a/text()")
|
323
|
+
@@sedna.execute("drop document '#{__method__}'") rescue nil
|
258
324
|
end
|
259
325
|
|
260
|
-
test "execute should
|
261
|
-
|
262
|
-
i = 10000 # Times to loop in query. Increase for more accuracy.
|
326
|
+
test "execute should be run serially if called from different threads on same connection" do
|
327
|
+
i = 1000
|
263
328
|
threads = []
|
264
|
-
|
265
|
-
|
266
|
-
|
329
|
+
exceptions = []
|
330
|
+
Thread.abort_on_exception = true
|
331
|
+
5.times do
|
267
332
|
threads << Thread.new do
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
333
|
+
begin
|
334
|
+
@@sedna.execute "for $x in #{i} where $x = 1 return <node/>"
|
335
|
+
rescue StandardError => e
|
336
|
+
exceptions << e
|
272
337
|
end
|
273
338
|
end
|
274
339
|
end
|
275
340
|
threads.each do |thread| thread.join end
|
276
|
-
|
277
|
-
# method blocks, there should be hardly any overlap.
|
278
|
-
time_diff = 0
|
279
|
-
(n - 1).times do |number|
|
280
|
-
time_diff += start_times[number + 1] - end_times[number]
|
281
|
-
end
|
282
|
-
if RUBY_VERSION < "1.9"
|
283
|
-
# Blocking behaviour. The start/end times of two threads should not overlap.
|
284
|
-
assert time_diff > 0
|
285
|
-
else
|
286
|
-
# We have concurrency, the execute method in the threads should have been
|
287
|
-
# run in parallel and there should be considerable overlap in the start/end
|
288
|
-
# times of the executed threads.
|
289
|
-
assert time_diff < 0
|
290
|
-
end
|
291
|
-
end
|
292
|
-
|
293
|
-
test "execute should be run in serially if called from different threads on same connection" do
|
294
|
-
Sedna.connect @connection do |sedna|
|
295
|
-
i = 1000
|
296
|
-
threads = []
|
297
|
-
exceptions = []
|
298
|
-
Thread.abort_on_exception = true
|
299
|
-
5.times do
|
300
|
-
threads << Thread.new do
|
301
|
-
begin
|
302
|
-
sedna.execute "for $x in #{i} where $x = 1 return <node/>"
|
303
|
-
rescue StandardError => e
|
304
|
-
exceptions << e
|
305
|
-
end
|
306
|
-
end
|
307
|
-
end
|
308
|
-
threads.each do |thread| thread.join end
|
309
|
-
assert_equal [], exceptions
|
310
|
-
end
|
341
|
+
assert_equal [], exceptions
|
311
342
|
end
|
312
343
|
|
313
344
|
test "execute should quit if exception is raised in it by another thread in ruby 19" do
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
sedna.execute "create document '#{__method__}'"
|
319
|
-
end
|
320
|
-
thread.raise
|
321
|
-
thread.join
|
322
|
-
rescue
|
323
|
-
end
|
324
|
-
count = sedna.execute("count(doc('$documents')//*[@name='#{__method__}'])").first.to_i
|
325
|
-
if RUBY_VERSION < "1.9"
|
326
|
-
assert_equal 1, count
|
327
|
-
else
|
328
|
-
assert_equal 0, count
|
345
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
346
|
+
begin
|
347
|
+
thread = Thread.new do
|
348
|
+
@@sedna.execute "create document '#{__method__}'"
|
329
349
|
end
|
350
|
+
thread.raise
|
351
|
+
thread.join
|
352
|
+
rescue
|
353
|
+
end
|
354
|
+
count = @@sedna.execute("count(doc('$documents')//*[@name='#{__method__}'])").first.to_i
|
355
|
+
if RUBY_VERSION < "1.9"
|
356
|
+
assert_equal 1, count
|
357
|
+
else
|
358
|
+
assert_equal 0, count
|
330
359
|
end
|
331
360
|
end
|
332
361
|
|
333
362
|
test "query should be alias of execute" do
|
334
|
-
|
335
|
-
assert_equal ["<test/>"], sedna.query("<test/>")
|
336
|
-
end
|
363
|
+
assert_equal ["<test/>"], @@sedna.query("<test/>")
|
337
364
|
end
|
338
365
|
|
339
366
|
# Test sedna.load_document.
|
340
367
|
test "load_document should raise TypeError if document argument cannot be converted to String" do
|
341
|
-
|
342
|
-
|
343
|
-
sedna.load_document Object.new, __method__.to_s
|
344
|
-
end
|
368
|
+
assert_raises TypeError do
|
369
|
+
@@sedna.load_document Object.new, __method__.to_s
|
345
370
|
end
|
346
371
|
end
|
347
372
|
|
348
373
|
test "load_document should raise TypeError if doc_name argument cannot be converted to String" do
|
349
|
-
|
350
|
-
|
351
|
-
sedna.load_document "<doc/>", Object.new
|
352
|
-
end
|
374
|
+
assert_raises TypeError do
|
375
|
+
@@sedna.load_document "<doc/>", Object.new
|
353
376
|
end
|
354
377
|
end
|
355
378
|
|
356
379
|
test "load_document should raise TypeError if col_name argument cannot be converted to String" do
|
357
|
-
|
358
|
-
|
359
|
-
sedna.load_document "<doc/>", __method__.to_s, Object.new
|
360
|
-
end
|
380
|
+
assert_raises TypeError do
|
381
|
+
@@sedna.load_document "<doc/>", __method__.to_s, Object.new
|
361
382
|
end
|
362
383
|
end
|
363
384
|
|
364
385
|
test "load_document should create document in given collection" do
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
sedna.execute "drop document '#{__method__}' in collection '#{col}'" rescue Sedna::Exception
|
374
|
-
sedna.execute "drop collection '#{col}'" rescue Sedna::Exception
|
375
|
-
end
|
386
|
+
col = "test_collection"
|
387
|
+
doc = "<?xml version=\"1.0\" standalone=\"yes\"?><document>\n <node/>\n</document>"
|
388
|
+
@@sedna.execute "create collection '#{col}'" rescue nil
|
389
|
+
@@sedna.execute "drop document '#{__method__}' in collection '#{col}'" rescue nil
|
390
|
+
@@sedna.load_document doc, __method__.to_s, col
|
391
|
+
assert_equal doc, @@sedna.execute("doc('#{__method__}', '#{col}')").first
|
392
|
+
@@sedna.execute "drop document '#{__method__}' in collection '#{col}'" rescue nil
|
393
|
+
@@sedna.execute "drop collection '#{col}'" rescue nil
|
376
394
|
end
|
377
395
|
|
378
396
|
test "load_document should create standalone document if collection is unspecified" do
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
assert_equal doc, sedna.execute("doc('#{__method__}')").first
|
385
|
-
sedna.execute "drop document '#{__method__}'" rescue Sedna::Exception
|
386
|
-
end
|
397
|
+
doc = "<?xml version=\"1.0\" standalone=\"yes\"?><document>\n <node/>\n</document>"
|
398
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
399
|
+
@@sedna.load_document doc, __method__.to_s
|
400
|
+
assert_equal doc, @@sedna.execute("doc('#{__method__}')").first
|
401
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
387
402
|
end
|
388
403
|
|
389
404
|
test "load_document should create standalone document if collection is nil" do
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
assert_equal doc, sedna.execute("doc('#{__method__}')").first
|
396
|
-
sedna.execute "drop document '#{__method__}'" rescue Sedna::Exception
|
397
|
-
end
|
405
|
+
doc = "<?xml version=\"1.0\" standalone=\"yes\"?><document>\n <node/>\n</document>"
|
406
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
407
|
+
@@sedna.load_document doc, __method__.to_s, nil
|
408
|
+
assert_equal doc, @@sedna.execute("doc('#{__method__}')").first
|
409
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
398
410
|
end
|
399
411
|
|
400
412
|
test "load_document should return nil if standalone document loaded successfully" do
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
sedna.execute "drop document '#{__method__}'" rescue Sedna::Exception
|
405
|
-
end
|
413
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
414
|
+
assert_nil @@sedna.load_document("<document><node/></document>", __method__.to_s)
|
415
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
406
416
|
end
|
407
417
|
|
408
418
|
test "load_document should fail if autocommit is false" do
|
409
|
-
Sedna.connect
|
419
|
+
Sedna.connect @@spec do |sedna|
|
410
420
|
sedna.autocommit = false
|
411
421
|
assert_raises Sedna::Exception do
|
412
422
|
sedna.load_document "<test/>", "some_doc"
|
@@ -415,26 +425,22 @@ class SednaTest < Test::Unit::TestCase
|
|
415
425
|
end
|
416
426
|
|
417
427
|
test "load_document should fail with Sedna::Exception for invalid documents" do
|
418
|
-
Sedna
|
419
|
-
|
420
|
-
sedna.load_document "<doc/> this is an invalid document", "some_doc"
|
421
|
-
end
|
428
|
+
assert_raises Sedna::Exception do
|
429
|
+
@@sedna.load_document "<doc/> this is an invalid document", "some_doc"
|
422
430
|
end
|
423
431
|
end
|
424
432
|
|
425
433
|
test "load_document should raise exception with complete details for invalid documents" do
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
rescue Sedna::Exception => e
|
431
|
-
end
|
432
|
-
assert_match /junk after document element/, e.message
|
434
|
+
e = nil
|
435
|
+
begin
|
436
|
+
@@sedna.load_document "<doc/> junk here", "some_doc"
|
437
|
+
rescue Sedna::Exception => e
|
433
438
|
end
|
439
|
+
assert_match /junk after document element/, e.message
|
434
440
|
end
|
435
441
|
|
436
442
|
test "load_document should fail with Sedna::ConnectionError if connection is closed" do
|
437
|
-
Sedna.connect
|
443
|
+
Sedna.connect @@spec do |sedna|
|
438
444
|
sedna.close
|
439
445
|
assert_raises Sedna::ConnectionError do
|
440
446
|
sedna.load_document "<doc/>", "some_doc"
|
@@ -443,71 +449,63 @@ class SednaTest < Test::Unit::TestCase
|
|
443
449
|
end
|
444
450
|
|
445
451
|
test "load_document should create document if given document is IO object" do
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
p_in.close
|
452
|
+
doc = "<?xml version=\"1.0\" standalone=\"yes\"?><document>" << ("\n <some_very_often_repeated_node/>" * 800) << "\n</document>"
|
453
|
+
p_out, p_in = IO.pipe
|
454
|
+
p_in.write doc
|
455
|
+
p_in.close
|
451
456
|
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
end
|
457
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
458
|
+
@@sedna.load_document p_out, __method__.to_s, nil
|
459
|
+
assert_equal doc.length, @@sedna.execute("doc('#{__method__}')").first.length
|
460
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
457
461
|
end
|
458
462
|
|
459
463
|
test "load_document should raise Sedna::Exception if given document is empty IO object" do
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
rescue Sedna::Exception => e
|
469
|
-
end
|
470
|
-
assert_equal "Document is empty.", e.message
|
471
|
-
sedna.execute "drop document '#{__method__}'" rescue Sedna::Exception
|
464
|
+
p_out, p_in = IO.pipe
|
465
|
+
p_in.close
|
466
|
+
|
467
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
468
|
+
e = nil
|
469
|
+
begin
|
470
|
+
@@sedna.load_document p_out, __method__.to_s, nil
|
471
|
+
rescue Sedna::Exception => e
|
472
472
|
end
|
473
|
+
assert_equal "Document is empty.", e.message
|
474
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
473
475
|
end
|
474
476
|
|
475
477
|
test "load_document should raise Sedna::Exception if given document is empty string" do
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
rescue Sedna::Exception => e
|
482
|
-
end
|
483
|
-
assert_equal "Document is empty.", e.message
|
484
|
-
sedna.execute "drop document '#{__method__}'" rescue Sedna::Exception
|
478
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
479
|
+
e = nil
|
480
|
+
begin
|
481
|
+
@@sedna.load_document "", __method__.to_s, nil
|
482
|
+
rescue Sedna::Exception => e
|
485
483
|
end
|
484
|
+
assert_equal "Document is empty.", e.message
|
485
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
486
486
|
end
|
487
|
-
|
487
|
+
|
488
488
|
# Test sedna.autocommit= / sedna.autocommit.
|
489
489
|
test "autocommit should return true by default" do
|
490
|
-
|
491
|
-
assert_equal true, sedna.autocommit
|
492
|
-
end
|
490
|
+
assert_equal true, @@sedna.autocommit
|
493
491
|
end
|
494
492
|
|
495
493
|
test "autocommit should return true if set to true" do
|
496
|
-
Sedna.connect
|
494
|
+
Sedna.connect @@spec do |sedna|
|
497
495
|
sedna.autocommit = true
|
498
496
|
assert_equal true, sedna.autocommit
|
499
497
|
end
|
500
498
|
end
|
501
499
|
|
502
500
|
test "autocommit should return false if set to false" do
|
503
|
-
Sedna.connect
|
501
|
+
Sedna.connect @@spec do |sedna|
|
504
502
|
sedna.autocommit = false
|
505
503
|
assert_equal false, sedna.autocommit
|
506
504
|
end
|
507
505
|
end
|
508
506
|
|
509
507
|
test "autocommit should return true if set to true after being set to false" do
|
510
|
-
Sedna.connect
|
508
|
+
Sedna.connect @@spec do |sedna|
|
511
509
|
sedna.autocommit = false
|
512
510
|
sedna.autocommit = true
|
513
511
|
assert_equal true, sedna.autocommit
|
@@ -515,21 +513,21 @@ class SednaTest < Test::Unit::TestCase
|
|
515
513
|
end
|
516
514
|
|
517
515
|
test "autocommit should return true if argument evaluates to true" do
|
518
|
-
Sedna.connect
|
516
|
+
Sedna.connect @@spec do |sedna|
|
519
517
|
sedna.autocommit = "string evaluates to true"
|
520
518
|
assert_equal true, sedna.autocommit
|
521
519
|
end
|
522
520
|
end
|
523
521
|
|
524
522
|
test "autocommit should return false if argument evaluates to false" do
|
525
|
-
Sedna.connect
|
523
|
+
Sedna.connect @@spec do |sedna|
|
526
524
|
sedna.autocommit = nil
|
527
525
|
assert_equal false, sedna.autocommit
|
528
526
|
end
|
529
527
|
end
|
530
528
|
|
531
|
-
test "autocommit should be re-enabled after
|
532
|
-
Sedna.connect
|
529
|
+
test "autocommit should be re-enabled after a transaction" do
|
530
|
+
Sedna.connect @@spec do |sedna|
|
533
531
|
sedna.autocommit = true
|
534
532
|
sedna.transaction do end
|
535
533
|
assert_nothing_raised do
|
@@ -538,23 +536,66 @@ class SednaTest < Test::Unit::TestCase
|
|
538
536
|
end
|
539
537
|
end
|
540
538
|
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
539
|
+
test "autocommit should be re-enabled after an explicit commit" do
|
540
|
+
Sedna.connect @@spec do |sedna|
|
541
|
+
sedna.autocommit = true
|
542
|
+
sedna.transaction
|
543
|
+
sedna.commit
|
544
|
+
assert_nothing_raised do
|
545
|
+
sedna.execute "<test/>"
|
546
|
+
end
|
547
|
+
end
|
548
|
+
end
|
549
|
+
|
550
|
+
test "autocommit should be re-enabled after an explicit rollback" do
|
551
|
+
Sedna.connect @@spec do |sedna|
|
552
|
+
sedna.autocommit = true
|
553
|
+
sedna.transaction
|
554
|
+
sedna.rollback
|
555
|
+
assert_nothing_raised do
|
556
|
+
sedna.execute "<test/>"
|
557
|
+
end
|
545
558
|
end
|
546
559
|
end
|
547
560
|
|
548
|
-
test "
|
549
|
-
|
550
|
-
|
551
|
-
|
561
|
+
test "autocommit should be re-enabled after a transaction was rolled back" do
|
562
|
+
Sedna.connect @@spec do |sedna|
|
563
|
+
sedna.autocommit = true
|
564
|
+
catch :rollback do
|
565
|
+
sedna.transaction do
|
566
|
+
throw :rollback
|
567
|
+
end
|
568
|
+
end
|
569
|
+
assert_nothing_raised do
|
570
|
+
sedna.execute "<test/>"
|
552
571
|
end
|
553
572
|
end
|
554
573
|
end
|
555
574
|
|
575
|
+
test "autocommit should be re-enabled after a transaction raised an error" do
|
576
|
+
Sedna.connect @@spec do |sedna|
|
577
|
+
sedna.autocommit = true
|
578
|
+
sedna.transaction do
|
579
|
+
sedna.execute "INVALID" rescue nil
|
580
|
+
end rescue nil
|
581
|
+
assert_nothing_raised do
|
582
|
+
sedna.execute "<test/>"
|
583
|
+
end
|
584
|
+
end
|
585
|
+
end
|
586
|
+
|
587
|
+
# Test sedna.transaction.
|
588
|
+
test "transaction should return nil if called without block" do
|
589
|
+
assert_nil @@sedna.transaction
|
590
|
+
@@sedna.rollback
|
591
|
+
end
|
592
|
+
|
593
|
+
test "transaction should return nil if committed" do
|
594
|
+
assert_nil @@sedna.transaction(){}
|
595
|
+
end
|
596
|
+
|
556
597
|
test "transaction should be possible with autocommit" do
|
557
|
-
Sedna.connect
|
598
|
+
Sedna.connect @@spec do |sedna|
|
558
599
|
sedna.autocommit = true
|
559
600
|
assert_nothing_raised do
|
560
601
|
sedna.transaction do end
|
@@ -563,74 +604,86 @@ class SednaTest < Test::Unit::TestCase
|
|
563
604
|
end
|
564
605
|
|
565
606
|
test "transaction should fail with Sedna::TransactionError if another transaction is started inside it" do
|
566
|
-
Sedna
|
567
|
-
|
568
|
-
sedna.transaction do
|
569
|
-
sedna.transaction do end
|
570
|
-
end
|
607
|
+
assert_raises Sedna::TransactionError do
|
608
|
+
@@sedna.transaction do
|
609
|
+
@@sedna.transaction do end
|
571
610
|
end
|
572
611
|
end
|
573
612
|
end
|
574
613
|
|
614
|
+
test "transaction should fail with Sedna::TransactionError if another transaction is started before it is committed" do
|
615
|
+
@@sedna.transaction
|
616
|
+
assert_raises Sedna::TransactionError do
|
617
|
+
@@sedna.transaction
|
618
|
+
end
|
619
|
+
@@sedna.rollback
|
620
|
+
end
|
621
|
+
|
575
622
|
test "transaction should commit if block given" do
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
sedna.
|
580
|
-
sedna.execute "update insert <test>test</test> into doc('#{__method__}')"
|
581
|
-
end
|
582
|
-
assert_equal 1, sedna.execute("count(doc('#{__method__}')/test)").first.to_i
|
583
|
-
sedna.execute "drop document '#{__method__}'" rescue Sedna::Exception
|
623
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
624
|
+
@@sedna.execute "create document '#{__method__}'"
|
625
|
+
@@sedna.transaction do
|
626
|
+
@@sedna.execute "update insert <test>test</test> into doc('#{__method__}')"
|
584
627
|
end
|
628
|
+
assert_equal 1, @@sedna.execute("count(doc('#{__method__}')/test)").first.to_i
|
629
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
585
630
|
end
|
586
631
|
|
587
632
|
test "transaction should rollback if exception is raised inside block" do
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
sedna.
|
593
|
-
|
594
|
-
raise Exception
|
595
|
-
end
|
596
|
-
rescue Exception
|
633
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
634
|
+
@@sedna.execute "create document '#{__method__}'"
|
635
|
+
begin
|
636
|
+
@@sedna.transaction do
|
637
|
+
@@sedna.execute "update insert <test>test</test> into doc('#{__method__}')"
|
638
|
+
raise Exception
|
597
639
|
end
|
598
|
-
|
599
|
-
sedna.execute "drop document '#{__method__}'" rescue Sedna::Exception
|
640
|
+
rescue Exception
|
600
641
|
end
|
642
|
+
assert_equal 0, @@sedna.execute("count(doc('#{__method__}')/test)").first.to_i
|
643
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
601
644
|
end
|
602
645
|
|
603
646
|
test "transaction should rollback if something is thrown inside block" do
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
sedna.
|
609
|
-
|
610
|
-
throw :ball
|
611
|
-
end
|
647
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
648
|
+
@@sedna.execute "create document '#{__method__}'"
|
649
|
+
catch :ball do
|
650
|
+
@@sedna.transaction do
|
651
|
+
@@sedna.execute "update insert <test>test</test> into doc('#{__method__}')"
|
652
|
+
throw :ball
|
612
653
|
end
|
613
|
-
assert_equal 0, sedna.execute("count(doc('#{__method__}')/test)").first.to_i
|
614
|
-
sedna.execute "drop document '#{__method__}'" rescue Sedna::Exception
|
615
654
|
end
|
655
|
+
assert_equal 0, @@sedna.execute("count(doc('#{__method__}')/test)").first.to_i
|
656
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
616
657
|
end
|
617
658
|
|
618
659
|
test "transaction should raise Sedna::TransactionError if invalid statement caused exception but it was rescued" do
|
619
|
-
Sedna
|
620
|
-
|
621
|
-
sedna.
|
622
|
-
sedna.execute "FAILS" rescue Sedna::Exception
|
623
|
-
end
|
660
|
+
assert_raises Sedna::TransactionError do
|
661
|
+
@@sedna.transaction do
|
662
|
+
@@sedna.execute "FAILS" rescue nil
|
624
663
|
end
|
625
664
|
end
|
626
665
|
end
|
627
|
-
|
666
|
+
|
667
|
+
test "transaction should raise Sedna::TransactionError if it was committed inside the block" do
|
668
|
+
assert_raises Sedna::TransactionError do
|
669
|
+
@@sedna.transaction do
|
670
|
+
@@sedna.commit
|
671
|
+
end
|
672
|
+
end
|
673
|
+
end
|
674
|
+
|
675
|
+
test "transaction should raise Sedna::TransactionError if it was rolled back inside the block" do
|
676
|
+
assert_raises Sedna::TransactionError do
|
677
|
+
@@sedna.transaction do
|
678
|
+
@@sedna.rollback
|
679
|
+
end
|
680
|
+
end
|
681
|
+
end
|
682
|
+
|
628
683
|
test "transaction should re-raise exceptions from inside block" do
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
raise Exception
|
633
|
-
end
|
684
|
+
assert_raises Exception do
|
685
|
+
@@sedna.transaction do
|
686
|
+
raise Exception
|
634
687
|
end
|
635
688
|
end
|
636
689
|
end
|
@@ -638,10 +691,8 @@ class SednaTest < Test::Unit::TestCase
|
|
638
691
|
test "transaction with invalid statements should cause transaction to roll back once" do
|
639
692
|
exc = nil
|
640
693
|
begin
|
641
|
-
|
642
|
-
sedna.
|
643
|
-
sedna.execute "FAILS"
|
644
|
-
end
|
694
|
+
@@sedna.transaction do
|
695
|
+
@@sedna.execute "FAILS"
|
645
696
|
end
|
646
697
|
rescue Sedna::Exception => exc
|
647
698
|
end
|
@@ -649,23 +700,102 @@ class SednaTest < Test::Unit::TestCase
|
|
649
700
|
end
|
650
701
|
|
651
702
|
test "transaction should raise Sedna::TransactionError if called from different threads on same connection" do
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
sleep 0.1
|
661
|
-
end
|
662
|
-
rescue StandardError => e
|
663
|
-
exceptions << e.class
|
703
|
+
threads = []
|
704
|
+
exceptions = []
|
705
|
+
Thread.abort_on_exception = true
|
706
|
+
5.times do
|
707
|
+
threads << Thread.new do
|
708
|
+
begin
|
709
|
+
@@sedna.transaction do
|
710
|
+
sleep 0.1
|
664
711
|
end
|
712
|
+
rescue StandardError => e
|
713
|
+
exceptions << e.class
|
665
714
|
end
|
666
715
|
end
|
667
|
-
threads.each do |thread| thread.join end
|
668
|
-
assert_equal [Sedna::TransactionError] * 4, exceptions
|
669
716
|
end
|
717
|
+
threads.each do |thread| thread.join end
|
718
|
+
assert_equal [Sedna::TransactionError] * 4, exceptions
|
719
|
+
end
|
720
|
+
|
721
|
+
test "transaction should raise Sedna::Exception if connection is closed before it could be committed" do
|
722
|
+
sedna = Sedna.connect @@spec
|
723
|
+
assert_raises Sedna::Exception do
|
724
|
+
sedna.transaction do
|
725
|
+
sedna.execute "<test/>"
|
726
|
+
sedna.close
|
727
|
+
end
|
728
|
+
end
|
729
|
+
end
|
730
|
+
|
731
|
+
# Test sedna.commit.
|
732
|
+
test "commit should commit transaction" do
|
733
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
734
|
+
@@sedna.execute "create document '#{__method__}'"
|
735
|
+
|
736
|
+
@@sedna.transaction
|
737
|
+
@@sedna.execute "update insert <test>test</test> into doc('#{__method__}')"
|
738
|
+
@@sedna.commit
|
739
|
+
|
740
|
+
assert_equal 1, @@sedna.execute("count(doc('#{__method__}')/test)").first.to_i
|
741
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
742
|
+
end
|
743
|
+
|
744
|
+
test "commit should raise Sedna::Exception if connection is closed before transaction could be committed" do
|
745
|
+
sedna = Sedna.connect @@spec
|
746
|
+
sedna.transaction
|
747
|
+
sedna.execute "<test/>"
|
748
|
+
sedna.close
|
749
|
+
assert_raises Sedna::Exception do
|
750
|
+
sedna.commit
|
751
|
+
end
|
752
|
+
end
|
753
|
+
|
754
|
+
test "commit should raise Sedna::TransactionError if no transaction is in progress" do
|
755
|
+
assert_raises Sedna::TransactionError do
|
756
|
+
@@sedna.commit
|
757
|
+
end
|
758
|
+
end
|
759
|
+
|
760
|
+
test "commit should return nil" do
|
761
|
+
@@sedna.transaction
|
762
|
+
assert_nil @@sedna.commit
|
763
|
+
end
|
764
|
+
|
765
|
+
# Test sedna.rollback.
|
766
|
+
test "rollback should roll back transaction" do
|
767
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
768
|
+
@@sedna.execute "create document '#{__method__}'"
|
769
|
+
|
770
|
+
@@sedna.transaction
|
771
|
+
@@sedna.execute "update insert <test>test</test> into doc('#{__method__}')"
|
772
|
+
@@sedna.rollback
|
773
|
+
|
774
|
+
assert_equal 0, @@sedna.execute("count(doc('#{__method__}')/test)").first.to_i
|
775
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
776
|
+
end
|
777
|
+
|
778
|
+
test "rollback should roll back transaction if called inside transaction block" do
|
779
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
780
|
+
@@sedna.execute "create document '#{__method__}'"
|
781
|
+
|
782
|
+
@@sedna.transaction do
|
783
|
+
@@sedna.execute "update insert <test>test</test> into doc('#{__method__}')"
|
784
|
+
@@sedna.rollback
|
785
|
+
end rescue nil
|
786
|
+
|
787
|
+
assert_equal 0, @@sedna.execute("count(doc('#{__method__}')/test)").first.to_i
|
788
|
+
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
789
|
+
end
|
790
|
+
|
791
|
+
test "rollback should fail silently if no transaction is in progress" do
|
792
|
+
assert_nothing_raised do
|
793
|
+
@@sedna.rollback
|
794
|
+
end
|
795
|
+
end
|
796
|
+
|
797
|
+
test "rollback should return nil" do
|
798
|
+
@@sedna.transaction
|
799
|
+
assert_nil @@sedna.rollback
|
670
800
|
end
|
671
801
|
end
|