New flakiness dashboard show test time, modifiers, and flaky tests
[WebKit-https.git] / Websites / test-results / include / test-results.php
index af92be1..f24921e 100644 (file)
@@ -38,9 +38,10 @@ function store_test_results($db, $test_results, $build_id, $start_time, $end_tim
     $db->begin_transaction();
 
     try {
-        foreach ($test_results['tests'] as $name => $subtests)
-            recursively_add_test_results($db, $build_id, $subtests, $name);
-        $db->query_and_get_affected_rows('UPDATE builds SET (start_time, end_time, slave, fetched) = ($1, $2, $3, TRUE) WHERE id = $4',
+        recursively_add_test_results($db, $build_id, $test_results['tests'], '');
+
+        $db->query_and_get_affected_rows(
+            'UPDATE builds SET (start_time, end_time, slave) = (least($1, start_time), greatest($2, end_time), $3) WHERE id = $4',
             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));
         $db->commit_transaction();
     } catch (Exception $e) {
@@ -53,17 +54,29 @@ function store_test_results($db, $test_results, $build_id, $start_time, $end_tim
 
 function recursively_add_test_results($db, $build_id, $tests, $full_name) {
     if (!array_key_exists('expected', $tests) and !array_key_exists('actual', $tests)) {
-        foreach ($tests as $name => $subtests)
-            recursively_add_test_results($db, $build_id, $subtests, $full_name . '/' . $name);
+        $prefix = $full_name ? $full_name . '/' : '';
+        foreach ($tests as $name => $subtests) {
+            require_format('test_name', $name, '/^[A-Za-z0-9 +_\-\.]+$/');
+            recursively_add_test_results($db, $build_id, $subtests, $prefix . $name);
+        }
         return;
     }
 
+    require_format('expected_result', $tests['expected'], '/^[A-Za-z ]+$/');
+    require_format('actual_result', $tests['actual'], '/^[A-Za-z ]+$/');
+    require_format('test_time', $tests['time'], '/^\d*$/');
+    $modifiers = array_get($tests, 'modifiers');
+    if ($modifiers)
+        require_format('test_modifiers', $modifiers, '/^[A-Za-z0-9 \.\/]+$/');
+    else
+        $modifiers = NULL;
+
     $test_id = $db->select_or_insert_row('tests', NULL,
         array('name' => $full_name), array('name' => $full_name, 'reftest_type' => json_encode(array_get($tests, 'reftest_type'))));
 
-    // FIXME: Either use a transaction or check the return value.
-    $db->select_or_insert_row('results', NULL, array('test' => $test_id, 'build' => $build_id,
-        'expected' => $tests['expected'], 'actual' => $tests['actual']));
+    $db->insert_row('results', NULL, array('test' => $test_id, 'build' => $build_id,
+        'expected' => $tests['expected'], 'actual' => $tests['actual'],
+        'time' => $tests['time'], 'modifiers' => $tests['modifiers']));
 }
 
 date_default_timezone_set('UTC');
@@ -79,16 +92,22 @@ function parse_revisions_array($postgres_array) {
     return $revisions;
 }
 
+function format_result($result) {
+    return array('buildTime' => strtotime($result['start_time']) * 1000,
+        'revisions' => parse_revisions_array($result['revisions']),
+        'slave' => $result['slave'],
+        'buildNumber' => $result['number'],
+        'actual' => $result['actual'],
+        'expected' => $result['expected'],
+        'time' => $result['time'],
+        'modifiers' => $result['modifiers']);
+}
+
 function format_result_rows($result_rows) {
     $builders = array();
     foreach ($result_rows as $result) {
         array_push(array_ensure_item_has_array(array_ensure_item_has_array($builders, $result['builder']), $result['test']),
-            array('buildTime' => strtotime($result['start_time']) * 1000,
-            'revisions' => parse_revisions_array($result['revisions']),
-            'slave' => $result['slave'],
-            'buildNumber' => $result['number'],
-            'actual' => $result['actual'],
-            'expected' => $result['expected']));
+            format_result($result));
     }
     return array('builders' => $builders);
 }