Showing lists of flaky tests for a builder takes too long
[WebKit-https.git] / Websites / test-results / api / report.php
1 <?php
2
3 require_once('../include/json-shared.php');
4 require_once('../include/test-results.php');
5
6 $db = connect();
7
8 require_existence_of($_POST, array(
9     'master' => '/[A-Za-z0-9\.]+/',
10     'builder_name' => '/^[A-Za-z0-9 \(\)\-_]+$/',
11     'build_number' => '/^[0-9]+?$/',
12     'build_slave' => '/^[A-Za-z0-9\-_]+$/',
13     'revisions' => '/^.+?$/',
14     'start_time' => '/^[0-9]+(\.[0-9]+)?$/',
15     'end_time' => '/^[0-9]+(\.[0-9]+)?$/'));
16 $master = $_POST['master'];
17 $builder_name = $_POST['builder_name'];
18 $build_number = intval($_POST['build_number']);
19
20 if (!array_key_exists('file', $_FILES) or !array_key_exists('tmp_name', $_FILES['file']) or count($_FILES['file']['tmp_name']) <= 0)
21     exit_with_error('ResultsJSONNotIncluded');
22
23 $revisions = json_decode($_POST['revisions'], true);
24 foreach ($revisions as $repository_name => $revision_data) {
25     require_format('repository_name', $repository_name, '/^\w+$/');
26     require_existence_of($revision_data, array(
27         'revision' => '/^[a-z0-9]+$/',
28         'timestamp' => '/^[a-z0-9\-\.:TZ]+$/',
29     ), 'revision');
30 }
31
32 $test_results = fetch_and_parse_test_results_json($_FILES['file']['tmp_name']);
33 if (!$test_results)
34     exit_with_error('InvalidResultsJSON');
35
36 $start_time = float_to_time($_POST['start_time']);
37 $end_time = float_to_time($_POST['end_time']);
38
39 $builder_id = add_builder($db, $master, $builder_name);
40 if (!$builder_id)
41     exit_with_error('FailedToInsertBuilder', array('master' => $master, 'builderName' => $builder_name));
42
43 $build_id = add_build($db, $builder_id, $build_number);
44 if (!$build_id)
45     exit_with_error('FailedToInsertBuild', array('builderId' => $builder_id, 'buildNumber' => $build_number));
46
47 foreach ($revisions as $repository_name => $revision_data) {
48     $repository_id = $db->select_or_insert_row('repositories', NULL, array('name' => $repository_name));
49     if (!$repository_id)
50         exit_with_error('FailedToInsertRepository', array('name' => $repository_name));
51
52     $revision_data = array(
53         'repository' => $repository_id,
54         'build' => $build_id,
55         'value' => $revision_data['revision'],
56         'time' => array_get($revision_data, 'timestamp'));
57     $db->select_or_insert_row('build_revisions', NULL, array('repository' => $repository_id, 'build' => $build_id), $revision_data, 'value')
58         or exit_with_error('FailedToInsertRevision', array('name' => $repository_name, 'data' => $revision_data));
59 }
60
61 $slave_id = add_slave($db, $_POST['build_slave']);
62 if (!store_test_results($db, $test_results, $build_id, $start_time, $end_time, $slave_id))
63     exit_with_error('FailedToStoreResults', array('buildId' => $build_id));
64
65 echo_success();
66
67 ob_end_flush();
68 flush();
69 if (function_exists('fastcgi_finish_request'))
70     fastcgi_finish_request();
71
72 $generator = new ResultsJSONGenerator($db, $builder_id);
73 $generator->generate();
74
75 ?>