@@ -27,6 +27,7 class IssueNestedSetConcurrencyTest < ActiveSupport::TestCase | |||||
27 | self.use_transactional_fixtures = false |
|
27 | self.use_transactional_fixtures = false | |
28 |
|
28 | |||
29 | def setup |
|
29 | def setup | |
|
30 | skip if sqlite? | |||
30 | CustomField.delete_all |
|
31 | CustomField.delete_all | |
31 | end |
|
32 | end | |
32 |
|
33 | |||
@@ -35,38 +36,60 class IssueNestedSetConcurrencyTest < ActiveSupport::TestCase | |||||
35 | end |
|
36 | end | |
36 |
|
37 | |||
37 | def test_concurrency |
|
38 | def test_concurrency | |
38 | skip if sqlite? |
|
39 | # Generates an issue and destroys it in order | |
39 | with_settings :notified_events => [] do |
|
40 | # to load all needed classes before starting threads | |
40 | # Generates an issue and destroys it in order |
|
41 | i = Issue.generate! | |
41 | # to load all needed classes before starting threads |
|
42 | i.destroy | |
42 | i = Issue.generate! |
|
|||
43 | i.destroy |
|
|||
44 |
|
43 | |||
45 |
|
|
44 | root = Issue.generate! | |
46 |
|
|
45 | assert_difference 'Issue.count', 60 do | |
47 |
|
|
46 | threaded(3) do | |
48 |
|
|
47 | 10.times do | |
49 | threads << Thread.new(i) do |
|
48 | i = Issue.generate! :parent_issue_id => root.id | |
50 | ActiveRecord::Base.connection_pool.with_connection do |
|
49 | c1 = Issue.generate! :parent_issue_id => i.id | |
51 | begin |
|
50 | c2 = Issue.generate! :parent_issue_id => i.id | |
52 | 10.times do |
|
51 | c3 = Issue.generate! :parent_issue_id => i.id | |
53 | i = Issue.generate! :parent_issue_id => root.id |
|
52 | c2.reload.destroy | |
54 | c1 = Issue.generate! :parent_issue_id => i.id |
|
53 | c1.reload.destroy | |
55 | c2 = Issue.generate! :parent_issue_id => i.id |
|
54 | end | |
56 | c3 = Issue.generate! :parent_issue_id => i.id |
|
55 | end | |
57 | c2.reload.destroy |
|
56 | end | |
58 | c1.reload.destroy |
|
57 | end | |
59 | end |
|
58 | ||
60 | rescue Exception => e |
|
59 | def test_concurrent_subtasks_creation | |
61 | Thread.current[:exception] = e.message |
|
60 | root = Issue.generate! | |
62 | end |
|
61 | assert_difference 'Issue.count', 30 do | |
|
62 | threaded(3) do | |||
|
63 | 10.times do | |||
|
64 | Issue.generate! :parent_issue_id => root.id | |||
|
65 | end | |||
|
66 | end | |||
|
67 | end | |||
|
68 | root.reload | |||
|
69 | assert_equal [1, 62], [root.lft, root.rgt] | |||
|
70 | children_bounds = root.children.sort_by(&:lft).map {|c| [c.lft, c.rgt]}.flatten | |||
|
71 | assert_equal (2..61).to_a, children_bounds | |||
|
72 | end | |||
|
73 | ||||
|
74 | private | |||
|
75 | ||||
|
76 | def threaded(count, &block) | |||
|
77 | with_settings :notified_events => [] do | |||
|
78 | threads = [] | |||
|
79 | count.times do |i| | |||
|
80 | threads << Thread.new(i) do | |||
|
81 | ActiveRecord::Base.connection_pool.with_connection do | |||
|
82 | begin | |||
|
83 | yield | |||
|
84 | rescue Exception => e | |||
|
85 | Thread.current[:exception] = e.message | |||
63 | end |
|
86 | end | |
64 | end |
|
87 | end | |
65 | end |
|
88 | end | |
66 | threads.each do |thread| |
|
89 | end | |
67 | thread.join |
|
90 | threads.each do |thread| | |
68 | assert_nil thread[:exception] |
|
91 | thread.join | |
69 | end |
|
92 | assert_nil thread[:exception] | |
70 | end |
|
93 | end | |
71 | end |
|
94 | end | |
72 | end |
|
95 | end |
General Comments 0
You need to be logged in to leave comments.
Login now