Browse Source
add test runner and automate starting of the various Murmur versions
Natenom/support-murmur-13-1446181288462
add test runner and automate starting of the various Murmur versions
Natenom/support-murmur-13-1446181288462
Michael Ziegler
15 years ago
3 changed files with 181 additions and 0 deletions
@ -0,0 +1,128 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
""" |
|||
* Copyright (C) 2009, Michael "Svedrin" Ziegler <diese-addy@funzt-halt.net> |
|||
* |
|||
* Mumble-Django is free software; you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation; either version 2 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This package is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
""" |
|||
|
|||
import os, subprocess, signal |
|||
from os.path import join, exists |
|||
from shutil import copyfile |
|||
|
|||
from django.conf import settings |
|||
|
|||
|
|||
def get_available_versions(): |
|||
""" Return murmur versions installed inside the LAB_DIR. """ |
|||
dirs = os.listdir( settings.TEST_MURMUR_LAB_DIR ); |
|||
dirs.sort(); |
|||
return dirs; |
|||
|
|||
|
|||
def run_callback( version, callback, *args, **kwargs ): |
|||
""" Initialize the database and run murmur, then call the callback. |
|||
After the callback has returned, kill murmur. |
|||
|
|||
The callback will be passed the Popen object that wraps murmur, |
|||
and any arguments that were passed to run_callback. |
|||
|
|||
If the callback raises an exception, murmur will still be properly |
|||
shutdown and the exception will be reraised. |
|||
|
|||
The callback can either return an arbitrary value, or a tuple. |
|||
If it returns a tuple, it must be of the form: |
|||
|
|||
( <any> intended_return_value, <bool> call_update_dbase ) |
|||
|
|||
That means: If the second value evaluates to True, update_dbase |
|||
will be called; the first value will be returned by run_callback. |
|||
|
|||
If the callback returns anything other than a tuple, that value |
|||
will be returned directly. |
|||
|
|||
So, If run_callback should return a tuple, you will need to return |
|||
the tuple form mentioned above in the callback, and put your tuple |
|||
into the first parameter. |
|||
""" |
|||
|
|||
murmur_root = join( settings.TEST_MURMUR_LAB_DIR, version ); |
|||
if not exists( murmur_root ): |
|||
raise EnvironmentError( "This version could not be found: '%s' does not exist!" % murmur_root ); |
|||
|
|||
init_dbase( version ); |
|||
|
|||
process = run_murmur( version ); |
|||
|
|||
try: |
|||
result = callback( process, *args, **kwargs ); |
|||
except Exception, err: |
|||
raise err; |
|||
else: |
|||
if type(result) == tuple: |
|||
if result[1]: |
|||
update_dbase( version ); |
|||
return result[0]; |
|||
else: |
|||
return result; |
|||
finally: |
|||
kill_murmur( process ); |
|||
|
|||
|
|||
def init_dbase( version ): |
|||
""" Initialize Murmur's database by copying the one from FILES_DIR. """ |
|||
dbasefile = join( settings.TEST_MURMUR_FILES_DIR, "murmur-%s.db3" % version ); |
|||
if not exists( dbasefile ): |
|||
raise EnvironmentError( "This version could not be found: '%s' does not exist!" % dbasefile ); |
|||
murmurfile = join( settings.TEST_MURMUR_LAB_DIR, version, "murmur.sqlite" ); |
|||
copyfile( dbasefile, murmurfile ); |
|||
|
|||
|
|||
def update_dbase( version ): |
|||
""" Copy Murmur's database to FILES_DIR (the inverse of init_dbase). """ |
|||
murmurfile = join( settings.TEST_MURMUR_LAB_DIR, version, "murmur.sqlite" ); |
|||
if not exists( murmurfile ): |
|||
raise EnvironmentError( "Murmur's database could not be found: '%s' does not exist!" % murmurfile ); |
|||
dbasefile = join( settings.TEST_MURMUR_FILES_DIR, "murmur-%s.db3" % version ); |
|||
copyfile( dbasefile, target ); |
|||
|
|||
|
|||
def run_murmur( version ): |
|||
""" Run the given Murmur version as a subprocess. |
|||
|
|||
Either returns a Popen object or raises an EnvironmentError. |
|||
""" |
|||
|
|||
murmur_root = join( settings.TEST_MURMUR_LAB_DIR, version ); |
|||
if not exists( murmur_root ): |
|||
raise EnvironmentError( "This version could not be found: '%s' does not exist!" % murmur_root ); |
|||
|
|||
binary_candidates = ( 'murmur.64', 'murmur.x86', 'murmurd' ); |
|||
|
|||
files = os.listdir( murmur_root ); |
|||
|
|||
for binname in binary_candidates: |
|||
if exists( join( murmur_root, binname ) ): |
|||
process = subprocess.Popen( |
|||
( join( murmur_root, binname ), '-fg' ), |
|||
stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, |
|||
cwd=murmur_root |
|||
); |
|||
return process; |
|||
|
|||
raise EnvironmentError( "Murmur binary not found. (Tried %s)" % unicode(binary_candidates) ); |
|||
|
|||
|
|||
def kill_murmur( process ): |
|||
""" Send a sigterm to the given process. """ |
|||
return os.kill( process.pid, signal.SIGTERM ); |
|||
|
|||
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue