Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

file 128 lines (111 sloc) 3.172 kb
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
# $Id$
#
# Author:: Francis Cianfrocca (gmail: blackhedd)
# Homepage:: http://rubyeventmachine.com
# Date:: 8 April 2006
#
# See EventMachine and EventMachine::Connection for documentation and
# usage examples.
#
#----------------------------------------------------------------------------
#
# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
# Gmail: blackhedd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of either: 1) the GNU General Public License
# as published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version; or 2) Ruby's License.
#
# See the file COPYING for complete licensing information.
#
#---------------------------------------------------------------------------
#
#
#

$:.unshift "../lib"
require 'eventmachine'
require 'test/unit'

class TestProcesses < Test::Unit::TestCase

  # 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('sh', '--version', proc{ |process|
      }, proc{ |out,status|
        $out = out
        $status = status
        EM.stop
      })
    }

    assert_match(/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
end
Something went wrong with that request. Please try again.