def test_creates_event_mon_event_correctly(self): TestFile.add_file( 'master', 'builder', 'ui_tests', 123, 'full_results.json', json.dumps(TEST_JSON)) response = self.test_app.post('/internal/monitoring/upload', REQ_PAYLOAD) self.assertEqual(200, response.status_int) events = self.read_event_mon_file() self.assertEqual(1, len(events)) self.assertEqual(events[0].test_results.master_name, 'master') self.assertEqual(events[0].test_results.builder_name, 'builder') self.assertEqual(events[0].test_results.build_number, 123) self.assertEqual(events[0].test_results.test_type, 'ui_tests') self.assertEqual(events[0].test_results.step_name, 'ui_tests 12s pending') self.assertEqual(events[0].test_results.interrupted, False) self.assertEqual(events[0].test_results.version, 3) self.assertEqual(events[0].test_results.usec_since_epoch, 1457612314123000) self.assertEqual(1, len(events[0].test_results.tests)) self.assertEqual( events[0].test_results.tests[0].test_name, 'web-animations-api\\animation-state-changes.html') self.assertEqual( events[0].test_results.tests[0].expected, [ event_mon.protos.chrome_infra_log_pb2.TestResultsEvent.PASS, event_mon.protos.chrome_infra_log_pb2.TestResultsEvent.IMAGE_TEXT, event_mon.protos.chrome_infra_log_pb2.TestResultsEvent.UNKNOWN, ]) self.assertEqual( events[0].test_results.tests[0].actual, [event_mon.protos.chrome_infra_log_pb2.TestResultsEvent.PASS])
def test_does_not_crash_on_missing_required_fields_in_json(self): TestFile.add_file( 'master', 'builder', 'ui_tests', 123, 'full_results.json', '{}') response = self.test_app.post('/internal/monitoring/upload', REQ_PAYLOAD) self.assertEqual(200, response.status_int) events = self.read_event_mon_file() self.assertEqual(1, len(events)) self.assertFalse(events[0].test_results.HasField('interrupted')) self.assertFalse(events[0].test_results.HasField('version')) self.assertFalse(events[0].test_results.HasField('usec_since_epoch')) self.assertEqual(0, len(events[0].test_results.tests))
def test_creates_event_mon_event_correctly(self): TestFile.add_file( 'master', 'builder', 'ui_tests', 123, 'full_results.json', json.dumps(TEST_JSON)) response = self.test_app.post('/internal/monitoring/upload', { 'master': 'master', 'builder': 'builder', 'build_number': '123', 'test_type': 'ui_tests', }) self.assertEqual(200, response.status_int)
def post(self): # pragma: no cover file_params = self.request.POST.getall(PARAM_FILE) if not file_params: self.response.out.write("FAIL: missing upload file field.") return builder = self.request.get(PARAM_BUILDER) if not builder: self.response.out.write("FAIL: missing builder parameter.") return master_parameter = self.request.get(PARAM_MASTER) master_data = master_config.getMasterByMasterName(master_parameter) if master_data: deprecated_master = master_parameter master = master_data['url_name'] else: deprecated_master = None master = master_parameter test_type = self.request.get(PARAM_TEST_TYPE) logging.debug( "Processing upload request, master: %s, builder: %s, test_type: %s.", master, builder, test_type) # There are two possible types of each file_params in the request: # one file item or a list of file items. # Normalize file_params to a file item list. files = [] logging.debug("test: %s, type:%s", file_params, type(file_params)) for item in file_params: if not isinstance(item, list) and not isinstance(item, tuple): item = [item] files.extend(item) errors = [] final_status_code = 200 for record in files: file_json = JsonResults.load_json(record.value) if record.filename == "incremental_results.json": # FIXME: Ferret out and eliminate remaining incremental_results.json # producers. logging.info( ("incremental_results.json received from master: %s, " "builder: %s, test_type: %s."), master, builder, test_type) status_string, status_code = JsonResults.update( master, builder, test_type, file_json, deprecated_master=deprecated_master, is_full_results_format=False) else: try: build_number = int(file_json.get('build_number', 0)) status_string, status_code = TestFile.add_file( master, builder, test_type, build_number, record.filename, record.value) except (ValueError, TypeError): status_code = 403 status_string = ( 'Could not cast the build_number field in the ' 'json to an integer.') if status_code == 200: logging.info(status_string) else: logging.error(status_string) errors.append(status_string) final_status_code = status_code if status_code == 200 and record.filename == "full_results.json": status_string, status_code = JsonResults.update( master, builder, test_type, file_json, deprecated_master=deprecated_master, is_full_results_format=True) BuilderState.incremental_update(master, builder, test_type, datetime.now()) if status_code == 200: logging.info(status_string) else: logging.error(status_string) errors.append(status_string) final_status_code = status_code if errors: messages = "FAIL: " + "; ".join(errors) self.response.set_status(final_status_code, messages) self.response.out.write(messages) else: self.response.set_status(200) self.response.out.write("OK")
def post(self): # pragma: no cover file_params = self.request.POST.getall(PARAM_FILE) if not file_params: self.response.out.write("FAIL: missing upload file field.") return builder = self.request.get(PARAM_BUILDER) if not builder: self.response.out.write("FAIL: missing builder parameter.") return master_parameter = self.request.get(PARAM_MASTER) master_data = master_config.getMasterByMasterName(master_parameter) if master_data: deprecated_master = master_parameter master = master_data['url_name'] else: deprecated_master = None master = master_parameter test_type = self.request.get(PARAM_TEST_TYPE) test_type = util.normalize_test_type(test_type) logging.debug( "Processing upload request, master: %s, builder: %s, test_type: %s.", master, builder, test_type) # There are two possible types of each file_params in the request: # one file item or a list of file items. # Normalize file_params to a file item list. files = [] logging.debug("test: %s, type:%s", file_params, type(file_params)) for item in file_params: if not isinstance(item, list) and not isinstance(item, tuple): item = [item] files.extend(item) errors = [] final_status_code = 200 for record in files: file_json = JsonResults.load_json(record.value) if record.filename == "incremental_results.json": # FIXME: Ferret out and eliminate remaining incremental_results.json # producers. logging.info(("incremental_results.json received from master: %s, " "builder: %s, test_type: %s."), master, builder, test_type) status_string, status_code = JsonResults.update(master, builder, test_type, file_json, deprecated_master=deprecated_master, is_full_results_format=False) else: try: build_number = int(file_json.get('build_number', 0)) status_string, status_code = TestFile.add_file(master, builder, test_type, build_number, record.filename, record.value) except (ValueError, TypeError): status_code = 403 status_string = ('Could not cast the build_number field in the ' 'json to an integer.') if status_code == 200: logging.info(status_string) else: logging.error(status_string) errors.append(status_string) final_status_code = status_code if status_code == 200 and record.filename == "full_results.json": status_string, status_code = JsonResults.update(master, builder, test_type, file_json, deprecated_master=deprecated_master, is_full_results_format=True) BuilderState.incremental_update(master, builder, test_type, datetime.now()) EventMonUploader.upload(master, builder, build_number, test_type, file_json) if status_code == 200: logging.info(status_string) else: logging.error(status_string) errors.append(status_string) final_status_code = status_code if errors: messages = "FAIL: " + "; ".join(errors) self.response.set_status(final_status_code, messages) self.response.out.write(messages) else: self.response.set_status(200) self.response.out.write("OK")