working on test scripts

svn path=/trunk/boinc/; revision=1580
This commit is contained in:
Karl Chen 2003-06-24 21:06:32 +00:00
parent d4e945d66d
commit 07abeee9b5
6 changed files with 82 additions and 65 deletions

View File

@ -171,6 +171,11 @@ def create_keys():
_gen_key('upload') _gen_key('upload')
_gen_key('code_sign') _gen_key('code_sign')
def get_int(s):
'''Convert a string to an int; return 0 on error.'''
try: return int(sys.argv[1])
except: return 0
def unique(list): def unique(list):
d = {} d = {}
for i in list: for i in list:
@ -225,6 +230,14 @@ def _db_query(db, query):
result = db.use_result() result = db.use_result()
return result and result.fetch_row(0,1) return result and result.fetch_row(0,1)
def num_results(db, q=""):
return _db_query(db, "select count(*) from result "+q)[0]['count(*)']
def num_wus_left(db):
return num_results(db, "where server_state=%d"%RESULT_SERVER_STATE_UNSENT)
def num_results_done(db):
return num_results(db, "where server_state=%d"%RESULT_SERVER_STATE_OVER)
class Platform: class Platform:
def __init__(self, name, user_friendly_name=None): def __init__(self, name, user_friendly_name=None):
self.name = name self.name = name
@ -251,16 +264,35 @@ class AppVersion:
self.version = 1 self.version = 1
self.platform = Platform(PLATFORM) self.platform = Platform(PLATFORM)
class ProjectList(list):
def run(self): map(lambda i: i.run(), self)
def check(self): map(lambda i: i.check(), self)
def stop(self): map(lambda i: i.stop(), self)
def open_dbs(self):
self.dbs = map(lambda i: i.db_open(), self)
def progress(self):
s = "Running core client - results [done/total]:"
for db in self.dbs:
s += " [%d/%d]" % (num_results_done(db), num_results(db))
return s
all_projects = ProjectList()
class Project: class Project:
def __init__(self, works, users=None, hosts=None, def __init__(self, works, users=None, hosts=None,
short_name=None, long_name=None, core_versions=None, short_name=None, long_name=None, core_versions=None,
apps=None, app_versions=None, appname=None): apps=None, app_versions=None, appname=None,
resource_share=1,
add_to_list=True):
if add_to_list:
all_projects.append(self)
self.short_name = short_name or 'test_'+appname self.short_name = short_name or 'test_'+appname
self.long_name = long_name or 'Project ' + self.short_name.replace('_',' ').capitalize() self.long_name = long_name or 'Project ' + self.short_name.replace('_',' ').capitalize()
self.db_passwd = '' self.db_passwd = ''
self.generate_keys = False self.generate_keys = False
self.shmem_key = generate_shmem_key() self.shmem_key = generate_shmem_key()
self.resource_share = 1 self.resource_share = resource_share
self.output_level = 3 self.output_level = 3
self.master_url = os.path.join(HTML_URL , self.short_name , '') self.master_url = os.path.join(HTML_URL , self.short_name , '')
@ -637,11 +669,6 @@ class Project:
if len(rows) != ntarget: if len(rows) != ntarget:
error("expected %d results, but found %d" % (ntarget, len(rows))) error("expected %d results, but found %d" % (ntarget, len(rows)))
def num_wus_left(self, db):
return _db_query(db, "select count(*) from result where server_state=%d"%RESULT_SERVER_STATE_UNSENT)[0]['count(*)']
def num_results_done(self, db):
return _db_query(db, "select count(*) from result where server_state=%d"%RESULT_SERVER_STATE_OVER)[0]['count(*)']
def check_files_match(self, result, correct, count=None): def check_files_match(self, result, correct, count=None):
'''if COUNT is specified then [0,COUNT) is mapped onto the %d in RESULT''' '''if COUNT is specified then [0,COUNT) is mapped onto the %d in RESULT'''
if count != None: if count != None:
@ -675,8 +702,15 @@ class User:
self.project_prefs = None self.project_prefs = None
self.global_prefs = None self.global_prefs = None
class HostList(list):
def run(self): map(lambda i: i.run(), self)
all_hosts = HostList()
class Host: class Host:
def __init__(self): def __init__(self, add_to_list=True):
if add_to_list:
all_hosts.append(self)
self.name = 'Commodore64' self.name = 'Commodore64'
self.users = [] self.users = []
self.projects = [] self.projects = []
@ -792,6 +826,29 @@ class Work:
run_tool(cmd) run_tool(cmd)
class ResultMeter:
def __init__(self, func, args=[], delay=.1):
'''Forks to print a progress meter'''
self.pid = os.fork()
if self.pid:
return
while True:
verbose_echo(1, apply(func, args))
time.sleep(delay)
def stop(self):
if self.pid:
os.kill(self.pid, 9)
def run_check_all():
'''Run all projects, run all hosts, check all projects, stop all projects.'''
all_projects.run()
all_projects.open_dbs() # for progress meter
rm = ResultMeter(all_projects.progress)
all_hosts.run()
rm.stop()
all_projects.check()
all_projects.stop()
proxy_pid = 0 proxy_pid = 0
def start_proxy(code): def start_proxy(code):
global proxy_pid global proxy_pid

View File

@ -1,4 +1,4 @@
# Generated by db_def_to_py on Wed Jun 18 19:09:35 PDT 2003 # Generated by db_def_to_py on Mon Jun 23 17:26:10 PDT 2003
MAX_BLOB_SIZE = 4096 MAX_BLOB_SIZE = 4096
TEAM_TYPE_CLUB = 1 TEAM_TYPE_CLUB = 1
TEAM_TYPE_COMPANY = 2 TEAM_TYPE_COMPANY = 2

View File

@ -11,18 +11,10 @@ from test_uc import *
if __name__ == '__main__': if __name__ == '__main__':
test_msg("multiple projects with resource share"); test_msg("multiple projects with resource share");
# create two projects with the same host/user
host = Host() host = Host()
user = UserUC() user = UserUC()
projects = []
for i in range(2): for i in range(2):
project = ProjectUC(users=[user], hosts=[host], ProjectUC(users=[user], hosts=[host], redundancy=5,
short_name="test_1sec_%d"%i, short_name="test_1sec_%d"%i, resource_share=[1, 5][i])
redundancy=5) run_check_all()
project.resource_share = [1, 5][i]
projects.append(project)
project.run()
host.run()
for project in projects:
project.check()
project.stop()

View File

@ -17,7 +17,6 @@ class ProjectBackend(ProjectUC):
ProjectUC.__init__(self, redundancy = 5, short_name = 'test_backend') ProjectUC.__init__(self, redundancy = 5, short_name = 'test_backend')
def run(self): def run(self):
self.install() self.install()
self.install_make_work(work=self.work, cushion=self.num-1, redundancy=5) self.install_make_work(work=self.work, cushion=self.num-1, redundancy=5)
self.start_servers() self.start_servers()
@ -25,7 +24,7 @@ class ProjectBackend(ProjectUC):
n = 0 n = 0
db = self.db_open() db = self.db_open()
while n < self.num: while n < self.num:
n = self.num_wus_left(db) n = num_wus_left(db)
verbose_echo(1, "Generating results [%d/%d]" % (n,self.num)); verbose_echo(1, "Generating results [%d/%d]" % (n,self.num));
time.sleep(.1) time.sleep(.1)
db.close() db.close()
@ -47,22 +46,6 @@ class ProjectBackend(ProjectUC):
time.sleep(1) time.sleep(1)
self.start_servers() self.start_servers()
rpm_pid = None
def fork_result_progress_meter(self, msg):
pid = os.fork()
if pid:
self.rpm_pid = pid
return
db = self.db_open()
while True:
n = self.num_results_done(db)
verbose_echo(1, msg+" [%d/%d]"%(n,self.num))
time.sleep(.1)
def stop_result_progress_meter(self):
if self.rpm_pid:
os.kill(self.rpm_pid, 9)
def check(self): def check(self):
# Give the server 30 seconds to finish assimilating/deleting # Give the server 30 seconds to finish assimilating/deleting
# TODO: use wait on all processes. # TODO: use wait on all processes.
@ -71,15 +54,5 @@ class ProjectBackend(ProjectUC):
if __name__ == '__main__': if __name__ == '__main__':
test_msg("entire backend"); test_msg("entire backend");
ProjectBackend(sys.argv[1:] and get_int(sys.argv[1]) or 100)
num = 100 run_check_all()
try: num = int(sys.argv[1])
except: pass
project = ProjectBackend(num)
project.run()
project.fork_result_progress_meter("Running core client - results done: ")
project.host.run()
project.stop_result_progress_meter()
project.check()
project.stop()

View File

@ -41,9 +41,5 @@ class ProjectConcat(Project):
if __name__ == '__main__': if __name__ == '__main__':
test_msg("standard concat application"); test_msg("standard concat application");
ProjectConcat()
project = ProjectConcat() run_check_all()
project.run()
project.host.run()
project.check()
project.stop()

View File

@ -41,16 +41,19 @@ APP: upper_case: argv[0] is upper_case
APP: upper_case ending, wrote """) APP: upper_case ending, wrote """)
# self.exit_status = 0 # self.exit_status = 0
class ProjectUC(Project): class ProjectUC(Project):
def __init__(self, works=None, users=None, hosts=None, def __init__(self, works=None, users=None, hosts=None,
short_name=None, long_name=None, short_name=None, long_name=None,
redundancy=2): redundancy=2, resource_share=1):
Project.__init__(self, Project.__init__(self,
appname = 'upper_case', appname = 'upper_case',
works = works or [WorkUC(redundancy=redundancy)], works = works or [WorkUC(redundancy=redundancy)],
users = users or [UserUC()], users = users or [UserUC()],
hosts = hosts, hosts = hosts,
short_name=short_name, long_name=long_name) short_name=short_name, long_name=long_name,
resource_share=resource_share
)
def check(self): def check(self):
redundancy = self.work.redundancy redundancy = self.work.redundancy
@ -69,9 +72,5 @@ class ProjectUC(Project):
if __name__ == '__main__': if __name__ == '__main__':
test_msg("standard upper_case application"); test_msg("standard upper_case application");
ProjectUC()
project = ProjectUC() run_check_all()
project.run()
project.host.run()
project.check()
project.stop()