From 07abeee9b558125c0585c6f03a867eedebb09c93 Mon Sep 17 00:00:00 2001 From: Karl Chen Date: Tue, 24 Jun 2003 21:06:32 +0000 Subject: [PATCH] working on test scripts svn path=/trunk/boinc/; revision=1580 --- test/boinc.py | 73 +++++++++++++++++++++++++++++++++++++++----- test/boinc_db.py | 2 +- test/test_1sec.py | 16 +++------- test/test_backend.py | 33 ++------------------ test/test_concat.py | 8 ++--- test/test_uc.py | 15 +++++---- 6 files changed, 82 insertions(+), 65 deletions(-) diff --git a/test/boinc.py b/test/boinc.py index 1431a53eb0..4a9e8bd7b1 100644 --- a/test/boinc.py +++ b/test/boinc.py @@ -171,6 +171,11 @@ def create_keys(): _gen_key('upload') _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): d = {} for i in list: @@ -225,6 +230,14 @@ def _db_query(db, query): result = db.use_result() 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: def __init__(self, name, user_friendly_name=None): self.name = name @@ -251,16 +264,35 @@ class AppVersion: self.version = 1 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: def __init__(self, works, users=None, hosts=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.long_name = long_name or 'Project ' + self.short_name.replace('_',' ').capitalize() self.db_passwd = '' self.generate_keys = False self.shmem_key = generate_shmem_key() - self.resource_share = 1 + self.resource_share = resource_share self.output_level = 3 self.master_url = os.path.join(HTML_URL , self.short_name , '') @@ -637,11 +669,6 @@ class Project: if len(rows) != ntarget: 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): '''if COUNT is specified then [0,COUNT) is mapped onto the %d in RESULT''' if count != None: @@ -675,8 +702,15 @@ class User: self.project_prefs = None self.global_prefs = None +class HostList(list): + def run(self): map(lambda i: i.run(), self) + +all_hosts = HostList() + class Host: - def __init__(self): + def __init__(self, add_to_list=True): + if add_to_list: + all_hosts.append(self) self.name = 'Commodore64' self.users = [] self.projects = [] @@ -792,6 +826,29 @@ class Work: 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 def start_proxy(code): global proxy_pid diff --git a/test/boinc_db.py b/test/boinc_db.py index 46a45312a8..fc9ac13b34 100644 --- a/test/boinc_db.py +++ b/test/boinc_db.py @@ -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 TEAM_TYPE_CLUB = 1 TEAM_TYPE_COMPANY = 2 diff --git a/test/test_1sec.py b/test/test_1sec.py index 191d3140fc..d09f77aa7b 100755 --- a/test/test_1sec.py +++ b/test/test_1sec.py @@ -11,18 +11,10 @@ from test_uc import * if __name__ == '__main__': test_msg("multiple projects with resource share"); - + # create two projects with the same host/user host = Host() user = UserUC() - projects = [] for i in range(2): - project = ProjectUC(users=[user], hosts=[host], - short_name="test_1sec_%d"%i, - redundancy=5) - project.resource_share = [1, 5][i] - projects.append(project) - project.run() - host.run() - for project in projects: - project.check() - project.stop() + ProjectUC(users=[user], hosts=[host], redundancy=5, + short_name="test_1sec_%d"%i, resource_share=[1, 5][i]) + run_check_all() diff --git a/test/test_backend.py b/test/test_backend.py index 51f974b21b..3e18fe6f83 100755 --- a/test/test_backend.py +++ b/test/test_backend.py @@ -17,7 +17,6 @@ class ProjectBackend(ProjectUC): ProjectUC.__init__(self, redundancy = 5, short_name = 'test_backend') def run(self): self.install() - self.install_make_work(work=self.work, cushion=self.num-1, redundancy=5) self.start_servers() @@ -25,7 +24,7 @@ class ProjectBackend(ProjectUC): n = 0 db = self.db_open() 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)); time.sleep(.1) db.close() @@ -47,22 +46,6 @@ class ProjectBackend(ProjectUC): time.sleep(1) 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): # Give the server 30 seconds to finish assimilating/deleting # TODO: use wait on all processes. @@ -71,15 +54,5 @@ class ProjectBackend(ProjectUC): if __name__ == '__main__': test_msg("entire backend"); - - num = 100 - 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() + ProjectBackend(sys.argv[1:] and get_int(sys.argv[1]) or 100) + run_check_all() diff --git a/test/test_concat.py b/test/test_concat.py index d78f951ac3..03d01ac8d8 100755 --- a/test/test_concat.py +++ b/test/test_concat.py @@ -41,9 +41,5 @@ class ProjectConcat(Project): if __name__ == '__main__': test_msg("standard concat application"); - - project = ProjectConcat() - project.run() - project.host.run() - project.check() - project.stop() + ProjectConcat() + run_check_all() diff --git a/test/test_uc.py b/test/test_uc.py index 56185996ab..5dbb6c9fd4 100755 --- a/test/test_uc.py +++ b/test/test_uc.py @@ -41,16 +41,19 @@ APP: upper_case: argv[0] is upper_case APP: upper_case ending, wrote """) # self.exit_status = 0 + class ProjectUC(Project): def __init__(self, works=None, users=None, hosts=None, short_name=None, long_name=None, - redundancy=2): + redundancy=2, resource_share=1): Project.__init__(self, appname = 'upper_case', works = works or [WorkUC(redundancy=redundancy)], users = users or [UserUC()], 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): redundancy = self.work.redundancy @@ -69,9 +72,5 @@ class ProjectUC(Project): if __name__ == '__main__': test_msg("standard upper_case application"); - - project = ProjectUC() - project.run() - project.host.run() - project.check() - project.stop() + ProjectUC() + run_check_all()