| 1 | ############################################################################ |
|---|
| 2 | # |
|---|
| 3 | # DSAGE: Distributed SAGE |
|---|
| 4 | # |
|---|
| 5 | # Copyright (C) 2006, 2007 Yi Qiang <yqiang@gmail.com> |
|---|
| 6 | # |
|---|
| 7 | # Distributed under the terms of the GNU General Public License (GPL) |
|---|
| 8 | # |
|---|
| 9 | # This code is distributed in the hope that it will be useful, |
|---|
| 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|---|
| 12 | # General Public License for more details. |
|---|
| 13 | # |
|---|
| 14 | # The full text of the GPL is available at: |
|---|
| 15 | # |
|---|
| 16 | # http://www.gnu.org/licenses/ |
|---|
| 17 | ############################################################################ |
|---|
| 18 | |
|---|
| 19 | import unittest |
|---|
| 20 | import datetime |
|---|
| 21 | import os |
|---|
| 22 | from glob import glob |
|---|
| 23 | |
|---|
| 24 | from sage.dsage.database.job import Job, expand_job |
|---|
| 25 | from sage.dsage.database.jobdb import JobDatabaseSQLite |
|---|
| 26 | from sage.dsage.database.monitordb import MonitorDatabase |
|---|
| 27 | from sage.dsage.database.clientdb import ClientDatabase |
|---|
| 28 | from sage.dsage.server.server import DSageServer |
|---|
| 29 | |
|---|
| 30 | class DSageServerTestCase(unittest.TestCase): |
|---|
| 31 | r""" |
|---|
| 32 | Tests for DSageServer go here. |
|---|
| 33 | |
|---|
| 34 | """ |
|---|
| 35 | |
|---|
| 36 | def setUp(self): |
|---|
| 37 | self.jobdb = JobDatabaseSQLite(test=True) |
|---|
| 38 | self.monitordb = MonitorDatabase(test=True) |
|---|
| 39 | self.clientdb = ClientDatabase(test=True) |
|---|
| 40 | self.dsage_server = DSageServer(self.jobdb, |
|---|
| 41 | self.monitordb, |
|---|
| 42 | self.clientdb, |
|---|
| 43 | log_level=5) |
|---|
| 44 | for job in self.create_jobs(10): |
|---|
| 45 | self.dsage_server.submit_job(job.reduce()) |
|---|
| 46 | |
|---|
| 47 | def tearDown(self): |
|---|
| 48 | self.dsage_server.jobdb._shutdown() |
|---|
| 49 | files = glob('*.db*') |
|---|
| 50 | for file in files: |
|---|
| 51 | os.remove(file) |
|---|
| 52 | |
|---|
| 53 | def testget_job(self): |
|---|
| 54 | jdict = self.dsage_server.get_job() |
|---|
| 55 | self.assertEquals(type(jdict), dict) |
|---|
| 56 | job = expand_job(jdict) |
|---|
| 57 | self.assert_(isinstance(job, Job)) |
|---|
| 58 | |
|---|
| 59 | def testget_job_by_id(self): |
|---|
| 60 | job = Job() |
|---|
| 61 | job.code = '2+2' |
|---|
| 62 | jdict = self.dsage_server.submit_job(job.reduce()) |
|---|
| 63 | self.assertEquals(type(jdict['job_id']), str) |
|---|
| 64 | |
|---|
| 65 | def testget_job_result_by_id(self): |
|---|
| 66 | job = self.create_jobs(1)[0] |
|---|
| 67 | job = expand_job(self.dsage_server.get_job()) |
|---|
| 68 | job.result = 'test' |
|---|
| 69 | jdict = self.dsage_server.submit_job(job.reduce()) |
|---|
| 70 | self.assertEquals( |
|---|
| 71 | self.dsage_server.get_job_result_by_id(jdict['job_id']), |
|---|
| 72 | 'test') |
|---|
| 73 | |
|---|
| 74 | def testget_jobs_by_username(self): |
|---|
| 75 | self.assertEquals( |
|---|
| 76 | type(self.dsage_server.get_jobs_by_username('yqiang')), |
|---|
| 77 | list) |
|---|
| 78 | self.assertEquals( |
|---|
| 79 | len(self.dsage_server.get_jobs_by_username('test')), |
|---|
| 80 | 0) |
|---|
| 81 | |
|---|
| 82 | job = expand_job(self.dsage_server.get_job()) |
|---|
| 83 | job.username = 'testing123' |
|---|
| 84 | job.code = '' |
|---|
| 85 | jdict = self.dsage_server.submit_job(job.reduce()) |
|---|
| 86 | j = expand_job(self.dsage_server.get_jobs_by_username('testing123')[0]) |
|---|
| 87 | self.assertEquals(j.username, job.username) |
|---|
| 88 | |
|---|
| 89 | def testsubmit_job(self): |
|---|
| 90 | jobs = self.create_jobs(10) |
|---|
| 91 | for job in jobs: |
|---|
| 92 | jdict = self.dsage_server.submit_job(job.reduce()) |
|---|
| 93 | self.assertEquals(type(jdict), dict) |
|---|
| 94 | j = expand_job(self.dsage_server.get_job_by_id(jdict['job_id'])) |
|---|
| 95 | self.assert_(isinstance(j, Job)) |
|---|
| 96 | |
|---|
| 97 | def testget_all_jobs(self): |
|---|
| 98 | jobs = self.dsage_server.get_all_jobs() |
|---|
| 99 | self.assertEquals(len(jobs), 10) |
|---|
| 100 | |
|---|
| 101 | def testget_active_jobs(self): |
|---|
| 102 | jobs = self.dsage_server.get_all_jobs() |
|---|
| 103 | for job in jobs: |
|---|
| 104 | job = expand_job(job) |
|---|
| 105 | job.status = 'processing' |
|---|
| 106 | jdict = self.dsage_server.submit_job(job.reduce()) |
|---|
| 107 | jobs = self.dsage_server.get_active_jobs() |
|---|
| 108 | self.assert_(len(jobs) == 10) |
|---|
| 109 | for job in jobs: |
|---|
| 110 | job = expand_job(job) |
|---|
| 111 | self.assert_(isinstance(job, Job)) |
|---|
| 112 | self.assert_(job.status == 'processing') |
|---|
| 113 | self.assert_(job.update_time < datetime.datetime.now()) |
|---|
| 114 | |
|---|
| 115 | def testget_active_clients_list(self): |
|---|
| 116 | clients = self.dsage_server.get_client_list() |
|---|
| 117 | self.assertEquals(len(clients), 0) |
|---|
| 118 | self.assertEquals(type(clients), list) |
|---|
| 119 | |
|---|
| 120 | def testget_killed_jobs_list(self): |
|---|
| 121 | jobs = self.dsage_server.get_killed_jobs_list() |
|---|
| 122 | self.assertEquals(len(jobs), 0) |
|---|
| 123 | |
|---|
| 124 | jobs = self.dsage_server.get_all_jobs() |
|---|
| 125 | for job in jobs: |
|---|
| 126 | job = expand_job(job) |
|---|
| 127 | job.killed = True |
|---|
| 128 | self.dsage_server.submit_job(job.reduce()) |
|---|
| 129 | |
|---|
| 130 | jobs = self.dsage_server.get_killed_jobs_list() |
|---|
| 131 | self.assertEquals(len(jobs), 10) |
|---|
| 132 | |
|---|
| 133 | for job in jobs: |
|---|
| 134 | job = expand_job(job) |
|---|
| 135 | self.assert_(isinstance(job, Job)) |
|---|
| 136 | self.assertEquals(job.killed, True) |
|---|
| 137 | self.assert_(job.update_time < datetime.datetime.now()) |
|---|
| 138 | |
|---|
| 139 | def testjob_done(self): |
|---|
| 140 | job = expand_job(self.dsage_server.get_job()) |
|---|
| 141 | result = 'done' |
|---|
| 142 | output = 'done ' |
|---|
| 143 | completed = True |
|---|
| 144 | jdict = self.dsage_server.job_done(job.job_id, output, result, completed) |
|---|
| 145 | job = expand_job(self.dsage_server.get_job_by_id(jdict['job_id'])) |
|---|
| 146 | self.assertEquals(job.output, output) |
|---|
| 147 | self.assertEquals(job.result, result) |
|---|
| 148 | self.assertEquals(job.status, 'completed') |
|---|
| 149 | |
|---|
| 150 | job = expand_job(self.dsage_server.get_job()) |
|---|
| 151 | result = ['testing', '123'] |
|---|
| 152 | output = 'testing' |
|---|
| 153 | completed = False |
|---|
| 154 | jdict = self.dsage_server.job_done(job.job_id, output, result, completed) |
|---|
| 155 | job = expand_job(self.dsage_server.get_job_by_id(jdict['job_id'])) |
|---|
| 156 | self.assert_(isinstance(job.output, str)) |
|---|
| 157 | self.assert_(job.status != 'completed') |
|---|
| 158 | |
|---|
| 159 | def testjob_failed(self): |
|---|
| 160 | job = expand_job(self.dsage_server.get_job()) |
|---|
| 161 | self.dsage_server.job_failed(job.job_id, 'Failure') |
|---|
| 162 | job = expand_job(self.dsage_server.get_job_by_id(job.job_id)) |
|---|
| 163 | self.assertEquals(job.failures, 1) |
|---|
| 164 | self.assertEquals(job.output, 'Failure') |
|---|
| 165 | self.dsage_server.job_failed(job.job_id, 'Another Failure') |
|---|
| 166 | job = expand_job(self.dsage_server.get_job_by_id(job.job_id)) |
|---|
| 167 | self.assertEquals(job.failures, 2) |
|---|
| 168 | self.assertEquals(job.output, 'Another Failure') |
|---|
| 169 | |
|---|
| 170 | def testkill_job(self): |
|---|
| 171 | job = expand_job(self.dsage_server.get_job()) |
|---|
| 172 | reason = 'test' |
|---|
| 173 | id = self.dsage_server.kill_job(job.job_id, reason) |
|---|
| 174 | job = expand_job(self.dsage_server.get_job_by_id(id)) |
|---|
| 175 | self.assertEquals(job.killed, True) |
|---|
| 176 | |
|---|
| 177 | def create_jobs(self, n): |
|---|
| 178 | """This method creates n jobs. """ |
|---|
| 179 | |
|---|
| 180 | jobs = [] |
|---|
| 181 | for i in range(n): |
|---|
| 182 | jobs.append(Job(name='unittest', username='yqiang', code='2+2')) |
|---|
| 183 | |
|---|
| 184 | return jobs |
|---|