Test::mysqldでTCP接続を受け入れる
PHPプロダクトのテストで、Harriet+Test::mysqldをつかいはじめたのですが、題名でちょっと困ってたら、Yancha*1でhide_o_55さんがコードを読んで解決策を教えてくれたのでブログにします!ありがとうございました!!
そのまえに…
ググったりドキュメントにかいてなかったとしても、コードを読もう!!!
Test::mysqldとは
require Test::mysqld; my $mysqld = Test::mysqld->new( my_cnf => { 'skip-networking' => '', # no TCP socket } ) or die $Test::mysqld::errstr; print $mysqld->dsn; #DBI:mysql:dbname=test;mysql_socket=/path/to/tmp/mysql.sock;user=root
こんな感じで気軽にテスト用のテンポラリのMysqldを立ち上げる事ができる、すばらしい。
で、TCP接続の話
Test::mysqldは資源が有限なポート番号をつかわないのが流儀っぽいですが、PHPer的にはTCP接続のほうがテストに使いやすい。
いや、PHPの名誉の為に言っておくと、もちろん全然できるんだけど、俺のオレオレライブラリがTCP接続決め打ちで書いてあったので俺が悪い、PHPer悪くない、悪いのは悪いPHPerだ。
解決策、ポート番号を指定すればよい
require Test::mysqld; my $mysqld = Test::mysqld->new( my_cnf => { 'port'=>12345 } ) or die $Test::mysqld::errstr; print $mysqld->dsn; #DBI:mysql:dbname=test;host=127.0.0.1;port=12345;user=root
かんたんですね!!!でもこれきづけなかったんだよ…(skip-networkingはずしたくらいは試したけど)
ポート決め打ちじゃん、つらいじゃん(?)
なんとなく、Test::TCPつかって書けばいいような気がしたんだけど、脳みその中の想像そのままかいてもうごかなかった、Test::TCPは中でexecしなきゃダメか〜。
まあ、Test::TCPのポートスキャンのコードパクってコピペ(PHPerだから)すればできそうですね。
(追記しました)
オチ
教えていただくまでのタイムラグで、自分のライブラリ側をUnixドメインソケットに対応させてしまったり、
それが非互換の修正になったので、ライブラリにリリース番号ふろうとして、なんかGithubでリリースやタグをごちゃごちゃやったら謎の感じになってよくわからない事になったり。
(なにこれ…どうやったら消せるの…タグはもう無いし、git ls-remoteでもタグないし…)
PHPのコードでPerlをつかってテストするとか不遜なことをやったからか、妙な天罰くらってて泣ける。
挫折したので、Harrietの話はまた今度書く。
追記 Net::EmptyPort つかえ
さらに追加でhide_o_55さんに指摘されたんだけど、Test::TCPに含まれているNet::EmptyPortをつかえばいいじゃないかと指摘される。
https://metacpan.org/module/Net::EmptyPort
えっ、なにいってるの、いやいや、俺反省したし、さっきTest::TCPのコード読んだし。
…とおもいつつブラウザのヒストリをひらくと…
http://svn.coderepos.org/share/lang/perl/Test-TCP/trunk/lib/Test/TCP.pm
codereposwwwwww
古いwwwww
今度は適当にググらず、バージョンを確認し、ちゃんとmetacpanやGithubを辿るようにします…。