Annotation of embedaddon/php/ext/mysqli/tests/mysqli_poll_kill.phpt, revision 1.1.1.1

1.1       misho       1: --TEST--
                      2: int mysqli_poll() and kill
                      3: --SKIPIF--
                      4: <?php
                      5: require_once('skipif.inc');
                      6: require_once('skipifemb.inc');
                      7: require_once('connect.inc');
                      8: require_once('skipifconnectfailure.inc');
                      9: 
                     10: if (!$IS_MYSQLND)
                     11:        die("skip mysqlnd only feature, compile PHP using --with-mysqli=mysqlnd");
                     12: ?>
                     13: --FILE--
                     14: <?php
                     15:        require_once('connect.inc');
                     16: 
                     17:        function get_connection() {
                     18:                global $host, $user, $passwd, $db, $port, $socket;
                     19: 
                     20:                if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
                     21:                        printf("[001] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
                     22:                return $link;
                     23:        }
                     24: 
                     25:        // Killing connection - 1
                     26: 
                     27:        $link = get_connection();
                     28:        if (true !== ($tmp = mysqli_query($link, "SELECT 1 AS 'processed before killed'", MYSQLI_ASYNC |  MYSQLI_USE_RESULT)))
                     29:                printf("[002] Expecting boolean/true got %s/%s\n", gettype($tmp), var_export($tmp, true));
                     30: 
                     31:        // Sleep 0.1s - the asynchronous query should have been processed after the wait period
                     32:        usleep(100000);
                     33:        $thread_id = mysqli_thread_id($link);
                     34:        mysqli_kill(get_connection(), $thread_id);
                     35: 
                     36:        $links = array($link);
                     37:        $errors = array($link);
                     38:        $reject = array($link);
                     39: 
                     40:        // Yes, 1 - the asynchronous query should have been processed
                     41:        if (1 !== ($tmp = (mysqli_poll($links, $errors, $reject, 0, 10000))))
                     42:                printf("[003] Expecting int/1 got %s/%s\n", gettype($tmp), var_export($tmp, true));
                     43: 
                     44:        if (!is_array($links) || empty($links))
                     45:                printf("[004] Expecting non-empty array got %s/%s\n", gettype($links), var_export($links, true));
                     46:        else
                     47:                foreach ($links as $link) {
                     48:                        if (is_object($res = mysqli_reap_async_query($link))) {
                     49:                                // Yes, you can fetch a result - the query has been processed
                     50:                                var_dump(mysqli_fetch_assoc($res));
                     51:                                mysqli_free_result($res);
                     52:                        } else if ($link->errno > 0) {
                     53:                                printf("[005] Error: %d\n", $link->errno);
                     54:                        }
                     55:                }
                     56: 
                     57:        // No error!
                     58:        if (!is_array($errors) || !empty($errors))
                     59:                printf("[006] Expecting non-empty array got %s/%s\n", gettype($errors), var_export($errors, true));
                     60: 
                     61:        if (!is_array($reject) || !empty($reject))
                     62:                printf("[007] Expecting empty array got %s/%s\n", gettype($reject), var_export($reject, true));
                     63: 
                     64:        // Lets pass a dead connection
                     65:        $links = array($link);
                     66:        $errors = array($link);
                     67:        $reject = array($link);
                     68:        if (0 !== ($tmp = mysqli_poll($links, $errors, $reject, 1)))
                     69:                printf("[008] There should be no connection ready! Returned %s/%s, expecting int/0.\n",
                     70:                        gettype($tmp), var_export($tmp, true));
                     71: 
                     72:        if (!empty($errors))
                     73:                printf("[009] There should be no errors but one rejected connection\n");
                     74: 
                     75:        foreach ($reject as $mysqli)
                     76:                if (mysqli_thread_id($mysqli) != $thread_id) {
                     77:                        printf("[010] Rejected thread %d should have rejected thread %d\n",
                     78:                                mysqli_thread_id($mysqli), $thread_id);
                     79:                }
                     80: 
                     81:        // Killing connection - 2
                     82: 
                     83:        $link = get_connection();
                     84:        if (true !== ($tmp = mysqli_query($link, "SELECT 1", MYSQLI_ASYNC |  MYSQLI_USE_RESULT)))
                     85:                printf("[011] Expecting boolean/true got %s/%s\n", gettype($tmp), var_export($tmp, true));
                     86: 
                     87:        usleep(100000);
                     88:        $thread_id = mysqli_thread_id($link);
                     89:        mysqli_kill(get_connection(), $thread_id);
                     90: 
                     91:        // Yes, 1 - fetch OK packet of kill!
                     92:        $processed = 0;
                     93:        do {
                     94:                $links = array($link, $link);
                     95:                $errors = array($link, $link);
                     96:                $reject = array($link, $link);
                     97:                $ready = mysqli_poll($links, $errors, $reject, 1);
                     98: 
                     99:                if (!empty($errors)) {
                    100:                        foreach ($errors as $mysqli) {
                    101:                                printf("[012] Error on thread %d: %s/%s\n",
                    102:                                        mysqli_thread_id($mysqli),
                    103:                                        mysqli_errno($mysqli),
                    104:                                        mysqli_error($mysqli));
                    105:                        }
                    106:                        break;
                    107:                }
                    108: 
                    109:                if (!empty($reject)) {
                    110:                        foreach ($reject as $mysqli) {
                    111:                                printf("[013] Rejecting thread %d: %s/%s\n",
                    112:                                        mysqli_thread_id($mysqli),
                    113:                                        mysqli_errno($mysqli),
                    114:                                        mysqli_error($mysqli));
                    115:                        }
                    116:                        $processed += count($reject);
                    117:                }
                    118: 
                    119:                foreach ($links as $mysqli) {
                    120:                        if (is_object($res = mysqli_reap_async_query($mysqli))) {
                    121:                                printf("Fetching from thread %d...\n", mysqli_thread_id($mysqli));
                    122:                                var_dump(mysqli_fetch_assoc($res));
                    123:                        } else if (mysqli_errno($mysqli) > 0) {
                    124:                                printf("[014] %d/%s\n", mysqli_errno($mysqli), mysqli_error($mysqli));
                    125:                        }
                    126:                        $processed++;
                    127:                }
                    128: 
                    129:        } while ($processed < 2);
                    130: 
                    131: 
                    132:        // Killing connection - 3
                    133: 
                    134:        $link = get_connection();
                    135:        $thread_id = mysqli_thread_id($link);
                    136:        mysqli_kill(get_connection(), $thread_id);
                    137:        // Sleep 0.1s  to ensure the KILL gets recognized
                    138:        usleep(100000);
                    139:        if (false !== ($tmp = mysqli_query($link, "SELECT 1 AS 'processed before killed'", MYSQLI_ASYNC |  MYSQLI_USE_RESULT)))
                    140:                printf("[015] Expecting boolean/false got %s/%s\n", gettype($tmp), var_export($tmp, true));
                    141: 
                    142:        $links = array($link);
                    143:        $errors = array($link);
                    144:        $reject = array($link);
                    145: 
                    146:        if (0 !== ($tmp = (mysqli_poll($links, $errors, $reject, 0, 10000))))
                    147:                printf("[016] Expecting int/0 got %s/%s\n", gettype($tmp), var_export($tmp, true));
                    148: 
                    149:        if (!is_array($links) || empty($links))
                    150:                printf("[017] Expecting non-empty array got %s/%s\n", gettype($links), var_export($links, true));
                    151:        else
                    152:                foreach ($links as $link) {
                    153:                        if (is_object($res = mysqli_reap_async_query($link))) {
                    154:                                // No, you cannot fetch the result
                    155:                                var_dump(mysqli_fetch_assoc($res));
                    156:                                mysqli_free_result($res);
                    157:                        } else if ($link->errno > 0) {
                    158:                                // But you are supposed to handle the error the way its shown here!
                    159:                                printf("[018] Error: %d/%s\n", $link->errno, $link->error);
                    160:                        }
                    161:                }
                    162: 
                    163:        // None of these will indicate an error, check errno on the list of returned connections!
                    164:        if (!is_array($errors) || !empty($errors))
                    165:                printf("[019] Expecting non-empty array got %s/%s\n", gettype($errors), var_export($errors, true));
                    166: 
                    167:        if (!is_array($reject) || !empty($reject))
                    168:                printf("[020] Expecting empty array got %s/%s\n", gettype($reject), var_export($reject, true));
                    169: 
                    170: 
                    171:        mysqli_close($link);
                    172:        print "done!";
                    173: ?>
                    174: --XFAIL--
                    175: To be fixed later. Minor issue about fetching error message from killed line
                    176: --EXPECTF--
                    177: array(1) {
                    178:   [%u|b%"processed before killed"]=>
                    179:   %unicode|string%(1) "1"
                    180: }
                    181: Fetching from thread %d...
                    182: array(1) {
                    183:   [1]=>
                    184:   %unicode|string%(1) "1"
                    185: }
                    186: 
                    187: Warning: mysqli_reap_async_query(): Premature end of data (mysqlnd_wireprotocol.c:%d) in %s on line %d
                    188: 
                    189: Warning: mysqli_reap_async_query(): RSET_HEADER %s
                    190: 
                    191: Warning: mysqli_reap_async_query(): Error reading result set's header in %s on line %d
                    192: 
                    193: Warning: Error while sending QUERY packet. %s
                    194: 
                    195: Warning: mysqli_reap_async_query(): %s
                    196: 
                    197: Warning: mysqli_reap_async_query(): Error reading result set's header in %s on line %d
                    198: [018] Error: %d/%s
                    199: done!

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>