mirror of
https://github.com/samsonjs/csc360-a1-shell.git
synced 2026-04-27 14:57:43 +00:00
Test refresh_line hook
This commit is contained in:
parent
2b78487c74
commit
35fc514a14
2 changed files with 27 additions and 4 deletions
|
|
@ -10,9 +10,10 @@ module Shell
|
||||||
|
|
||||||
attr_reader :logger
|
attr_reader :logger
|
||||||
|
|
||||||
def initialize(logger: nil)
|
def initialize(logger: nil, refresh_line: nil)
|
||||||
@jobs_by_pid = {}
|
@jobs_by_pid = {}
|
||||||
@logger = logger || Logger.instance
|
@logger = logger || Logger.instance
|
||||||
|
@refresh_line = refresh_line || -> { Readline.refresh_line }
|
||||||
end
|
end
|
||||||
|
|
||||||
def exec_command(cmd, args, background: false)
|
def exec_command(cmd, args, background: false)
|
||||||
|
|
@ -67,7 +68,11 @@ module Shell
|
||||||
def trap_sigchld
|
def trap_sigchld
|
||||||
# handler for SIGCHLD when a child's state changes
|
# handler for SIGCHLD when a child's state changes
|
||||||
Signal.trap("CHLD") do |_signo|
|
Signal.trap("CHLD") do |_signo|
|
||||||
pid = Process.waitpid(-1, Process::WNOHANG)
|
pid = begin
|
||||||
|
Process.waitpid(-1, Process::WNOHANG)
|
||||||
|
rescue Errno::ECHILD
|
||||||
|
nil
|
||||||
|
end
|
||||||
if pid.nil?
|
if pid.nil?
|
||||||
# no-op
|
# no-op
|
||||||
elsif (job = @jobs_by_pid[pid])
|
elsif (job = @jobs_by_pid[pid])
|
||||||
|
|
@ -79,7 +84,7 @@ module Shell
|
||||||
else
|
else
|
||||||
warn "\n#{yellow("[WARN]")} No job found for child with PID #{pid}"
|
warn "\n#{yellow("[WARN]")} No job found for child with PID #{pid}"
|
||||||
end
|
end
|
||||||
Readline.refresh_line
|
@refresh_line.call
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,9 @@
|
||||||
require "minitest/autorun"
|
require "minitest/autorun"
|
||||||
require "etc"
|
require "etc"
|
||||||
|
require "timeout"
|
||||||
|
$LOAD_PATH.unshift(File.expand_path("..", __dir__))
|
||||||
|
require_relative "../shell/job_control"
|
||||||
|
require_relative "../shell/logger"
|
||||||
|
|
||||||
class ShellTest < Minitest::Test
|
class ShellTest < Minitest::Test
|
||||||
TRIVIAL_SHELL_SCRIPT = "#!/bin/sh\ntrue".freeze
|
TRIVIAL_SHELL_SCRIPT = "#!/bin/sh\ntrue".freeze
|
||||||
|
|
@ -151,7 +155,21 @@ class ShellTest < Minitest::Test
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_refreshes_readline_after_bg_execution
|
def test_refreshes_readline_after_bg_execution
|
||||||
skip "unimplemented"
|
called = false
|
||||||
|
job_control = Shell::JobControl.new(
|
||||||
|
logger: Shell::Logger.instance,
|
||||||
|
refresh_line: -> { called = true }
|
||||||
|
)
|
||||||
|
previous = job_control.trap_sigchld
|
||||||
|
begin
|
||||||
|
job_control.exec_command("echo", ["hello"], background: true)
|
||||||
|
Timeout.timeout(2) do
|
||||||
|
sleep 0.01 until called
|
||||||
|
end
|
||||||
|
assert called
|
||||||
|
ensure
|
||||||
|
Signal.trap("CHLD", previous)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
#########################
|
#########################
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue