2020-08-03 04:37:19 +08:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
from pexpect_helper import SpawnedProc
|
|
|
|
|
|
|
|
sp = SpawnedProc()
|
|
|
|
sendline, expect_prompt, expect_str = sp.sendline, sp.expect_prompt, sp.expect_str
|
|
|
|
|
|
|
|
# Test fish_postexec and $status_generation for interactive shells.
|
|
|
|
expect_prompt()
|
|
|
|
|
2020-11-22 21:39:48 +08:00
|
|
|
sendline(
|
|
|
|
"function test_fish_postexec --on-event fish_postexec; printf 'pipestatus:%s, generation:%d, command:%s\\n' (string join '|' $pipestatus) $status_generation $argv; end"
|
|
|
|
)
|
2020-08-03 04:37:19 +08:00
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
generation = 1
|
|
|
|
|
|
|
|
# fish_postexec is called when foreground job ends.
|
|
|
|
sendline("true")
|
|
|
|
generation += 1
|
|
|
|
expect_str("pipestatus:0, generation:%d, command:true" % generation)
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
# Command has multiple jobs.
|
|
|
|
sendline("true;false")
|
|
|
|
generation += 1
|
|
|
|
expect_str("pipestatus:1, generation:%d, command:true;false" % generation)
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
# Command is a pipeline.
|
|
|
|
sendline("true|false")
|
|
|
|
generation += 1
|
|
|
|
expect_str("pipestatus:0|1, generation:%d, command:true|false" % generation)
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
# Does not increment $status_generation for background jobs.
|
|
|
|
# status, pipestatus remain unchanged
|
|
|
|
sendline("sleep 1000 &")
|
|
|
|
expect_str("pipestatus:0|1, generation:%d, command:sleep 1000 &" % generation)
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
# multiple backgrounded jobs
|
|
|
|
sendline("sleep 1000 &; sleep 2000 &")
|
2020-11-22 21:39:48 +08:00
|
|
|
expect_str(
|
|
|
|
"pipestatus:0|1, generation:%d, command:sleep 1000 &; sleep 2000 &" % generation
|
|
|
|
)
|
2020-08-03 04:37:19 +08:00
|
|
|
expect_prompt()
|
|
|
|
|
2020-08-03 04:31:00 +08:00
|
|
|
# valid variable assignment
|
|
|
|
sendline("set foo bar")
|
|
|
|
expect_str("pipestatus:0|1, generation:%d, command:set foo bar" % generation)
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
# valid variable assignment with background job
|
|
|
|
sendline("set foo bar; sleep 1000 &")
|
2020-11-22 21:39:48 +08:00
|
|
|
expect_str(
|
|
|
|
"pipestatus:0|1, generation:%d, command:set foo bar; sleep 1000 &" % generation
|
|
|
|
)
|
2020-08-03 04:31:00 +08:00
|
|
|
expect_prompt()
|
|
|
|
|
2020-08-03 04:37:19 +08:00
|
|
|
# Increments $status_generation if any job was foreground.
|
|
|
|
sendline("false|true; sleep 1000 &")
|
|
|
|
generation += 1
|
2020-11-22 21:39:48 +08:00
|
|
|
expect_str(
|
|
|
|
"pipestatus:1|0, generation:%d, command:false|true; sleep 1000 &" % generation
|
|
|
|
)
|
2020-08-03 04:37:19 +08:00
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
sendline("sleep 1000 &; true|false|true")
|
|
|
|
generation += 1
|
2020-11-22 21:39:48 +08:00
|
|
|
expect_str(
|
|
|
|
"pipestatus:0|1|0, generation:%d, command:sleep 1000 &; true|false|true"
|
|
|
|
% generation
|
|
|
|
)
|
2020-08-03 04:37:19 +08:00
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
# Increments $status_generation for empty if/while blocks.
|
|
|
|
sendline("if true;end")
|
|
|
|
generation += 1
|
|
|
|
expect_str("pipestatus:0, generation:%d, command:if true;end" % generation)
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
sendline("while false;end")
|
|
|
|
generation += 1
|
|
|
|
expect_str("pipestatus:0, generation:%d, command:while false;end" % generation)
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
# or non-matching if.
|
|
|
|
sendline("if false;false;end")
|
|
|
|
generation += 1
|
|
|
|
expect_str("pipestatus:0, generation:%d, command:if false;false;end" % generation)
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
# or a function definition.
|
|
|
|
# This is an implementation detail, but the test case should prevent regressions.
|
|
|
|
sendline("function fail; false; end")
|
|
|
|
generation += 1
|
2020-11-22 21:39:48 +08:00
|
|
|
expect_str(
|
|
|
|
"pipestatus:0, generation:%d, command:function fail; false; end" % generation
|
|
|
|
)
|
2020-08-03 04:37:19 +08:00
|
|
|
expect_prompt()
|
|
|
|
|
2020-08-03 04:31:00 +08:00
|
|
|
# or an invalid variable assignment
|
|
|
|
sendline("set '!@#$' value")
|
|
|
|
generation += 1
|
|
|
|
expect_str("pipestatus:2, generation:%d, command:set '!@#$' value" % generation)
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
# or a variable query
|
|
|
|
sendline("set -q fish_pid")
|
|
|
|
generation += 1
|
|
|
|
expect_str("pipestatus:0, generation:%d, command:set -q fish_pid" % generation)
|
|
|
|
expect_prompt()
|
|
|
|
|
2020-08-03 04:37:19 +08:00
|
|
|
# This is just to set a memorable pipestatus.
|
|
|
|
sendline("true|false|true")
|
|
|
|
generation += 1
|
|
|
|
expect_str("pipestatus:0|1|0")
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
# Does not increment $status_generation for empty begin/end block.
|
|
|
|
sendline("begin;end")
|
|
|
|
expect_str("pipestatus:0|1|0, generation:%d, command:begin;end" % generation)
|
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
# Or begin/end block with only backgrounded jobs.
|
|
|
|
sendline("begin; sleep 200 &; sleep 400 &; end")
|
2020-11-22 21:39:48 +08:00
|
|
|
expect_str(
|
|
|
|
"pipestatus:0|1|0, generation:%d, command:begin; sleep 200 &; sleep 400 &; end"
|
|
|
|
% generation
|
|
|
|
)
|
2020-08-03 04:37:19 +08:00
|
|
|
expect_prompt()
|
|
|
|
|
|
|
|
# Or a combination of begin/end block and backgrounded job.
|
|
|
|
sendline("begin; sleep 200 &; end; sleep 400 &")
|
2020-11-22 21:39:48 +08:00
|
|
|
expect_str(
|
|
|
|
"pipestatus:0|1|0, generation:%d, command:begin; sleep 200 &; end; sleep 400 &"
|
|
|
|
% generation
|
|
|
|
)
|
2020-08-03 04:37:19 +08:00
|
|
|
expect_prompt()
|
2020-08-03 04:31:00 +08:00
|
|
|
|
|
|
|
# Or a combination with variable assignments
|
|
|
|
sendline("begin; set foo bar; sleep 1000 &; end; set bar baz; sleep 2000 &")
|
2020-11-22 21:39:48 +08:00
|
|
|
expect_str(
|
|
|
|
"pipestatus:0|1|0, generation:%d, command:begin; set foo bar; sleep 1000 &; end; set bar baz; sleep 2000 &"
|
|
|
|
% generation
|
|
|
|
)
|
2020-08-03 04:31:00 +08:00
|
|
|
expect_prompt()
|