New flakiness dashboard should support showing the failing tests per builder
[WebKit-https.git] / Websites / test-results / include / test-results.php
1 <?php
2
3 require_once('db.php');
4
5 function float_to_time($time_in_float) {
6     $time = new DateTime();
7     $time->setTimestamp(floatval($time_in_float));
8     return $time;
9 }
10
11 function add_build($db, $master, $builder_name, $build_number) {
12     if (!in_array($master, config('masters')))
13         return NULL;
14
15     $builder_id = $db->select_or_insert_row('builders', NULL, array('master' => $master, 'name' => $builder_name));
16     if (!$builder_id)
17         return NULL;
18
19     return $db->select_or_insert_row('builds', NULL, array('builder' => $builder_id, 'number' => $build_number));
20 }
21
22 function add_slave($db, $name) {
23     return $db->select_or_insert_row('slaves', NULL, array('name' => $name));
24 }
25
26 function fetch_and_parse_test_results_json($url, $jsonp = FALSE) {
27     $json_contents = file_get_contents($url);
28     if (!$json_contents)
29         return NULL;
30
31     if ($jsonp)
32         $json_contents = preg_replace('/^\w+\(|\);$/', '', $json_contents);
33
34     return json_decode($json_contents, true);
35 }
36
37 function store_test_results($db, $test_results, $build_id, $start_time, $end_time, $slave_id) {
38     $db->begin_transaction();
39
40     try {
41         foreach ($test_results['tests'] as $name => $subtests)
42             recursively_add_test_results($db, $build_id, $subtests, $name);
43         $db->query_and_get_affected_rows('UPDATE builds SET (start_time, end_time, slave, fetched) = ($1, $2, $3, TRUE) WHERE id = $4',
44             array($start_time->format('Y-m-d H:i:s.u'), $end_time->format('Y-m-d H:i:s.u'), $slave_id, $build_id));
45         $db->commit_transaction();
46     } catch (Exception $e) {
47         $db->rollback_transaction();
48         return FALSE;
49     }
50
51     return TRUE;
52 }
53
54 function recursively_add_test_results($db, $build_id, $tests, $full_name) {
55     if (!array_key_exists('expected', $tests) and !array_key_exists('actual', $tests)) {
56         foreach ($tests as $name => $subtests)
57             recursively_add_test_results($db, $build_id, $subtests, $full_name . '/' . $name);
58         return;
59     }
60
61     $test_id = $db->select_or_insert_row('tests', NULL,
62         array('name' => $full_name), array('name' => $full_name, 'reftest_type' => json_encode(array_get($tests, 'reftest_type'))));
63
64     // FIXME: Either use a transaction or check the return value.
65     $db->select_or_insert_row('results', NULL, array('test' => $test_id, 'build' => $build_id,
66         'expected' => $tests['expected'], 'actual' => $tests['actual']));
67 }
68
69 date_default_timezone_set('UTC');
70 function parse_revisions_array($postgres_array) {
71     // e.g. {"(WebKit,131456,\"2012-10-16 14:53:00\")","(Safari,162004,)"}
72     $outer_array = json_decode('[' . trim($postgres_array, '{}') . ']');
73     $revisions = array();
74     foreach ($outer_array as $item) {
75         $name_and_revision = explode(',', trim($item, '()'));
76         $time = strtotime(trim($name_and_revision[2], '"')) * 1000;
77         $revisions[trim($name_and_revision[0], '"')] = array(trim($name_and_revision[1], '"'), $time);
78     }
79     return $revisions;
80 }
81
82 function format_result_rows($result_rows) {
83     $builders = array();
84     foreach ($result_rows as $result) {
85         array_push(array_ensure_item_has_array(array_ensure_item_has_array($builders, $result['builder']), $result['test']),
86             array('buildTime' => strtotime($result['start_time']) * 1000,
87             'revisions' => parse_revisions_array($result['revisions']),
88             'slave' => $result['slave'],
89             'buildNumber' => $result['number'],
90             'actual' => $result['actual'],
91             'expected' => $result['expected']));
92     }
93     return array('builders' => $builders);
94 }
95
96 ?>