| 
									
										
										
										
											2019-03-16 15:03:47 +00:00
										 |  |  | # frozen_string_literal: true | 
					
						
							| 
									
										
										
										
											2019-03-15 01:32:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-07 20:19:49 +00:00
										 |  |  | # Redmine - project management software | 
					
						
							| 
									
										
										
										
											2024-02-26 22:55:54 +00:00
										 |  |  | # Copyright (C) 2006-  Jean-Philippe Lang | 
					
						
							| 
									
										
										
										
											2015-01-07 20:19:49 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # 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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-01 07:13:39 +00:00
										 |  |  | require_relative '../test_helper' | 
					
						
							| 
									
										
										
										
											2015-01-07 20:19:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class ProjectNestedSetConcurrencyTest < ActiveSupport::TestCase | 
					
						
							| 
									
										
										
										
											2017-07-23 11:26:04 +00:00
										 |  |  |   self.use_transactional_tests = false | 
					
						
							| 
									
										
										
										
											2015-01-07 20:19:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def setup | 
					
						
							| 
									
										
										
										
											2018-12-16 17:23:31 +00:00
										 |  |  |     User.current = nil | 
					
						
							| 
									
										
										
										
											2015-01-07 20:19:49 +00:00
										 |  |  |     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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-14 07:13:03 +00:00
										 |  |  |     assert_difference 'Project.async_count.value', 60 do | 
					
						
							| 
									
										
										
										
											2015-01-07 20:19:49 +00:00
										 |  |  |       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 | 
					
						
							| 
									
										
										
										
											2019-05-25 06:50:25 +00:00
										 |  |  |             rescue => e | 
					
						
							| 
									
										
										
										
											2015-01-07 20:19:49 +00:00
										 |  |  |               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={}) | 
					
						
							| 
									
										
										
										
											2020-12-04 13:58:43 +00:00
										 |  |  |     identifier = "a" + Redmine::Utils.random_hex(6) | 
					
						
							|  |  |  |     Project.generate!( | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2015-01-07 20:19:49 +00:00
										 |  |  |         :identifier => identifier, | 
					
						
							|  |  |  |         :name => identifier, | 
					
						
							|  |  |  |         :tracker_ids => [], | 
					
						
							|  |  |  |         :enabled_module_names => [] | 
					
						
							| 
									
										
										
										
											2020-12-04 13:58:43 +00:00
										 |  |  |       }.merge(attributes) | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-01-07 20:19:49 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | end |