@@ -505,7 +505,7 @@ def teardown
505
505
manifest = Sprockets ::Manifest . new ( @env , @dir )
506
506
507
507
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
509
509
end
510
510
511
511
test "find_sources without environment" do
@@ -571,4 +571,73 @@ def teardown
571
571
assert_equal 'kaboom' , ex . message
572
572
end
573
573
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
574
643
end
0 commit comments