On Tue, Aug 11, 2009 at 09:27:17AM -0400, Michael Goldish wrote:
>
> ----- "Yolkfull Chow" <[email protected]> wrote:
>
> > On Tue, Aug 11, 2009 at 03:10:42PM +0300, Michael Goldish wrote:
> > > Currently the test only logs in, runs a given script and fails if
> > the script
> > > takes too long to exit or if its exit status is nonzero.
> > >
> > > The test expects these parameters:
> > > autoit_binary: Path to AutoIt binary in the guest.
> > > autoit_script: Path to script in the host.
> > > autoit_script_params: Command line parameters to send to the
> > script.
> > > autoit_script_timeout: The time duration (in seconds) to wait for
> > the script to
> > > exit.
> > >
> > > The test code can be extended later to add more features.
> > >
> > > Signed-off-by: Michael Goldish <[email protected]>
> > > ---
> > > client/tests/kvm/kvm.py | 1 +
> > > client/tests/kvm/kvm_tests.py | 66
> > +++++++++++++++++++++++++++++++++++++++++
> > > 2 files changed, 67 insertions(+), 0 deletions(-)
> > >
> > > diff --git a/client/tests/kvm/kvm.py b/client/tests/kvm/kvm.py
> > > index 070e463..4930e80 100644
> > > --- a/client/tests/kvm/kvm.py
> > > +++ b/client/tests/kvm/kvm.py
> > > @@ -56,6 +56,7 @@ class kvm(test.test):
> > > "linux_s3": test_routine("kvm_tests",
> > "run_linux_s3"),
> > > "stress_boot": test_routine("kvm_tests",
> > "run_stress_boot"),
> > > "timedrift": test_routine("kvm_tests",
> > "run_timedrift"),
> > > + "autoit": test_routine("kvm_tests",
> > "run_autoit"),
> > > }
> > >
> > > # Make it possible to import modules from the test's
> > bindir
> > > diff --git a/client/tests/kvm/kvm_tests.py
> > b/client/tests/kvm/kvm_tests.py
> > > index 9cd01e2..749c1fd 100644
> > > --- a/client/tests/kvm/kvm_tests.py
> > > +++ b/client/tests/kvm/kvm_tests.py
> > > @@ -776,3 +776,69 @@ def run_timedrift(test, params, env):
> > > if drift > drift_threshold_after_rest:
> > > raise error.TestFail("Time drift too large after rest
> > period: %.2f%%"
> > > % drift_total)
> > > +
> > > +
> > > +def run_autoit(test, params, env):
> > > + """
> > > + A wrapper for AutoIt scripts.
> > > +
> > > + 1) Log into a guest.
> > > + 2) Run AutoIt script.
> > > + 3) Wait for script execution to complete.
> > > + 4) Pass/fail according to exit status of script.
> > > +
> > > + @param test: KVM test object.
> > > + @param params: Dictionary with test parameters.
> > > + @param env: Dictionary with the test environment.
> > > + """
> > > + vm = kvm_utils.env_get_vm(env, params.get("main_vm"))
> > > + if not vm:
> > > + raise error.TestError("VM object not found in
> > environment")
> > > + if not vm.is_alive():
> > > + raise error.TestError("VM seems to be dead; Test requires a
> > living VM")
> > > +
> > > + logging.info("Waiting for guest to be up...")
> > > +
> > > + session = kvm_utils.wait_for(vm.remote_login, 240, 0, 2)
> > > + if not session:
> > > + raise error.TestFail("Could not log into guest")
> > > +
> > > + try:
> > > + logging.info("Logged in; starting script...")
> > > +
> > > + # Collect test parameters
> > > + binary = params.get("autoit_binary")
> > > + script = params.get("autoit_script")
> > > + script_params = params.get("autoit_script_params", "")
> > > + timeout = float(params.get("autoit_script_timeout", 600))
> > > +
> > > + # Send AutoIt script to guest (this code will be replaced
> > once we
> > > + # support sending files to Windows guests)
> > > + session.sendline("del script.au3")
> > > + file = open(kvm_utils.get_path(test.bindir, script))
> > > + for line in file.readlines():
> > > + # Insert a '^' before each character
> > > + line = "".join("^" + c for c in line.rstrip())
> > > + if line:
> > > + # Append line to the file
> > > + session.sendline("echo %s>>script.au3" % line)
> > > + file.close()
> > > +
> > > + session.read_up_to_prompt()
> > > +
> > > + command = "cmd /c %s script.au3 %s" % (binary,
> > script_params)
> >
> > Hi Michael, for the problem that execute script in Windows cmd shell,
> > I have some information share with you:
> >
> > Guys in our team had found that the value which `echo %errorlevel%`
> > returns is not always right. It just reflects whether the action to
> > execute the script has been implemented successfully and it ALWAYS
> > return
> > even if errors occur. That means as soon as the script has been
> > started
> > successfully it will return 0 even if error occurred during script
> > running.
>
> You can't issue 'echo %errorlevel%' before the command returns.
> If the command is blocking, i.e. if you have to wait for it to complete,
> like 'dir' or any typical shell command, 'echo %errorlevel%' works just
> fine and reflects the exit status of the command.
>
> If the command returns immediately, like GUI apps (calc, notepad), then
> you should run it using 'cmd /c' like the AutoIt test does.
> cmd will return only when the GUI program terminates, and then you can
> use 'echo %errorlevel%' as usual.
>
> Note that when running a command using 'cmd /c', the following
> 'echo %errorlevel%' indeed does not reflect the exact exit status of the
> command. It can only equal 0 or 1, and it seems that if the command
> exited with an exit status of 0, 'cmd /c' will return 0, and otherwise
> it will return 1. For example, if you run 'cmd /c nosuchcommand' you'll
> get 1, even though running 'nosuchcommand' alone returns 9009.
> This is good enough because we don't care about the exact exit status --
> we just want to know if the script succeeded or not.
>
> > One solution could be use command 'start /wait script.au3' which will
> > let program wait for it to terminate:
> > http://ss64.com/nt/start.html
>
> start /wait doesn't seem to work very well.
> When I run 'start /wait dir', 'dir' is executed in a new cmd window, and
> the window doesn't close until I manually close it.
> If I run 'start /wait nosuchcommand', I get a GUI error message, which
> means I can't do anything else until someone manually clicks OK in that
> error dialog.
>
> 'cmd /c' seems to work fine in all cases, and when testing the AutoIt test
> I found no problems with it.
>
> BTW, I think you should always use 'cmd /c' for GUI programs, even if they
> don't return immediately, because you might not be able to run GUI
> programs at all without it. I'm not sure why, but if you just run 'calc'
> from a remote shell (on WinXP for example), the calculator doesn't appear
> immediately (or ever, sometimes). With 'cmd /c' it always works.
Yes, that's it. Thanks so much for sharing this. :-)
>
> >
> > I have not investigated it enough as well, if any mistake made,
> > please just ignore this reply. ;-)
> >
> >
> > > +
> > > + logging.info("---------------- Script output
> > ----------------")
> > > + status = session.get_command_status(command,
> > > +
> > print_func=logging.info,
> > > + timeout=timeout)
> > > + logging.info("---------------- End of script output
> > ----------------")
> > > +
> > > + if status is None:
> > > + raise error.TestFail("Timeout expired before script
> > execution "
> > > + "completed (or something weird
> > happened)")
> > > + if status != 0:
> > > + raise error.TestFail("Script execution failed")
> > > +
> > > + finally:
> > > + session.close()
> > > --
> > > 1.5.4.1
> > >
> > > _______________________________________________
> > > Autotest mailing list
> > > [email protected]
> > > http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html