<?php
error_reporting(E_ALL | E_STRICT);
ini_set("track_errors", "On");
$test_normal = TRUE;
$INC = dirname(__FILE__) . "/../inc";
require_once(dirname(__FILE__) . "/config.php");
require_once($INC . "/init.inc.php");
require_once($INC . "/util.inc.php");
require_once("helpers.inc.php");
require_once("http.inc.php");
rg_log_set_file("http_bug.log");
require_once("common.php");
$_testns = 'http_bug';
rg_test_create_user($db, $u1);
$info1 = array('id' => $u1['username']);
prepare_http($info1);
rg_test_create_user($db, $u2);
$info2 = array('id' => $u2['username']);
prepare_http($info2);
rg_test_create_repo($db, $u1, $repo);
$r = test_login($test_url, $u1);
if ($r === FALSE)
exit(1);
rg_log('');
rg_log_enter("Loading bug form...");
$url = "/user/" . $u1['username'] . "/" . $repo['name'] . "/bug/add";
$headers = array();
$data = array();
$r = do_req($info1, $test_url . $url, $data, $headers);
if ($r === FALSE) {
rg_log('Cannot load add bug form.');
exit(1);
}
$token = $r['tokens']['bug_edit_hl'];
if (empty($token)) {
rg_log("Seems I cannot load a token. See above.");
exit(1);
}
rg_log_exit();
rg_log('');
rg_log_enter("Posting bug form (token=$token)...");
$labels = array('a/b', 'uu::bb', '<xss>'); sort($labels);
$info1['test'] = 'add bug';
$data = array(
'doit' => 1,
'edit' => 1,
'token' => $token,
'title' => 'Title1 space<xss>',
'body' => 'aasasasassa<xss>',
'state' => 1,
'assigned_to' => $u2['username'],
'labels' => implode(' ', $labels));
$r = do_req($info1, $test_url . $url, $data, $headers);
if ($r === FALSE) {
rg_log('Cannot post bug request.');
exit(1);
}
$sql = 'SELECT * FROM bugs WHERE repo_id = ' . $repo['repo_id'];
$res = rg_sql_query($db, $sql);
$row = rg_sql_fetch_array($res);
rg_sql_free_result($res);
if ($row['bug_id'] != 1) {
rg_log("Seems the bugs do not start at 1, but " . $row['bug_id']);
exit(1);
}
if ($row['assigned_uid'] != $u2['uid']) {
rg_log('assigned_uid is not ' . $u2['uid']
. ', but ' . $row['assigned_uid'] . '!');
exit(1);
}
if ($row['state'] != 1) {
rg_log('State is not 1 but ' . $row['state'] . '!');
exit(1);
}
$sql = 'SELECT * FROM bug_labels WHERE repo_id = ' . $repo['repo_id']
. ' AND bug_id = 1';
$res = rg_sql_query($db, $sql);
$g = array();
while (($row = rg_sql_fetch_array($res))) {
$g[] = $row['label'];
}
rg_sql_free_result($res);
sort($g);
$p1 = implode(' ', $labels);
$p2 = implode(' ', $g);
if (strcmp($p1, $p2) != 0) {
rg_log('Labels are different [' . $p1 . '] != [' . $p2 . ']!');
exit(1);
}
rg_log_exit();
rg_log('');
rg_log_enter("Testing adding a note");
rg_log_enter("Loading bug/note form...");
$url = "/user/" . $u1['username'] . "/" . $repo['name'] . "/bug/1";
$info1['test'] = 'adding a note';
$r = do_req($info1, $test_url . $url, $data, $headers);
if ($r === FALSE) {
rg_log("Cannot load bug page.");
exit(1);
}
if (!isset($r['tokens']['note_add'])) {
rg_log('note_add token not present!');
exit(1);
}
$token = $r['tokens']['note_add'];
rg_log_exit();
rg_log_enter("Posting note add form (token=$token)...");
$note = 'This is a note<xss>';
$info1['test'] = 'adding a note';
$data = array('note_add_doit' => 1, 'token' => $token,
'note' => $note);
$r = do_req($info1, $test_url . $url, $data, $headers);
if ($r === FALSE) {
rg_log('Cannot post bug request.');
exit(1);
}
$sql = 'SELECT * FROM bug_notes WHERE repo_id = ' . $repo['repo_id']
. ' AND bug_id = 1';
$res = rg_sql_query($db, $sql);
$row = rg_sql_fetch_array($res);
rg_sql_free_result($res);
if ($row['note'] != $note) {
rg_log('Note is not ok [' . $note . '] != [' . $row['note'] . ']!');
exit(1);
}
if ($row['uid'] != $u1['uid']) {
rg_log('uid is not ok [' . $row['uid'] . '] != [' . $u1['uid'] . ']!');
exit(1);
}
rg_log_exit();
rg_log_exit();
$token = $r['tokens']['close_reopen'];
rg_log('');
rg_log_enter("Posting close bug form (token=$token)...");
$info1['test'] = 'closing a bug';
$data = array('token' => $token,
'close_reopen' => 1,
'state' => 2);
$r = do_req($info1, $test_url . $url, $data, $headers);
if ($r === FALSE) {
rg_log('Cannot post bug request.');
exit(1);
}
$sql = 'SELECT * FROM bugs WHERE repo_id = ' . $repo['repo_id']
. ' AND bug_id = 1';
$res = rg_sql_query($db, $sql);
$row = rg_sql_fetch_array($res);
rg_sql_free_result($res);
if ($row['state'] != 2) {
rg_log('Seems we could not close the bug; state=[' . $row['state'] . ']');
exit(1);
}
rg_log_exit();
$token = $r['tokens']['close_reopen'];
rg_log('');
rg_log_enter("Posting re-open bug form (token=$token)...");
$info1['test'] = 're-opn bug';
$data = array('token' => $token,
'close_reopen' => 1,
'state'=> 1);
$r = do_req($info1, $test_url . $url, $data, $headers);
if ($r === FALSE) {
rg_log('Cannot post bug request (check http_bug.out for last answer).');
exit(1);
}
$sql = 'SELECT * FROM bugs WHERE repo_id = ' . $repo['repo_id']
. ' AND bug_id = 1';
$res = rg_sql_query($db, $sql);
$row = rg_sql_fetch_array($res);
rg_sql_free_result($res);
if ($row['state'] != 1) {
rg_log('Seems we could not re-open the bug;'
. ' state=[' . $row['state'] . ']!');
exit(1);
}
rg_log_exit();
rg_log('');
rg_log_enter('Testing deleting a bug');
for ($i = 0; $i <= 1; $i++) {
$token = $r['tokens']['del_undel'];
rg_log("Posting delete bug form (token=$token)...");
$info1['test'] = 'deleting a bug (' . $i . ')';
$data = array('token' => $token,
'del_doit' => 1,
'del_undel' => $i + 1);
$r = do_req($info1, $test_url . $url, $data, $headers);
if ($r === FALSE) {
rg_log('Cannot post bug request.');
exit(1);
}
$sql = 'SELECT * FROM bugs WHERE repo_id = ' . $repo['repo_id']
. ' AND bug_id = 1';
$res = rg_sql_query($db, $sql);
$row = rg_sql_fetch_array($res);
rg_sql_free_result($res);
if ($i == 0)
$test = $row['deleted'] > 0;
else
$test = $row['deleted'] == 0;
if (!$test) {
rg_log('i=' . $i . ': Seems we could not delete/undelete the bug;'
. ' deleted=[' . $row['deleted'] . ']!');
exit(1);
}
if ($row['deleted_who'] != $u1['uid']) {
rg_log('i=' . $i . ': Seems the deleted_who has not been updated;'
. ' deleted_who=[' . $row['deleted_who'] . ']!');
exit(1);
}
}
rg_log_exit();
rg_log('');
rg_log_enter("Test watching a bug - we need to login as a different user");
$r = test_login($test_url, $u2);
if ($r === FALSE)
exit(1);
$headers = array();
// 'u2' is already in the watch list because the asignee is automatically added
for ($i = 0; $i <= 1; $i++) {
rg_log('Loading bug form (i=' . $i . ')...');
$data = array();
$r = do_req($info2, $test_url . $url, $data, $headers);
if ($r === FALSE) {
rg_log('Cannot load bug form.');
exit(1);
}
$token = $r['tokens']['watch_bug'];
rg_log('Posting (un)watch bug form...');
$data = array('token' => $token, 'watch_type' => 'bug',
'watch_doit' => 1, 'watch' => $i);
$r = do_req($info2, $test_url . $url, $data, $headers);
if ($r === FALSE) {
rg_log('Cannot post watch bug request.');
exit(1);
}
$sql = 'SELECT DISTINCT uid FROM watch_bug'
. ' WHERE repo_id = ' . $repo['repo_id']
. ' AND bug_id = 1';
$res = rg_sql_query($db, $sql);
$rows = rg_sql_num_rows($res);
$row = array();
while (($r = rg_sql_fetch_array($res)))
$row[] = $r;
rg_sql_free_result($res);
if ($i == 0) { // unwatch - only u1[uid] should be present
if (($rows != 1) || ($row[0]['uid'] != $u1['uid'])) {
rg_log_ml('Seems I could not unwatch the bug; rows: '
. print_r($row, TRUE));
exit(1);
}
} else {
$_l = array($u1['uid'], $u2['uid']);
for ($j = 0; $j <= 1; $j++) {
if (!in_array($row[$j]['uid'], $_l)) {
rg_log('Seems I cannot unwatch a bug'
. ' (' . $row[$j]['uid']
. ' is not in the expected list)!');
exit(1);
}
}
}
}
rg_log_exit();
rg_log_enter('Search bugs: loading form...');
$url = '/user/' . $u1['username'] . '/' . $repo['name'] . '/bug/search';
$info1['test'] = 'load search bug form';
$headers = array(); $data = array();
$r = do_req($info1, $test_url . $url, $data, $headers);
if ($r === FALSE) {
rg_log('Cannot load bug search page!');
exit(1);
}
rg_log_exit();
rg_log_enter('Search bugs: add a search...');
$url = '/user/' . $u1['username'] . '/' . $repo['name'] . '/bug/search';
$info1['test'] = 'search bug';
$headers = array(); $data = array('doit' => '1');
$r = do_req($info1, $test_url . $url, $data, $headers);
if ($r === FALSE) {
rg_log('Cannot do bug search!');
exit(1);
}
if (!strstr($r['body'], 'Title1 space<xss>')) {
rg_log_ml('r: ' . print_r($r, TRUE));
rg_log('Search did not returned our bug!');
exit(1);
}
rg_log_exit();
rg_prof_log();
rg_log('OK!');