summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMartin Pitt <martinpitt@gnome.org>2013-01-22 08:09:34 +0100
committerMartin Pitt <martinpitt@gnome.org>2013-01-22 11:22:08 +0100
commit2df109a6a460b1a17813e544c3c0a85b4aaf4baf (patch)
tree96006e9000baee02c06cfb26fbd0fd755805966f /tests
parent9e25b69ffeafedeef4dc9ad9a1dd65fdf92a2161 (diff)
downloadgnome-settings-daemon-2df109a6a460b1a17813e544c3c0a85b4aaf4baf.tar.gz
tests: Run under X.org with dummy driver
Run a private X.org instance with the dummy driver for the tests. The dummy driver supports basic XRandR, but no DPMS, which is good enough at least for testing most of "power", "keyboard", "multimedia", and others. This is necessary until Xvfb supports XRandR, which was proposed in <http://lists.x.org/archives/xorg-devel/2013-January/035114.html>. This makes the tests insensitive against input events from the real X.org which happen during the tests, and also allows us to run the tests in headless CI server environments. Some distros like Fedora install Xorg as suid root, so copy the binary into our temporary workdir to drop the suid bit and run it as user.
Diffstat (limited to 'tests')
-rw-r--r--tests/gsdtestcase.py53
-rw-r--r--tests/xorg-dummy.conf4
2 files changed, 57 insertions, 0 deletions
diff --git a/tests/gsdtestcase.py b/tests/gsdtestcase.py
index 1e4ae2a1..e98b0363 100644
--- a/tests/gsdtestcase.py
+++ b/tests/gsdtestcase.py
@@ -56,6 +56,11 @@ class GSDTestCase(dbusmock.DBusTestCase):
os.environ['LC_MESSAGES'] = 'C'
klass.workdir = tempfile.mkdtemp(prefix='gsd-power-test')
+ # start X.org server with dummy driver; this is needed until Xvfb
+ # supports XRandR:
+ # http://lists.x.org/archives/xorg-devel/2013-January/035114.html
+ klass.start_xorg()
+
# tell dconf and friends to use our config/runtime directories
os.environ['XDG_CONFIG_HOME'] = os.path.join(klass.workdir, 'config')
os.environ['XDG_DATA_HOME'] = os.path.join(klass.workdir, 'data')
@@ -84,6 +89,7 @@ class GSDTestCase(dbusmock.DBusTestCase):
klass.p_notify.wait()
klass.stop_session()
dbusmock.DBusTestCase.tearDownClass()
+ klass.stop_xorg()
shutil.rmtree(klass.workdir)
def run(self, result=None):
@@ -183,6 +189,53 @@ class GSDTestCase(dbusmock.DBusTestCase):
self.logind.wait()
@classmethod
+ def start_xorg(klass):
+ '''start X.org server with dummy driver'''
+
+ conf = os.path.join(os.path.dirname(__file__), 'xorg-dummy.conf')
+
+ # some distros like Fedora install Xorg as suid root; copy it into our
+ # workdir to drop the suid bit and run it as user
+ which = subprocess.Popen(['which', 'Xorg'], stdout=subprocess.PIPE)
+ out = which.communicate()[0].strip()
+ if which.returncode != 0 or not out:
+ sys.stderr.write('ERROR: Xorg not installed\n')
+ sys.exit(1)
+ xorg = os.path.join(klass.workdir, 'Xorg')
+ shutil.copy(out, xorg)
+
+ # You can rename the log file to *.log if you want to see it on test
+ # case failures
+ log = os.path.join(klass.workdir, 'Xorg.out')
+ klass.xorg = subprocess.Popen([xorg, '-config', conf, '-logfile', log, ':99'],
+ stderr=subprocess.PIPE)
+ os.environ['DISPLAY'] = ':99'
+
+ # wait until the server is ready
+ timeout = 50
+ while timeout > 0:
+ time.sleep(0.1)
+ timeout -= 1
+ if klass.xorg.poll():
+ # ended prematurely
+ timeout = -1
+ break
+ if subprocess.call(['xprop', '-root'], stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE) == 0:
+ break
+ if timeout <= 0:
+ with open(log) as f:
+ sys.stderr.write('Cannot start X.org with dummy driver. Log:\n%s\n--------' % f.read())
+ sys.exit(1)
+
+ @classmethod
+ def stop_xorg(klass):
+ '''stop X.org server with dummy driver'''
+
+ klass.xorg.terminate()
+ klass.xorg.wait()
+
+ @classmethod
def reset_idle_timer(klass):
'''trigger activity to reset idle timer'''
diff --git a/tests/xorg-dummy.conf b/tests/xorg-dummy.conf
new file mode 100644
index 00000000..0fc61880
--- /dev/null
+++ b/tests/xorg-dummy.conf
@@ -0,0 +1,4 @@
+Section "Device"
+ Identifier "test"
+ Driver "dummy"
+EndSection