mirror of https://github.com/BOINC/boinc.git
working on test scripts
svn path=/trunk/boinc/; revision=1580
This commit is contained in:
parent
d4e945d66d
commit
07abeee9b5
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
|
||||||
|
|
|
@ -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()
|
|
||||||
|
|
|
@ -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()
|
|
||||||
|
|
|
@ -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()
|
|
||||||
|
|
Loading…
Reference in New Issue