File: test_processes.rb

package info (click to toggle)
ruby-eventmachine 1.0.3-6%2Bdeb8u1
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 2,000 kB
  • ctags: 3,178
  • sloc: ruby: 8,641; cpp: 5,217; java: 827; makefile: 5
file content (128 lines) | stat: -rw-r--r-- 3,075 bytes parent folder | download | duplicates (2)
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
require 'em_test_helper'

class TestProcesses < Test::Unit::TestCase

  if !windows? && !jruby?

    # EM::DeferrableChildProcess is a sugaring of a common use-case
    # involving EM::popen.
    # Call the #open method on EM::DeferrableChildProcess, passing
    # a command-string. #open immediately returns an EM::Deferrable
    # object. It also schedules the forking of a child process, which
    # will execute the command passed to #open.
    # When the forked child terminates, the Deferrable will be signalled
    # and execute its callbacks, passing the data that the child process
    # wrote to stdout.
    #
    def test_deferrable_child_process
      ls = ""
      EM.run {
        d = EM::DeferrableChildProcess.open( "ls -ltr" )
        d.callback {|data_from_child|
          ls = data_from_child
          EM.stop
        }
      }
      assert( ls.length > 0)
    end

    def setup
      $out = nil
      $status = nil
    end

    def test_em_system
      EM.run{
        EM.system('ls'){ |out,status| $out, $status = out, status; EM.stop }
      }

      assert( $out.length > 0 )
      assert_equal($status.exitstatus, 0)
      assert_equal($status.class, Process::Status)
    end

    def test_em_system_pid
      $pids = []

      EM.run{
        $pids << EM.system('echo hi', proc{ |out,status|$pids << status.pid; EM.stop })
      }

      assert_equal $pids[0], $pids[1]
    end

    def test_em_system_with_proc
      EM.run{
        EM.system('ls', proc{ |out,status| $out, $status = out, status; EM.stop })
      }

      assert( $out.length > 0 )
      assert_equal($status.exitstatus, 0)
      assert_equal($status.class, Process::Status)
    end

    def test_em_system_with_two_procs
      EM.run{
        EM.system('sh', proc{ |process|
          process.send_data("echo hello\n")
          process.send_data("exit\n")
        }, proc{ |out,status|
          $out = out
          $status = status
          EM.stop
        })
      }

      assert_equal("hello\n", $out)
    end

    def test_em_system_cmd_arguments
      EM.run{
        EM.system('echo', '1', '2', 'version', proc{ |process|
        }, proc{ |out,status|
          $out = out
          $status = status
          EM.stop
        })
      }

      assert_match(/1 2 version/i, $out)
    end

    def test_em_system_spaced_arguments
      EM.run{
        EM.system('ruby', '-e', 'puts "hello"', proc{ |out,status|
          $out = out
          EM.stop
        })
      }

      assert_equal("hello\n", $out)
    end

    def test_em_popen_pause_resume
      c_rx = 0

      test_client = Module.new do
        define_method :receive_data do |data|
          c_rx += 1
          pause
          EM.add_timer(0.5) { EM.stop }
        end
      end

      EM.run{
        EM.popen('cat /dev/random', test_client)
      }

      assert_equal 1, c_rx
    end
  else
    warn "EM.popen not implemented, skipping tests in #{__FILE__}"

    # Because some rubies will complain if a TestCase class has no tests
    def test_em_popen_unsupported
      assert true
    end
  end
end