uzullaがブログ

uzullaがブログです。

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だから)すればできそうですね。
(追記しました)

オチ

http://yancha.hachiojipm.org/quot?id=81322,81335,81336,81337,81338,81339,81340,81341,81342,81345,81346


教えていただくまでのタイムラグで、自分のライブラリ側をUnixドメインソケットに対応させてしまったり、

それが非互換の修正になったので、ライブラリにリリース番号ふろうとして、なんかGithubでリリースやタグをごちゃごちゃやったら謎の感じになってよくわからない事になったり。
f:id:uzulla:20130724224612p:plain
(なにこれ…どうやったら消せるの…タグはもう無いし、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


f:id:uzulla:20130724231115p:plain


codereposwwwwww
古いwwwww


今度は適当にググらず、バージョンを確認し、ちゃんとmetacpanやGithubを辿るようにします…。