DBD::mysqlのConnection Timeoutをテストする

同僚がMySQLのconnection timeoutのテスト方法に迷っていたので、アイデアを出してみたらうまくいったのでメモ。はじめはMySQLをどうにかするアプローチを考えたが、必要なのは「何もしないサーバ」だった。

何もしないサーバをたてる(testを書くときにはTest::TCP::empty_portを使うとよいと思われる)

$ perl -MIO::Socket  -le \
'$sock = new IO::Socket::INET(LocalPort=>22111, Listen=>SOMAXCONN, Porot=>"tcp", Reuse=>1);while(1){}'

接続しようとするとblockされる

$ mysql -h127.0.0.1 -P22111
$ perl -MDBI -le 'DBI->connect("DBI:mysql:database=test;host=127.0.0.1;port=22111;mysql_connect_timeout=1")'
DBI connect('database=test;host=127.0.0.1;port=22111;mysql_connect_timeout=1','',...) failed: Can't connect to MySQL server on '127.0.0.1' (4) at -e line 1

mysql_connect_timeoutを使うとちゃんとタイムアウトした。

$ perl -MDBI -le 'DBI->connect("DBI:mysql:database=test;host=127.0.0.1;port=22111");'

mysql_connect_timeoutを使わないとずっとblockされたままになった。