def submit_results(request): q = get_object_or_404(WorkQueue, pk=request.POST.get('work_queue_id', 0)) results = json.loads(request.POST['results']) if results.get('test_run_error'): tests = results.get('tests', []) tests.append({ 'result': False, 'module': '__jstestnet__', 'test': 'test_run_error', 'message': results['test_run_error_msg'] }) results['tests'] = tests if 'tests' not in results: raise ValueError('Results JSON is missing key tests (list)') for i, test in enumerate(results['tests']): if 'result' not in test: raise ValueError('results.tests[%s] JSON is missing key result ' '(True or False)' % i) for k in ('module', 'test', 'message'): if k not in test: test[k] = '<%r was empty>' % k q.finished = True q.results = json.dumps(results) q.save() return {'desc': 'Test result received'}
def submit_results(request): q = get_object_or_404(WorkQueue, pk=request.POST.get('work_queue_id', 0)) results = json.loads(request.POST['results']) if results.get('test_run_error'): tests = results.get('tests', []) tests.append({ 'result': False, 'module': '__jstestnet__', 'test': 'test_run_error', 'message': results['test_run_error_msg'] }) results['tests'] = tests if 'tests' not in results: raise ValueError('Results JSON is missing key tests (list)') for i, test in enumerate(results['tests']): if 'result' not in test: raise ValueError( 'results.tests[%s] JSON is missing key result ' '(True or False)' % i) for k in ('module', 'test', 'message'): if k not in test: test[k] = '<%r was empty>' % k q.finished = True q.results = json.dumps(results) q.save() return { 'desc': 'Test result received' }
def start_debugging(self): q = WorkQueue( worker=self, cmd='start_debugging', description='Server wants to start the debugger', cmd_args=json.dumps([]), ) q.save()
def restart(self): q = WorkQueue( worker=self, cmd='restart', description='Server said restart. Goodbye!', cmd_args=json.dumps([]), ) q.save()
def json_view(f): @functools.wraps(f) def wrapper(*args, **kw): try: response = f(*args, **kw) status = 200 except Exception, err: # @TODO(kumar) Need to hook into Django's email mailer here log.exception("in JSON response") response = {'success': False, 'error': True, 'message': str(err)} status = 500 return http.HttpResponse(json.dumps(response), content_type='application/json', status=status)
def run_test(self, test): q = WorkQueue( worker=self, cmd='run_test', description='Running test suite.', cmd_args=json.dumps([{ 'test_run_id': test.id, 'url': test.url, 'name': test.test_suite.name }]), ) q.save() tq = TestRunQueue(test_run=test, work_queue=q) tq.save()
def test_missing_results(self): results = { 'failures': 0, 'total': 1, # totally empty 'tests': [{}] } r = self.client.post(reverse('work.submit_results'), dict(work_queue_id=self.work_queue_id, results=json.dumps(results))) eq_(r.status_code, 500) d = json.loads(r.content) eq_(d['error'], True) assert 'missing key result' in d['message'], ( 'Unexpected: %s' % d['message'])
def test_submit_error_results(self): results = { 'test_run_error': True, 'test_run_error_msg': 'Timed out waiting for test results' } r = self.client.post(reverse('work.submit_results'), dict(work_queue_id=self.work_queue_id, results=json.dumps(results))) eq_(r.status_code, 200) q = WorkQueue.objects.get(pk=self.work_queue_id) eq_(q.finished, True) d = json.loads(q.results) eq_(d['tests'][0], {'module': '__jstestnet__', 'test': 'test_run_error', 'result': False, 'message': results['test_run_error_msg']})
def json_view(f): @functools.wraps(f) def wrapper(*args, **kw): try: response = f(*args, **kw) status = 200 except Exception, err: # @TODO(kumar) Need to hook into Django's email mailer here log.exception("in JSON response") response = { 'success': False, 'error': True, 'message': str(err) } status = 500 return http.HttpResponse(json.dumps(response), content_type='application/json', status=status)
def test_submit_incomplete_results(self): results = { 'failures': 0, 'total': 1, # mostly empty test result: 'tests': [{'result': True}] } r = self.client.post(reverse('work.submit_results'), dict(work_queue_id=self.work_queue_id, results=json.dumps(results))) eq_(r.status_code, 200) q = WorkQueue.objects.get(pk=self.work_queue_id) eq_(q.finished, True) eq_(json.loads(q.results)['tests'], [{'result': True, 'module': "<'module' was empty>", 'test': "<'test' was empty>", 'message': "<'message' was empty>"}])
def test_get_job_result(self): ts = create_ts() token = Token.create(ts) worker = create_worker() r = self.client.post(reverse('system.start_tests'), data={'browsers': 'firefox', 'token': token, 'name': ts.slug}) eq_(r.status_code, 200) data = json.loads(r.content) test_run_id = data['test_run_id'] r = self.client.get(reverse('system.test_result', args=[test_run_id])) eq_(r.status_code, 200) data = json.loads(r.content) eq_(data['finished'], False) eq_(data['results'], []) data = self.query(worker) queue_id = data['work_queue_id'] results = { 'failures': 0, 'total': 1, 'tests': [ {'module':'Bar', 'test':'foo', 'message':'1 equals 2', 'result':False}, {'module':'Bar', 'test':'foo', 'message':'ok', 'result':True}, {'module':'Zebo', 'test':'zee', 'message':'ok', 'result':True}, ] } r = self.client.post(reverse('work.submit_results'), dict(work_queue_id=queue_id, results=json.dumps(results))) eq_(r.status_code, 200) r = self.client.get(reverse('system.test_result', args=[test_run_id])) eq_(r.status_code, 200) data = json.loads(r.content) eq_(data['finished'], True) tests = sorted(data['results']) eq_(tests[0]['module'], 'Bar') eq_(tests[0]['test'], 'foo') eq_(tests[0]['assertions'], [ {'module':'Bar', 'test':'foo', 'worker_id': worker.id, 'worker_user_agent': worker.user_agent, 'browser': 'firefox/3.6.12, gecko/1.9.2.12', 'message':'1 equals 2', 'result':False}, {'module':'Bar', 'test':'foo', 'worker_id': worker.id, 'worker_user_agent': worker.user_agent, 'browser': 'firefox/3.6.12, gecko/1.9.2.12', 'message':'ok', 'result':True}, ]) eq_(tests[1]['module'], 'Zebo') eq_(tests[1]['test'], 'zee') eq_(tests[1]['assertions'], [ {'module':'Zebo', 'test':'zee', 'worker_id': worker.id, 'worker_user_agent': worker.user_agent, 'browser': 'firefox/3.6.12, gecko/1.9.2.12', 'message':'ok', 'result':True}, ])
def test_work(self): user_agent = ('Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; ' 'en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12') worker = Worker() worker.save() ts = self.suite() token = Token.create(ts) # No work to fetch. r = self.client.post(reverse('work.query'), dict(worker_id=worker.id, user_agent=user_agent)) eq_(r.status_code, 200) data = json.loads(r.content) eq_(data['desc'], 'No commands from server.') # Simulate Hudson requesting a job: r = self.client.post(reverse('system.start_tests'), data={'browsers': 'firefox', 'token': token, 'name': ts.slug}) eq_(r.status_code, 200) # Do work r = self.client.post(reverse('work.query'), dict(worker_id=worker.id, user_agent=user_agent)) eq_(r.status_code, 200) data = json.loads(r.content) eq_(data['cmd'], 'run_test') eq_(data['args'][0]['url'], ts.default_url) eq_(data['args'][0]['name'], ts.name) work_queue_id = data['args'][0]['work_queue_id'] queue = WorkQueue.objects.get(pk=work_queue_id) eq_(queue.worker.id, worker.id) eq_(queue.finished, False) eq_(queue.results, None) eq_(queue.results_received, False) eq_(queue.worker.last_heartbeat.timetuple()[0:3], datetime.now().timetuple()[0:3]) eq_(queue.worker.user_agent, user_agent) eq_(sorted([(e.engine, e.version) for e in queue.worker.engines.all()]), sorted(parse_useragent(user_agent))) results = { 'failures': 0, 'total': 1, 'tests': [{'test': 'foo', 'message': '1 equals 2', 'module': 'some module', 'result': True}] } r = self.client.post(reverse('work.submit_results'), dict(work_queue_id=queue.id, results=json.dumps(results))) eq_(r.status_code, 200) data = json.loads(r.content) eq_(data['desc'], 'Test result received') # Refresh from db... queue = WorkQueue.objects.get(pk=queue.id) eq_(queue.finished, True) eq_(queue.results, json.dumps(results)) eq_(queue.results_received, False) # Cannot fetch more work. r = self.client.post(reverse('work.query'), dict(worker_id=worker.id, user_agent=user_agent)) eq_(r.status_code, 200) data = json.loads(r.content) eq_(data['desc'], 'No commands from server.')
def test_work(self): user_agent = ('Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; ' 'en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12') worker = Worker() worker.save() ts = self.suite() token = Token.create(ts) # No work to fetch. r = self.client.post(reverse('work.query'), dict(worker_id=worker.id, user_agent=user_agent)) eq_(r.status_code, 200) data = json.loads(r.content) eq_(data['desc'], 'No commands from server.') # Simulate Hudson requesting a job: r = self.client.post(reverse('system.start_tests'), data={ 'browsers': 'firefox', 'token': token, 'name': ts.slug }) eq_(r.status_code, 200) # Do work r = self.client.post(reverse('work.query'), dict(worker_id=worker.id, user_agent=user_agent)) eq_(r.status_code, 200) data = json.loads(r.content) eq_(data['cmd'], 'run_test') eq_(data['args'][0]['url'], ts.default_url) eq_(data['args'][0]['name'], ts.name) work_queue_id = data['args'][0]['work_queue_id'] queue = WorkQueue.objects.get(pk=work_queue_id) eq_(queue.worker.id, worker.id) eq_(queue.finished, False) eq_(queue.results, None) eq_(queue.results_received, False) eq_(queue.worker.last_heartbeat.timetuple()[0:3], datetime.now().timetuple()[0:3]) eq_(queue.worker.user_agent, user_agent) eq_( sorted([(e.engine, e.version) for e in queue.worker.engines.all()]), sorted(parse_useragent(user_agent))) results = { 'failures': 0, 'total': 1, 'tests': [{ 'test': 'foo', 'message': '1 equals 2', 'module': 'some module', 'result': True }] } r = self.client.post( reverse('work.submit_results'), dict(work_queue_id=queue.id, results=json.dumps(results))) eq_(r.status_code, 200) data = json.loads(r.content) eq_(data['desc'], 'Test result received') # Refresh from db... queue = WorkQueue.objects.get(pk=queue.id) eq_(queue.finished, True) eq_(queue.results, json.dumps(results)) eq_(queue.results_received, False) # Cannot fetch more work. r = self.client.post(reverse('work.query'), dict(worker_id=worker.id, user_agent=user_agent)) eq_(r.status_code, 200) data = json.loads(r.content) eq_(data['desc'], 'No commands from server.')
def test_get_job_result(self): ts = create_ts() token = Token.create(ts) worker = create_worker() r = self.client.post(reverse('system.start_tests'), data={ 'browsers': 'firefox', 'token': token, 'name': ts.slug }) eq_(r.status_code, 200) data = json.loads(r.content) test_run_id = data['test_run_id'] r = self.client.get(reverse('system.test_result', args=[test_run_id])) eq_(r.status_code, 200) data = json.loads(r.content) eq_(data['finished'], False) eq_(data['results'], []) data = self.query(worker) queue_id = data['work_queue_id'] results = { 'failures': 0, 'total': 1, 'tests': [ { 'module': 'Bar', 'test': 'foo', 'message': '1 equals 2', 'result': False }, { 'module': 'Bar', 'test': 'foo', 'message': 'ok', 'result': True }, { 'module': 'Zebo', 'test': 'zee', 'message': 'ok', 'result': True }, ] } r = self.client.post( reverse('work.submit_results'), dict(work_queue_id=queue_id, results=json.dumps(results))) eq_(r.status_code, 200) r = self.client.get(reverse('system.test_result', args=[test_run_id])) eq_(r.status_code, 200) data = json.loads(r.content) eq_(data['finished'], True) tests = sorted(data['results']) eq_(tests[0]['module'], 'Bar') eq_(tests[0]['test'], 'foo') eq_(tests[0]['assertions'], [ { 'module': 'Bar', 'test': 'foo', 'worker_id': worker.id, 'worker_user_agent': worker.user_agent, 'browser': 'firefox/3.6.12, gecko/1.9.2.12', 'message': '1 equals 2', 'result': False }, { 'module': 'Bar', 'test': 'foo', 'worker_id': worker.id, 'worker_user_agent': worker.user_agent, 'browser': 'firefox/3.6.12, gecko/1.9.2.12', 'message': 'ok', 'result': True }, ]) eq_(tests[1]['module'], 'Zebo') eq_(tests[1]['test'], 'zee') eq_(tests[1]['assertions'], [ { 'module': 'Zebo', 'test': 'zee', 'worker_id': worker.id, 'worker_user_agent': worker.user_agent, 'browser': 'firefox/3.6.12, gecko/1.9.2.12', 'message': 'ok', 'result': True }, ])