@@ -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,8 +36,6 class IssueNestedSetConcurrencyTest < ActiveSupport::TestCase | |||||
35 | end |
|
36 | end | |
36 |
|
37 | |||
37 | def test_concurrency |
|
38 | def test_concurrency | |
38 | skip if sqlite? |
|
|||
39 | with_settings :notified_events => [] do |
|
|||
40 |
|
|
39 | # Generates an issue and destroys it in order | |
41 |
|
|
40 | # to load all needed classes before starting threads | |
42 |
|
|
41 | i = Issue.generate! | |
@@ -44,11 +43,7 class IssueNestedSetConcurrencyTest < ActiveSupport::TestCase | |||||
44 |
|
43 | |||
45 |
|
|
44 | root = Issue.generate! | |
46 |
|
|
45 | assert_difference 'Issue.count', 60 do | |
47 |
|
|
46 | threaded(3) do | |
48 | 3.times do |i| |
|
|||
49 | threads << Thread.new(i) do |
|
|||
50 | ActiveRecord::Base.connection_pool.with_connection do |
|
|||
51 | begin |
|
|||
52 |
|
|
47 | 10.times do | |
53 |
|
|
48 | i = Issue.generate! :parent_issue_id => root.id | |
54 |
|
|
49 | c1 = Issue.generate! :parent_issue_id => i.id | |
@@ -57,6 +52,35 class IssueNestedSetConcurrencyTest < ActiveSupport::TestCase | |||||
57 |
|
|
52 | c2.reload.destroy | |
58 |
|
|
53 | c1.reload.destroy | |
59 |
|
|
54 | end | |
|
55 | end | |||
|
56 | end | |||
|
57 | end | |||
|
58 | ||||
|
59 | def test_concurrent_subtasks_creation | |||
|
60 | root = Issue.generate! | |||
|
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 | |||
60 |
|
|
84 | rescue Exception => e | |
61 |
|
|
85 | Thread.current[:exception] = e.message | |
62 |
|
|
86 | end | |
@@ -70,4 +94,3 class IssueNestedSetConcurrencyTest < ActiveSupport::TestCase | |||||
70 |
|
|
94 | end | |
71 |
|
|
95 | end | |
72 |
|
|
96 | end | |
73 | end |
|
General Comments 0
You need to be logged in to leave comments.
Login now