2012/4/17 Krzesimir Nowak <[email protected]>:
> 2012/4/16 Patrick Ohly <[email protected]>:
>> On Fri, 2012-04-13 at 15:28 +0200, Patrick Ohly wrote:
>>> This is just a quick-and-dirty solution, not committed anywhere. Shall I
>>> do the base work for a few tests and then let you continue with adding
>>> the rest?
>>
>> Below are the commits, already merged into master after a quick test
>> run:
>> http://syncev.meego.com/2012-04-16-12-37_lucid-amd64_prebuilt-amd64_testing_dbus/
>>
>> I started with your initial commit and then included the changes that we
>> were discussing, plus a fix for a failure still visible in that test
>> run.
>>
>> The reason is that your scanFiles() implementation is slightly different
>> from the C++ version. In contrast to the C++ version it includes lines
>> like:
>>
>> sources/addressbook/config.ini:#  ActiveSync Address Book = eas-contacts
>> sources/addressbook/config.ini:#  ActiveSync Events = eas-events
>> sources/addressbook/config.ini:#  ActiveSync Todos = eas-todos
>> sources/addressbook/config.ini:#  ActiveSync Memos = eas-memos
>>
>> These need to be excluded by the comparison because these comments can
>> change, depending on how the binaries were compiled or run. Your
>> reference text in the ScheduleWorld config includes one particular
>> variation and therefore it worked for me when testing manually, but the
>> nightly testing differs.
>>
>> A good test for the assertEqualDiff() :-) See:
>>
>> http://syncev.meego.com/2012-04-16-12-37_lucid-amd64_prebuilt-amd64_testing_dbus/testing-amd64/7-dbus/Cmdline_SetupScheduleWorld.log.html
>>
>> With everything in place, do you still want to convert some more tests?
>>
>> I think one commit per converted test would be good, with C++ removed
>> and Python added in the same test. I expect that most tests can and
>> should be moved. The only reason for keeping a test in the C++ code
>> would be if it explicitly tests some aspect that cannot be tested when
>> going through D-Bus - not sure whether there is any such case.
>>
>>
>> commit 2925b97bac45ae4dc4dac92b04b91683cad29ddc
>> Author: Krzesimir Nowak <[email protected]>
>> Date:   Thu Apr 12 15:45:02 2012 +0200
>>
>>    D-Bus Testing: add Cmdline tests framework
>>
>>    This is a translation of the corresponding C++ TestCmdline from
>>    Cmdline.cpp into Python.
>>
>> commit aa562e5ef97eba78b7c45ab095df5071134840dc
>> Author: Patrick Ohly <[email protected]>
>> Date:   Mon Apr 16 09:56:50 2012 +0200
>>
>>    D-Bus Testing: added assertEqualDiff()
>>
>>    Replaces the diffStrings() from the previous commit. Renamed it
>>    because it really is specifying an assertion and moved it to
>>    DBusUtil because it may be useful outside of the command line
>>    testing.
>>
>>    Also made sure that the diff is part of the assertion because then it
>>    will be repeated when listing the failure.
>>
>> commit 5389b8eeeddc328e29a86c91aec8606ac3fb9741
>> Author: Patrick Ohly <[email protected]>
>> Date:   Mon Apr 16 10:54:52 2012 +0200
>>
>>    D-Bus Testing: ensure that we have assertRegexpMatches()
>>
>>    unittest.assertRegexpMatches() is very useful for command line
>>    output testing. But it is not yet available in Ubuntu Lucid,
>>    the current base line for SyncEvolution releases. Therefore
>>    provide a fallback implementation.
>>
>> commit 0e63bc8e59b53a8821beff9f29d061cae48a66fc
>> Author: Patrick Ohly <[email protected]>
>> Date:   Mon Apr 16 17:26:12 2012 +0200
>>
>>    D-Bus Testing: fixed scanFiles()
>>
>>    The function must return all property assignments, including those
>>    which are commented out. The Python version accidentally included some
>>    comment lines which looked like assignments, partly because it ignored
>>    leading spaces, partly because it looked anywhere in the line for an
>>    equal sign.
>>
>>    Fixed by using a regex for the matching.
>>
>> commit 67ce74b57fcb51f57b8cf29e353e13da16d60b8b
>> Author: Patrick Ohly <[email protected]>
>> Date:   Mon Apr 16 12:13:14 2012 +0200
>>
>>    D-Bus Testing: eliminate TestCmdline.testdir
>>
>>    All D-Bus tests already have their private xdg_root = 'temp-test-dbus'
>>    which is cleared before running each test. Use it also for TestCmdline
>>    instead of creating our own temporary directory, for the sake of
>>    consistency.
>>
>>    Another advantage is that the syncevo-dbus-server is running with that
>>    same XDG root and reading/writing files in it automatically. The
>>    command line client currently *does* send its XDG env variables and
>>    the server uses them, but perhaps that feature will have to be
>>    removed, because it has a design mistake (*), so don't depend on it.
>>
>>    (*) If different clients and the auto-syncing code in the server are
>>    allowed to use different config roots, the 'config name' alone no
>>    longer is a unique identifier for configs.
>>
>> commit 7c2de4ed5199f9c971d1474595f5a04988c1eac3
>> Author: Patrick Ohly <[email protected]>
>> Date:   Mon Apr 16 12:58:52 2012 +0200
>>
>>    D-Bus Testing: added running of command line tool
>>
>>    The 'syncevolution' command line tool is started inside the same D-Bus
>>    session as the 'syncevo-dbus-server' that is started before running
>>    each test. They use the same XDG env variables.
>>
>>    The test-dbus.py script is able to watch and report all D-Bus traffic
>>    between tool and server.
>>
>>    Because tests are meant to be realistic, SYNCEVOLUTION_DEBUG has to be
>>    optional and must be turned off for all tests which test for real
>>    output as seen by users.
>>
>>    Every single invocation of runCmdline() should check stdout and
>>    stderr, to detect unexpected output. The return code is already tested
>>    by runCmdline() itself, unless explicitly turned off (may be useful for
>>    tests which expect certain kind of failures).
>>
>>    Ideally the entire string gets tested, either via an exact string
>>    comparison or a full regex match. Note that assertRegexpMatches() only
>>    does a search, so use ^ and $ to ensure full match.
>>
>>    If (and only if) the command is expected to produce output on both
>>    stdout and stderr where the order matters (for example, syncing), then
>>    stdout and stderr should be combined into one stream. Otherwise the
>>    order cannot be tested.
>>
>> commit 470f0e7d7a56b96adff21e5e918c58ee0a9e3420
>> Author: Patrick Ohly <[email protected]>
>> Date:   Mon Apr 16 13:02:23 2012 +0200
>>
>>    D-Bus Testing: added testSetupScheduleWorld
>>
>>    The test is a straight copy from Cmdline.cpp. Because the hard-coded
>>    default SSL certificate path is not known in test-dbus.py, it has to
>>    extract that string by printing a template once with the command line
>>    tool (only the command line exposes the comments, normal D-Bus API
>>    doesn't) and finding it in the output.
>>
>>    This allows copying the C++ tests without making them less strict by
>>    filtering out the SSL certificate path before the result comparisons.
>>
>> commit a27f2af580a00d81107f69bc5802c079cef23766
>> Author: Patrick Ohly <[email protected]>
>> Date:   Mon Apr 16 14:38:34 2012 +0200
>>
>>    D-Bus Testing: work around Python 2.6 subprocess bug
>>
>>    Explicitly pass an environment when running the command line
>>    tool. Otherwise subprocess.Popen() from Python 2.6 uses not
>>    os.environ (which would be okay) but rather the environment passed to
>>    a previous call to subprocess.Popen() (which will fail if the previous
>>    test ran with an environment which had SYNCEVOLUTION_DEBUG set).
>>
>
> Some nitpicks here:
>
> +        # Explicitly pass an environment. Otherwise subprocess.Popen()
> +        # from Python 2.6 uses not os.environ (which would be okay)
> +        # but rather the environment passed to a previous call to
> +        # subprocess.Popen() (which will fail if the previous test ran
> +        # with an environment which had SYNCEVOLUTION_DEBUG set).
> +        if env == None:
> +            env=os.environ
>
> 1. @property("debug", False) is not honored in runCmdline. If
> os.environ has SYNCEVOLUTION_DEBUG key then most of tests are going to
> fail, because stderr is not empty - it contains debugging information.
>
> 2. Same with "ENV" property - it is not honored. There is a test name
> testMatchTemplate which needs some different template directory
> (actually the one in test/testcases/templates). So for now the only
> way to do it is to deepcopy os.environ and set different
> SYNCEVOLUTION_TEMPLATE_DIR.
>
> You wrote at some point in this thread:
> "Regarding the environment, better refactor the code that is used for
> starting syncevo-dbus-server and use the same environment for both
> processes."
>
> Well, this clearly does not happen here. Would not it be better if
> environment used for running syncevo-dbus-server is stored in
> self.storedenv and that would be used for running syncevolution?
>
> --- a/test/test-dbus.py
> +++ b/test/test-dbus.py
> @@ -371,6 +371,7 @@ class DBusUtil(Timeout):
>     quit_events = []
>     reply = None
>     pserver = None
> +    storedenv = {}
>
>     def getTestProperty(self, key, default):
>         """retrieve values set with @property()"""
> @@ -422,6 +423,16 @@ class DBusUtil(Timeout):
>         # and increase log level
>         if self.getTestProperty("debug", True):
>             env["SYNCEVOLUTION_DEBUG"] = "1"
> +        else:
> +            # we explicitly specified @property("debug", False")
> +            # thus we do not want to have any debugging output.
> +            try:
> +                del env["SYNCEVOLUTION_DEBUG"]
> +            except KeyError:
> +                # there was no such key anyway
> +                pass
> +
> +        self.storedenv = env
>
>         # can be set by a test to run additional tests on the content
>         # of the D-Bus log
> @@ -3551,8 +3562,10 @@ class TestCmdline(unittest.TestCase, DBusUtil):
>         # but rather the environment passed to a previous call to
>         # subprocess.Popen() (which will fail if the previous test ran
>         # with an environment which had SYNCEVOLUTION_DEBUG set).
> +        cmdline_env = copy.deepcopy(self.storedenv)
>         if env == None:
> -            env=os.environ
> +            env={}
> +        cmdline_env.update(env)
>         if preserveOutputOrder:
>             s = subprocess.Popen(a, stdout=subprocess.PIPE,
> stderr=subprocess.STDOUT,
>                                  env=env)
>

Eh, should be:

--- a/test/test-dbus.py
+++ b/test/test-dbus.py
@@ -371,6 +371,7 @@ class DBusUtil(Timeout):
    quit_events = []
    reply = None
    pserver = None
+    storedenv = {}

    def getTestProperty(self, key, default):
        """retrieve values set with @property()"""
@@ -422,6 +423,16 @@ class DBusUtil(Timeout):
        # and increase log level
        if self.getTestProperty("debug", True):
            env["SYNCEVOLUTION_DEBUG"] = "1"
+        else:
+            # we explicitly specified @property("debug", False")
+            # thus we do not want to have any debugging output.
+            try:
+                del env["SYNCEVOLUTION_DEBUG"]
+            except KeyError:
+                # there was no such key anyway
+                pass
+
+        self.storedenv = env

        # can be set by a test to run additional tests on the content
        # of the D-Bus log
@@ -3551,14 +3562,16 @@ class TestCmdline(unittest.TestCase, DBusUtil):
         # but rather the environment passed to a previous call to
         # subprocess.Popen() (which will fail if the previous test ran
         # with an environment which had SYNCEVOLUTION_DEBUG set).
+        cmdline_env = copy.deepcopy(self.storedenv)
         if env == None:
-            env=os.environ
+            env = {}
+        cmdline_env.update(env)
         if preserveOutputOrder:
             s = subprocess.Popen(a, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
-                                 env=env)
+                                 env=cmdline_env)
         else:
             s = subprocess.Popen(a, stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
-                                 env=env)
+                                 env=cmdline_env)
         out, err = s.communicate()
         if expectSuccess and s.returncode != 0:
             result = 'syncevolution command failed.\nOutput:\n%s' % out


>
>> --
>> Best Regards, Patrick Ohly
>>
>> The content of this message is my personal opinion only and although
>> I am an employee of Intel, the statements I make here in no way
>> represent Intel's position on the issue, nor am I authorized to speak
>> on behalf of Intel on this matter.
>>
>>
_______________________________________________
SyncEvolution mailing list
[email protected]
http://lists.syncevolution.org/listinfo/syncevolution

Reply via email to