Ejemplo n.º 1
0
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'}
Ejemplo n.º 2
0
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'
    }
Ejemplo n.º 3
0
 def start_debugging(self):
     q = WorkQueue(
         worker=self,
         cmd='start_debugging',
         description='Server wants to start the debugger',
         cmd_args=json.dumps([]),
     )
     q.save()
Ejemplo n.º 4
0
 def restart(self):
     q = WorkQueue(
         worker=self,
         cmd='restart',
         description='Server said restart. Goodbye!',
         cmd_args=json.dumps([]),
     )
     q.save()
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
 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()
Ejemplo n.º 7
0
 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'])
Ejemplo n.º 8
0
 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'])
Ejemplo n.º 9
0
    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']})
Ejemplo n.º 10
0
    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']})
Ejemplo n.º 11
0
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)
Ejemplo n.º 12
0
    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>"}])
Ejemplo n.º 13
0
    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>"}])
Ejemplo n.º 14
0
    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},
        ])
Ejemplo n.º 15
0
    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.')
Ejemplo n.º 16
0
    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.')
Ejemplo n.º 17
0
    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
            },
        ])