diff --git a/spec/lib/gitlab/seeder_spec.rb b/spec/lib/gitlab/seeder_spec.rb index d2fd8948433d78dfbb83141e23f03cdad453e3a5..f2d60b52ff20e3d3a20bd30f851c6e65710f2fdb 100644 --- a/spec/lib/gitlab/seeder_spec.rb +++ b/spec/lib/gitlab/seeder_spec.rb @@ -96,4 +96,47 @@ end end end + + describe '.parallel_each' do + let(:test_array) { [1, 2, 3] } + + before do + allow(Gitlab::GitalyClient).to receive(:clear_stubs!) + end + + after do + # Ensure @parallel flag is reset after each test + described_class.instance_variable_set(:@parallel, false) + end + + it 'clears Gitaly stubs and then processes the items in parallel' do + expect(Gitlab::GitalyClient).to receive(:clear_stubs!) + # we're communicating across forks + reader, writer = IO.pipe + pid_reader, pid_writer = IO.pipe + described_class.parallel_each(test_array) do |item| + writer.write("#{item},") + pid_writer.write("#{Process.pid},") + end + writer.close + pid_writer.close + + # Wait for all processes to complete and collect results + Process.waitall + results = reader.read.split(",").uniq.map(&:to_i).sort + expect(results).to eq(test_array) + pids = pid_reader.read.split(",").uniq.reject(&:blank?) + expect(pids.size).to be > 1 + ensure + pid_reader&.close + reader&.close + end + + it 'prevents nested calls by raising an error' do + described_class.parallel_each([1]) do + expect { described_class.parallel_each([2]) } + .to raise_error('Nested Gitlab::Seeder.parallel_each calls are not allowed.') + end + end + end end