summaryrefslogtreecommitdiffstats
path: root/tests/MySqlShimTest.php
blob: 473955836aeec72c542ac272f35ec3004800f016 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
<?php
/**
 * php7-mysql-shim
 *
 * @author Davey Shafik <dshafik@akamai.com>
 * @copyright Copyright 2015 Akamai Technologies, Inc. All rights reserved.
 * @license Apache 2.0
 * @link https://github.com/akamai-open/php7-mysql-shim
 * @link https://developer.akamai.com
 */

namespace Dshafik\MySQL\Tests;

use function \mysql_connect;

class MySqlShimTest extends \PHPUnit_Framework_TestCase
{
    static $host;
    static $container;
    static $bin = [];

    public function test_mysql_connect()
    {
        $mysql = mysql_connect(static::$host, 'root');

        $this->assertTrue(
            is_resource($mysql) && get_resource_type($mysql) == 'mysql link'
            ||
            $mysql instanceof \mysqli
        );
    }

    /**
     * @expectedException \PHPUnit_Framework_Error_Warning
     * @expectedExceptionMessageRegExp /^mysql(i?)_connect\(\): (\(HY000\/1045\): )?Access denied for user ''@'(.*?)' \(using password: NO\)$/
     */
    public function test_mysql_connect_fail()
    {
        $mysql = mysql_connect(static::$host);

        $this->assertFalse($mysql);
    }

    public function test_mysql_query()
    {
        \mysql_connect(static::$host, 'root');
        $result = \mysql_query("SELECT VERSION()");

        $this->assertTrue(
            is_resource($result) && get_resource_type($result) == 'mysql result'
            || $result instanceof \mysqli_result
        );
    }

    public function test_mysql_query_nodata()
    {
        \mysql_connect(static::$host, 'root');
        $result = \mysql_query("SET @test = 'foo'");

        $this->assertTrue($result);
    }

    public function test_mysql_query_fail()
    {
        \mysql_connect(static::$host, 'root');
        $result = \mysql_query("SELECT VERSION(");

        $this->assertFalse($result);
    }

    public function test_mysql_fetch_array()
    {
        \mysql_connect(static::$host, 'root');

        $result = \mysql_query("SELECT 'test' AS col");

        $row = \mysql_fetch_array($result);
        $this->assertTrue(is_array($row));
        $this->assertArrayHasKey(0, $row);
        $this->assertEquals($row[0], 'test');
        $this->assertArrayHasKey('col', $row);
        $this->assertEquals($row['col'], 'test');
    }

    public function test_mysql_fetch_array_multirow()
    {
        \mysql_connect(static::$host, 'root');

        $result = \mysql_query("SHOW DATABASES");

        while ($row = \mysql_fetch_array($result)) {
            $this->assertTrue(is_array($row));
            $this->assertArrayHasKey(0, $row);
            $this->assertTrue(in_array($row[0], ["information_schema", "mysql", "performance_schema", "sys"]));
            $this->assertArrayHasKey('Database', $row);
            $this->assertTrue(in_array($row['Database'], ["information_schema", "mysql", "performance_schema", "sys"]));
        }
    }

    public function test_mysql_num_rows()
    {
        \mysql_connect(static::$host, 'root');

        $result = \mysql_query("SHOW DATABASES");

        $this->assertEquals(4, \mysql_num_rows($result));
    }

    public function test_mysql_close()
    {
        \mysql_connect(static::$host, 'root');
        $this->assertTrue(\mysql_close());
    }

    /**
     * @expectedException \PHPUnit_Framework_Error_Warning
     * @expectedExceptionMessage mysql_close(): no MySQL-Link resource supplied
     */
    public function test_mysql_close_fail()
    {
        $this->assertFalse(\mysql_close());
    }

    public function tearDown()
    {
        @\mysql_close();
    }

    public static function setUpBeforeClass()
    {
        fwrite(STDERR, "=> Finding binaries\n");
        static::$bin['dm'] = $dm = exec('/usr/bin/env which docker-machine');
        static::$bin['docker'] = $docker = exec('/usr/bin/env which docker');
        if (empty($dm) && empty($docker)) {
            static::markTestSkipped('Docker is required to run these tests');
        }

        if (!empty($dm)) {

            fwrite(STDERR, "=> Starting Docker Machine\n");
            exec($dm . ' create -d virtualbox mysql-shim');
            exec($dm . ' start mysql-shim');

            $env = '';
            exec($dm . ' env mysql-shim', $env);
            foreach ($env as $line) {
                if ($line{0} !== '#') {
                    putenv(str_replace(["export ", '"'], "", $line));
                }
            }
        }

        fwrite(STDERR, "=> Running Docker Container: ");
        static::$container = exec($docker . ' run -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -P -d  mysql/mysql-server');

        if (empty(static::$container)) {
            static::markTestSkipped("Unable to start docker container");
        }

        fwrite(STDERR, static::$container . "\n");

        fwrite(STDERR, "=> Finding MySQL Host: ");
        static::$host = exec($docker . ' port ' . self::$container . ' 3306');
        fwrite(STDERR, static::$host . "\n");

        if (!empty($dm)) {
            fwrite(STDERR, "=> Using Docker Machine IP: ");
            $info = explode(':', static::$host);
            $port = array_pop($info);
            static::$host = exec($dm . ' ip mysql-shim') . ':' . $port;
            fwrite(STDERR, static::$host . "\n");
        }

        fwrite(STDERR, "=> Waiting on mysqld to start:");
        $out = '';
        while (trim($out) != 'mysqld') {
            $out = exec(static::$bin['docker'] . ' exec ' . static::$container . ' ps ax | awk \'/mysqld/ {print $NF}\'');
        }
        fwrite(STDERR, " started\n");

        fwrite(STDERR, "=> Docker Container Running\n\n");

        error_reporting(E_ALL & ~E_DEPRECATED);

        sleep(3);
    }

    public static function tearDownAfterClass()
    {
        fwrite(STDERR, "\n\nStopping Docker Container: ");
        $output = exec(static::$bin['docker'] . ' stop ' .static::$container);
        if (trim($output) !== static::$container) {
            fwrite(STDERR, " Failed to stop container!\n");
            return;
        }

        $output = exec(static::$bin['docker'] . ' rm ' .static::$container);
        if (trim($output) !== static::$container) {
            fwrite(STDERR, " Failed to remove container!\n");
            return;
        }
        fwrite(STDERR, "Done\n");
    }
}