yahns.git  about / heads / tags
sleepy, multi-threaded, non-blocking application server for Ruby
blob 6d61aefb0132b3d04eb84635c6b46639042b6cde 1393 bytes (raw)
$ git show v0.0.0:test/test_queue.rb	# shows this blob on the CLI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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

git clone git://yhbt.net/yahns.git
git clone https://yhbt.net/yahns.git