aboutsummaryrefslogtreecommitdiff
path: root/test/unit/os/shell_spec.lua
diff options
context:
space:
mode:
Diffstat (limited to 'test/unit/os/shell_spec.lua')
-rw-r--r--test/unit/os/shell_spec.lua74
1 files changed, 74 insertions, 0 deletions
diff --git a/test/unit/os/shell_spec.lua b/test/unit/os/shell_spec.lua
new file mode 100644
index 0000000000..870034aad9
--- /dev/null
+++ b/test/unit/os/shell_spec.lua
@@ -0,0 +1,74 @@
+-- not all operating systems support the system()-tests, as of yet.
+local allowed_os = {
+ Linux = true,
+ OSX = true,
+ BSD = true,
+ POSIX = true
+}
+
+if allowed_os[jit.os] ~= true then
+ return
+end
+
+local helpers = require('test.unit.helpers')
+local shell = helpers.cimport(
+ './src/nvim/os/shell.h',
+ './src/nvim/option_defs.h',
+ './src/nvim/os/event.h',
+ './src/nvim/misc1.h'
+)
+local ffi, eq, neq = helpers.ffi, helpers.eq, helpers.neq
+local intern = helpers.internalize
+local to_cstr = helpers.to_cstr
+local NULL = ffi.cast('void *', 0)
+
+describe('shell functions', function()
+ setup(function()
+ -- the logging functions are complain if I don't do this
+ shell.init_homedir()
+
+ shell.event_init()
+
+ -- os_system() can't work when the p_sh and p_shcf variables are unset
+ shell.p_sh = to_cstr('/bin/bash')
+ shell.p_shcf = to_cstr('-c')
+ end)
+
+ teardown(function()
+ shell.event_teardown()
+ end)
+
+ local function os_system(cmd, input)
+ local input_or = input and to_cstr(input) or NULL
+ local input_len = (input ~= nil) and string.len(input) or 0
+ local output = ffi.new('char *[1]')
+ local nread = ffi.new('size_t[1]')
+
+ local status = shell.os_system(to_cstr(cmd), input_or, input_len, output, nread)
+
+ return status, intern(output[0], nread[0])
+ end
+
+ describe('os_system', function()
+ it('can echo some output (shell builtin)', function()
+ local cmd, text = 'echo -n', 'some text'
+ local status, output = os_system(cmd .. ' ' .. text)
+ eq(text, output)
+ eq(0, status)
+ end)
+
+ it('can deal with empty output', function()
+ local cmd = 'echo -n'
+ local status, output = os_system(cmd)
+ eq('', output)
+ eq(0, status)
+ end)
+
+ it('can pass input on stdin', function()
+ local cmd, input = 'cat -', 'some text\nsome other text'
+ local status, output = os_system(cmd, input)
+ eq(input, output)
+ eq(0, status)
+ end)
+ end)
+end)