diff --git a/lib/cmdtest/testcase.rb b/lib/cmdtest/testcase.rb index 230c17d..2d4b41e 100644 --- a/lib/cmdtest/testcase.rb +++ b/lib/cmdtest/testcase.rb @@ -66,7 +66,7 @@ module Cmdtest ORIG_CWD = Dir.pwd - attr_reader :_work_dir, :_env + attr_reader :_work_dir, :_env_setenv def initialize(test_method, clog, runner) @_test_method = test_method @@ -74,7 +74,7 @@ module Cmdtest @_runner = runner @_work_dir = Workdir.new(self, runner) @_cwd = @_runner.tmp_work_dir - @_env = Hash.new + @_env_setenv = Hash.new @_in_cmd = false @_comment_str = nil @_env_path = @_runner.orig_env_path @@ -198,13 +198,13 @@ module Cmdtest #------------------------------ def setenv(name, value) - @_env[name] = value + @_env_setenv[name] = [:setenv, value] end #------------------------------ def unsetenv(name) - @_env.delete(name) + @_env_setenv[name] = [:unsetenv] end #------------------------------ diff --git a/lib/cmdtest/workdir.rb b/lib/cmdtest/workdir.rb index 61dcb32..77ad44f 100644 --- a/lib/cmdtest/workdir.rb +++ b/lib/cmdtest/workdir.rb @@ -94,7 +94,17 @@ module Cmdtest def _ENV_strs(env) # TODO: windows - env.keys.sort.map {|k| "export %s='%s'" % [k, env[k]] } + env.keys.sort.map do |k| + what = env[k][0] + case what + when :setenv + "export %s='%s'" % [k, env[k][1]] + when :unsetenv + "unset %s" % [k] + else + raise "internal error" + end + end end def _chdir_str(dir) @@ -139,7 +149,7 @@ module Cmdtest end File.open(_tmp_redirect_sh, "w") do |f| - f.puts _ENV_strs(@testcase._env) + f.puts _ENV_strs(@testcase._env_setenv) f.puts f.puts _chdir_str(@testcase._cwd) f.puts diff --git a/t/CMDTEST_setenv.rb b/t/CMDTEST_setenv.rb new file mode 100644 index 0000000..e27d560 --- /dev/null +++ b/t/CMDTEST_setenv.rb @@ -0,0 +1,83 @@ +require "selftest_utils" + +class CMDTEST_setenv < Cmdtest::Testcase + + include SelftestUtils + + #----------------------------------- + + def test_setenv + #---------- + create_CMDTEST_foo [ + 'cmd "env | grep TESTVAR1" do', + ' exit_nonzero', # no match in grep + 'end', + ] + cmd_cmdtest do + comment "TESTVAR1 not set" + stdout_equal [ + "### env | grep TESTVAR1", + ] + end + + #---------- + create_CMDTEST_foo [ + 'setenv "TESTVAR1", "123456"', + 'cmd "env | grep TESTVAR1" do', + ' stdout_equal "TESTVAR1=123456\\n"', + 'end', + ] + cmd_cmdtest do + comment "TESTVAR1 set by setenv" + stdout_equal [ + "### env | grep TESTVAR1", + ] + end + + cmd("env | grep TESTVAR1") do + comment "TESTVAR1 still unset on level1" + exit_nonzero # no match in grep + end + end + + #----------------------------------- + + def test_unsetenv + ENV['TESTVAR2'] = '987654' + #---------- + create_CMDTEST_foo [ + 'cmd "env | grep TESTVAR2" do', + ' stdout_equal "TESTVAR2=987654\\n"', + 'end', + ] + cmd_cmdtest do + comment "TESTVAR2 set from start" + stdout_equal [ + "### env | grep TESTVAR2", + ] + end + + #---------- + create_CMDTEST_foo [ + 'unsetenv "TESTVAR2"', + 'cmd "env | grep TESTVAR2" do', + ' exit_nonzero', # no match in grep + 'end', + ] + cmd_cmdtest do + comment "TESTVAR2 unset by unsetenv" + stdout_equal [ + "### env | grep TESTVAR2", + ] + end + + cmd("env | grep TESTVAR2") do + comment "TESTVAR2 still set on level1" + stdout_equal [ + "TESTVAR2=987654", + ] + end + end + +end +