@@ -505,7 +505,7 @@ def teardown
505505 manifest = Sprockets ::Manifest . new ( @env , @dir )
506506
507507 result = manifest . find_sources ( "mobile/a.js" , "mobile/b.js" )
508- assert_equal [ "var A;\n " , "var B;\n " ] , result . to_a
508+ assert_equal [ "var A;\n " , "var B;\n " ] , result . to_a . sort
509509 end
510510
511511 test "find_sources without environment" do
@@ -571,4 +571,73 @@ def teardown
571571 assert_equal 'kaboom' , ex . message
572572 end
573573 end
574+
575+ # Sleep duration to context switch between concurrent threads.
576+ CONTEXT_SWITCH_DURATION = 0.1
577+
578+ # Record Exporter sequence with a delay to test concurrency.
579+ class SlowExporter < Sprockets ::Exporters ::Base
580+ class << self
581+ attr_accessor :seq
582+ end
583+
584+ def call
585+ SlowExporter . seq << '0'
586+ sleep CONTEXT_SWITCH_DURATION
587+ SlowExporter . seq << '1'
588+ end
589+ end
590+
591+ class SlowExporter2 < SlowExporter
592+ end
593+
594+ test 'concurrent exporting' do
595+ # Register 2 exporters and compile 2 files to ensure that
596+ # all 4 exporting tasks run concurrently.
597+ SlowExporter . seq = [ ]
598+ @env . register_exporter 'image/png' , SlowExporter
599+ @env . register_exporter 'image/png' , SlowExporter2
600+ Sprockets ::Manifest . new ( @env , @dir ) . compile ( 'logo.png' , 'troll.png' )
601+ assert_equal %w( 0 0 0 0 1 1 1 1 ) , SlowExporter . seq
602+ end
603+
604+ test 'sequential exporting' do
605+ @env . export_concurrent = false
606+ SlowExporter . seq = [ ]
607+ @env . register_exporter 'image/png' , SlowExporter
608+ @env . register_exporter 'image/png' , SlowExporter2
609+ Sprockets ::Manifest . new ( @env , @dir ) . compile ( 'logo.png' , 'troll.png' )
610+ assert_equal %w( 0 1 0 1 0 1 0 1 ) , SlowExporter . seq
611+ end
612+
613+ # Record Processor sequence with a delay to test concurrency.
614+ class SlowProcessor
615+ attr_reader :seq
616+
617+ def initialize
618+ @seq = [ ]
619+ end
620+
621+ def call ( _ )
622+ seq << '0'
623+ sleep CONTEXT_SWITCH_DURATION
624+ seq << '1'
625+ nil
626+ end
627+ end
628+
629+ test 'concurrent processing' do
630+ processor = SlowProcessor . new
631+ @env . register_postprocessor 'image/png' , processor
632+ Sprockets ::Manifest . new ( @env , @dir ) . compile ( 'logo.png' , 'troll.png' )
633+ assert_equal %w( 0 0 1 1 ) , processor . seq
634+ end
635+
636+ test 'sequential processing' do
637+ @env . export_concurrent = false
638+ processor = SlowProcessor . new
639+ @env . register_postprocessor 'image/png' , processor
640+ Sprockets ::Manifest . new ( @env , @dir ) . compile ( 'logo.png' , 'troll.png' )
641+ assert_equal %w( 0 1 0 1 ) , processor . seq
642+ end
574643end
0 commit comments