about summary refs log tree commit homepage
path: root/test/test_queue.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_queue.rb')
-rw-r--r--test/test_queue.rb59
1 files changed, 59 insertions, 0 deletions
diff --git a/test/test_queue.rb b/test/test_queue.rb
new file mode 100644
index 0000000..6d61aef
--- /dev/null
+++ b/test/test_queue.rb
@@ -0,0 +1,59 @@
+# Copyright (C) 2013, Eric Wong <normalperson@yhbt.net> and all contributors
+# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+require_relative 'helper'
+require 'timeout'
+require 'stringio'
+
+class TestQueue < Testcase
+  parallelize_me!
+
+  def setup
+    @q = Yahns::Queue.new
+    @err = StringIO.new
+    @logger = Logger.new(@err)
+    @q.fdmap = @fdmap = Yahns::Fdmap.new(@logger, 0.5)
+    assert @q.close_on_exec?
+  end
+
+  def test_queue
+    r, w = IO.pipe
+    assert_equal 0, @fdmap.size
+    @q.queue_add(r, Yahns::Queue::QEV_RD)
+    assert_equal 1, @fdmap.size
+    def r.yahns_step
+      begin
+        case read_nonblock(11)
+        when "delete"
+          return :delete
+        end
+      rescue Errno::EAGAIN
+        return :wait_readable
+      rescue EOFError
+        return nil
+      end while true
+    end
+    w.write('.')
+    Timeout.timeout(10) do
+      Thread.pass until r.nread > 0
+      @q.spawn_worker_threads(@logger, 1, 1)
+      Thread.pass until r.nread == 0
+
+      w.write("delete")
+      Thread.pass until r.nread == 0
+      Thread.pass until @fdmap.size == 0
+
+      # should not raise
+      @q.queue_add(r, Yahns::Queue::QEV_RD)
+      assert_equal 1, @fdmap.size
+      w.close
+      Thread.pass until @fdmap.size == 0
+    end
+    assert r.closed?
+  ensure
+    [ r, w ].each { |io| io.close unless io.closed? }
+  end
+
+  def teardown
+    @q.close
+  end
+end