Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Narvaez <dwnarvaez@gmail.com>2012-11-07 13:25:39 (GMT)
committer Daniel Narvaez <dwnarvaez@gmail.com>2012-11-07 13:25:39 (GMT)
commit3eb071ea41d7f064fb92ce76c865d99d3cb55fdd (patch)
treea87b12a8c699d4133d1e53d823e31acf4937fb8a
parent53039c331fff9aa5a8680601c3b59eddd856dade (diff)
Rework tests to be based on pyatspi only
dogtail is not packaged for ubuntu at the moment and dogtail adds another layer which can make it difficult to debug intermittent failures. We might switch back at some point but for now I think it's easier to stay lower level and try to figure out how to improve reliability there.
-rw-r--r--.gitignore1
-rw-r--r--Makefile2
-rwxr-xr-xscripts/check-system6
-rwxr-xr-xscripts/run-ui-tests (renamed from scripts/run-dogtail-tests)0
-rw-r--r--tests/shell.py52
-rw-r--r--tests/tree.py64
6 files changed, 92 insertions, 33 deletions
diff --git a/.gitignore b/.gitignore
index ed6ca46..ac6401b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
*~
+*.pyc
install/
build/
source/
diff --git a/Makefile b/Makefile
index 712e613..a50a274 100644
--- a/Makefile
+++ b/Makefile
@@ -52,7 +52,7 @@ run: x11-utils
$(SCRIPTS)/shell/start-sugar
test: x11-utils
- $(LOG) "$(SCRIPTS)/run-dogtail-tests" $(LOGFILE)
+ $(LOG) "$(SCRIPTS)/run-ui-tests" $(LOGFILE)
shell: x11-utils
@PS1="[sugar-build \W]$$ " \
diff --git a/scripts/check-system b/scripts/check-system
index 72d4041..8b01945 100755
--- a/scripts/check-system
+++ b/scripts/check-system
@@ -329,10 +329,10 @@ checks = \
"checker": "binary",
"packages": { "fedora": "dbus-x11",
"ubuntu": "dbus-x11" } },
- { "check": "import dogtail",
+ { "check": "import pyatspi",
"checker": "python",
- "packages": { "fedora": "dogtail",
- "ubuntu": "python-dogtail" } },
+ "packages": { "fedora": "pyatspi",
+ "ubuntu": "python-pyatspi2" } },
# sugar-build buildtime
diff --git a/scripts/run-dogtail-tests b/scripts/run-ui-tests
index ddf126a..ddf126a 100755
--- a/scripts/run-dogtail-tests
+++ b/scripts/run-ui-tests
diff --git a/tests/shell.py b/tests/shell.py
index ee190dd..034e316 100644
--- a/tests/shell.py
+++ b/tests/shell.py
@@ -1,21 +1,19 @@
import sys
from time import sleep
-from dogtail import tree
-from dogtail import predicate
-from dogtail import dump
+import tree
ACTIVITIES_WITH_OBJECT_CHOOSER = ["Read", "Jukebox"]
ACTIVITIES_TO_IGNORE = ["Pippy"]
def build_activities_list():
- shell = tree.root.child(name="sugar-session", roleName="application")
+ root = tree.get_root()
+ shell = root.find_child(name="sugar-session", role_name="application")
activities = []
- table = shell.child(name="", roleName="table")
- pred = predicate.GenericPredicate(roleName="table cell")
- cells = table.findChildren(pred)
+ table = shell.find_child(role_name="table")
+ cells = table.find_children(role_name="table cell")
for row in [cells[i:i+5] for i in range(0, len(cells), 5)]:
activity_name = row[2].text
@@ -27,11 +25,11 @@ def build_activities_list():
return activities
def launch_and_stop_activity(activity_name):
- shell = tree.root.child(name="sugar-session", roleName="application")
+ root = tree.get_root()
+ shell = root.find_child(name="sugar-session", role_name="application")
- table = shell.child(name="", roleName="table")
- pred = predicate.GenericPredicate(roleName="table cell")
- cells = table.findChildren(pred)
+ table = shell.find_child(role_name="table")
+ cells = table.find_children(role_name="table cell")
for row in [cells[i:i+5] for i in range(0, len(cells), 5)]:
name = row[2].name
@@ -47,26 +45,27 @@ def launch_and_stop_activity(activity_name):
print "Stopping %s" % activity_name
if activity_name in ACTIVITIES_WITH_OBJECT_CHOOSER:
- close_button = shell.child(name="Close",
- roleName="push button")
- close_button.click()
+ close_button = shell.find_child(name="Close",
+ role_name="push button")
+ close_button.do_action("click")
- activity = tree.root.child(name="sugar-activity",
- roleName="application")
+ activity = root.find_child(name="sugar-activity",
+ role_name="application")
- stop_button = activity.child(name="Stop", roleName="push button")
- stop_button.click()
+ stop_button = activity.find_child(name="Stop", role_name="push button")
+ stop_button.do_action("click")
def go_to_list_view():
- shell = tree.root.child(name="sugar-session", roleName="application")
+ root = tree.get_root()
+ shell = root.find_child(name="sugar-session", role_name="application")
- done_button = shell.child(name="Done", roleName="push button")
- done_button.click()
+ done_button = shell.find_child(name="Done", role_name="push button")
+ done_button.do_action("click")
sleep(10)
- radio_button = shell.child(name="List view", roleName="radio button")
- radio_button.click()
+ radio_button = shell.find_child(name="List view", role_name="radio button")
+ radio_button.do_action("click")
def main():
go_to_list_view()
@@ -75,9 +74,4 @@ def main():
sleep(10)
launch_and_stop_activity(activity)
-try:
- main()
-except tree.SearchError:
- print "\nDumping the accessible tree\n"
- dump.plain(tree.root)
- sys.exit(1)
+main()
diff --git a/tests/tree.py b/tests/tree.py
new file mode 100644
index 0000000..e8746e2
--- /dev/null
+++ b/tests/tree.py
@@ -0,0 +1,64 @@
+import pyatspi
+
+def get_root():
+ return Node(pyatspi.Registry.getDesktop(0))
+
+class Node:
+ def __init__(self, accessible):
+ self._accessible = accessible
+
+ def _predicate(self, accessible, name, role_name):
+ if name is not None and name != accessible.name:
+ return False
+
+ if role_name is not None and role_name != accessible.getRoleName():
+ return False
+
+ return True
+
+ def find_child(self, name=None, role_name=None):
+ def predicate(accessible):
+ return self._predicate(accessible, name, role_name)
+
+ accessible = pyatspi.findDescendant(self._accessible, predicate)
+
+ return Node(accessible)
+
+ def find_children(self, name=None, role_name=None):
+ def predicate(accessible):
+ return self._predicate(accessible, name, role_name)
+
+ all_accessibles = pyatspi.findAllDescendants(self._accessible, predicate)
+
+ return [Node(accessible) for accessible in all_accessibles]
+
+ def _dump_accessible(self, accessible, depth):
+ print "" * depth + str(accessible)
+
+ def _crawl_accessible(self, accessible, depth):
+ self._dump_accessible(accessible, depth)
+
+ for child in self.find_children():
+ self._crawl_accessible(child, depth + 1)
+
+ def dump(self):
+ self._crawl_accessible(self._accessible, 0)
+
+ def do_action(self, name):
+ action = self._accessible.queryAction()
+ for i in range(action.nActions):
+ if action.getName(i) == name:
+ action.doAction(i)
+
+ def click(self, button=1):
+ component = self._accessible.queryComponent()
+ x, y = component.getPosition(pyatspi.DESKTOP_COORDS)
+ pyatspi.Registry.generateMouseEvent(x, y, "b%sc" % button)
+
+ @property
+ def name(self):
+ return self._accessible.name
+
+ @property
+ def text(self):
+ return self._accessible.queryText().getText(0, -1)