##// END OF EJS Templates
Speeds up rendering of the project list for users who belong to hundreds of projects....
Speeds up rendering of the project list for users who belong to hundreds of projects. git-svn-id: http://svn.redmine.org/redmine/trunk@16123 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r14856:cda9c63d9c21
r15741:f8df935dcada
Show More
project_nested_set_concurrency_test.rb
76 lines | 2.3 KiB | text/x-ruby | RubyLexer
/ test / unit / project_nested_set_concurrency_test.rb
Jean-Philippe Lang
Replaces awesome_nested_set gem with a simple and more robust implementation of nested sets....
r13459 # Redmine - project management software
Jean-Philippe Lang
Updates copyright for 2016....
r14856 # Copyright (C) 2006-2016 Jean-Philippe Lang
Jean-Philippe Lang
Replaces awesome_nested_set gem with a simple and more robust implementation of nested sets....
r13459 #
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require File.expand_path('../../test_helper', __FILE__)
class ProjectNestedSetConcurrencyTest < ActiveSupport::TestCase
self.use_transactional_fixtures = false
def setup
CustomField.delete_all
end
def teardown
Project.delete_all
end
def test_concurrency
skip if sqlite?
# Generates a project and destroys it in order
# to load all needed classes before starting threads
p = generate_project!
p.destroy
assert_difference 'Project.count', 60 do
threads = []
3.times do |i|
threads << Thread.new(i) do
ActiveRecord::Base.connection_pool.with_connection do
begin
10.times do
p = generate_project!
c1 = generate_project! :parent_id => p.id
c2 = generate_project! :parent_id => p.id
c3 = generate_project! :parent_id => p.id
c2.reload.destroy
c1.reload.destroy
end
rescue Exception => e
Thread.current[:exception] = e.message
end
end
end
end
threads.each do |thread|
thread.join
assert_nil thread[:exception]
end
end
end
# Generates a bare project with random name
# and identifier
def generate_project!(attributes={})
identifier = "a"+Redmine::Utils.random_hex(6)
Project.generate!({
:identifier => identifier,
:name => identifier,
:tracker_ids => [],
:enabled_module_names => []
}.merge(attributes))
end
end