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されたままになった。