On Thu, Apr 7, 2011 at 11:25 PM, Gregory P. Smith <g...@google.com> wrote:

>
> On Thu, Apr 7, 2011 at 10:08 PM, Lucas Meneghel Rodrigues 
> <l...@redhat.com>wrote:
>
>> For the KVM test, we have for a long time a system of
>> 'test dependencies': If a dependency test, such as guest
>> installation has failed, it is not possible to run subsequent
>> tests for obvious reasons. There are minor failures though,
>> that don't necessarily block other tests, such as some specific
>> types of image problems found on a guest after the routine check.
>>
>> However, job.run_test() returns a boolean, making it not possible
>> to fail a test, so we are not ignoring problems, and at the same
>> time, execute dependent tests, because the failure was deemed to
>> be non-fatal. Therefore, introduce and additional method,
>> job.run_test_detail(), that returns the test status (see all
>> possible statuses on client/common_lib/error.py), rather than
>> a boolean. With this finer grained control, we can implement the
>> kvm subtest dependency system in a better way.
>>
>> Strategy: refactor the run_test method into _run_test_base
>> and creating the 2 implementations, run_test, and
>> run_test_detail in terms of _run_test_base.
>>
>> Risk: High (touches a very very visible test writer API)
>> Tests executed: run_test continues to work, run_test_detail
>> provides the correct return codes and change does not break
>> job_unittest.
>>
>
> This makes sense and seems like a reasonable approach.  Just looking at the
> diff I don't see any problems with it.
>
>
I agree that it seems reasonable. It's a bit ugly to have to add a new
method just to return more information than run_test does; but return values
aren't really extensible in a backwards compatible way.

An alternative would be to allow run_test to take an (optional) parameter
where the caller could pass in a dictionary to be populated with additional
info like the resulting test status. Perhaps that's a cure worse than the
disease. :) I don't see a big problem with the run_test_detail design, I
just thought I'd throw a different suggestion out there.

I do think that any API extension like this should be done for server jobs
as well, though. It's unfortunate that it still requires updating both
client/bin/job.py and server/server_job.py, but the run_* methods never
really made it up into the base_job class.

-- John


> a Python style nit though:
>
> +        (subdir, testname, group_func, timeout) = self._run_test_base(url,
> +
>  *args,
> +
>  **dargs)
>
> reads easier as:
>
> +        subdir, testname, group_func, timeout = self._run_test_base(
> +                url, *args, **dargs)
>
> to me.
>
> -Greg
>
>
>> Signed-off-by: Lucas Meneghel Rodrigues <l...@redhat.com>
>> ---
>>  client/bin/job.py |   54
>> +++++++++++++++++++++++++++++++++++++++++++++++++---
>>  1 files changed, 50 insertions(+), 4 deletions(-)
>>
>> diff --git a/client/bin/job.py b/client/bin/job.py
>> index 97412c0..9effcdb 100644
>> --- a/client/bin/job.py
>> +++ b/client/bin/job.py
>> @@ -539,10 +539,9 @@ class base_client_job(base_job.base_job):
>>             raise error.UnhandledTestError(e)
>>
>>
>> -    @_run_test_complete_on_exit
>> -    def run_test(self, url, *args, **dargs):
>> +    def _run_test_base(self, url, *args, **dargs):
>>         """
>> -        Summon a test object and run it.
>> +        Prepares arguments and run functions to run_test and
>> run_test_detail.
>>
>>         @param url A url that identifies the test to run.
>>         @param tag An optional keyword argument that will be added to the
>> @@ -550,7 +549,11 @@ class base_client_job(base_job.base_job):
>>         @param subdir_tag An optional keyword argument that will be added
>>             to the subdir name.
>>
>> -        @returns True if the test passes, False otherwise.
>> +        @returns:
>> +                subdir: Test subdirectory
>> +                testname: Test name
>> +                group_func: Actual test run function
>> +                timeout: Test timeout
>>         """
>>         group, testname = self.pkgmgr.get_package_name(url, 'test')
>>         testname, subdir, tag = self._build_tagged_test_name(testname,
>> dargs)
>> @@ -573,6 +576,25 @@ class base_client_job(base_job.base_job):
>>             else:
>>                 self.record('GOOD', subdir, testname, 'completed
>> successfully')
>>
>> +        return (subdir, testname, group_func, timeout)
>> +
>> +
>> +    @_run_test_complete_on_exit
>> +    def run_test(self, url, *args, **dargs):
>> +        """
>> +        Summon a test object and run it.
>> +
>> +        @param url A url that identifies the test to run.
>> +        @param tag An optional keyword argument that will be added to the
>> +            test and subdir name.
>> +        @param subdir_tag An optional keyword argument that will be added
>> +            to the subdir name.
>> +
>> +        @returns True if the test passes, False otherwise.
>> +        """
>> +        (subdir, testname, group_func, timeout) =
>> self._run_test_base(url,
>> +
>>  *args,
>> +
>>  **dargs)
>>         try:
>>             self._rungroup(subdir, testname, group_func, timeout)
>>             return True
>> @@ -585,6 +607,30 @@ class base_client_job(base_job.base_job):
>>         # UnhandledTestError that is caught above.
>>
>>
>> +    @_run_test_complete_on_exit
>> +    def run_test_detail(self, url, *args, **dargs):
>> +        """
>> +        Summon a test object and run it, returning test status.
>> +
>> +        @param url A url that identifies the test to run.
>> +        @param tag An optional keyword argument that will be added to the
>> +            test and subdir name.
>> +        @param subdir_tag An optional keyword argument that will be added
>> +            to the subdir name.
>> +
>> +        @returns Test status
>> +        @see: client/common_lib/error.py, exit_status
>> +        """
>> +        (subdir, testname, group_func, timeout) =
>> self._run_test_base(url,
>> +
>>  *args,
>> +
>>  **dargs)
>> +        try:
>> +            self._rungroup(subdir, testname, group_func, timeout)
>> +            return 'GOOD'
>> +        except error.TestBaseException, detail:
>> +            return detail.exit_status
>> +
>> +
>>     def _rungroup(self, subdir, testname, function, timeout, *args,
>> **dargs):
>>         """\
>>         subdir:
>> --
>> 1.7.4.2
>>
>> _______________________________________________
>> Autotest mailing list
>> Autotest@test.kernel.org
>> http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
>>
>
>
> _______________________________________________
> Autotest mailing list
> Autotest@test.kernel.org
> http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
>
>
_______________________________________________
Autotest mailing list
Autotest@test.kernel.org
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to