Test-Memcached-0.00003 - can't run as root without the -u switch

概要

Test-Memcached-0.00003をroot権限でinstallするとRunning make testで失敗するです。

t/002_basic.tがこける

cannot open port: 10001 at /root/.cpan/build/Test-Memcached-0.00003-QRHVb2/blib/lib/Test/Memcached.pm line 184.

cpan-testers見てみる

http://static.cpantesters.org/distro/T/Test-Memcached.html

むぅ。ものすごい勢いでテストに成功している。

原因調べる準備

localに以下のスクリプトを配備。つまりコピペ。

/home/$USER/project/Hoge/lib/Test/Memcached.pm
/home/$USER/project/Hoge/t/002_basic.t

一般ユーザーでtestを実行してみる。

% prove -lv t/002_basic.t

結果

1..4
ok 1
ok 2
ok 3
ok 4
ok
All tests successful.
Files=1, Tests=4,  2 wallclock secs ( 0.10 usr  0.02 sys +  0.25 cusr  0.15 csys =  0.52 CPU)
Result: PASS

ということで問題はない。root権限だとどうだろう

% sudo prove -lv t/002_basic.t
t/test_memcached.t ..
1..4
ok 1
cannot open port: 10001 at /home/okamura/project/Pinky/lib/Test/Memcached.pm line 184.
# Looks like you planned 4 tests but ran 1.
# Looks like your test exited with 111 just after 1.
Dubious, test returned 111 (wstat 28416, 0x6f00)
Failed 3/4 subtests

Test Summary Report
-------------------
t/test_memcached.t (Wstat: 28416 Tests: 1 Failed: 0)
  Non-zero exit status: 111
  Parse errors: Bad plan.  You planned 4 tests but ran 1.
Files=1, Tests=1, 11 wallclock secs ( 0.07 usr  0.09 sys +  0.29 cusr  0.17 csys =  0.62 CPU)
Result: FAIL

あらら、失敗してしまいました。

原因を調べましょう

Test-Memcached-0.00003、Test::Memcached.pmの142〜145あたりをコメントアウトします。標準エラー出力をlogファイルに向けないようにするためです。

すると次のようなメッセージが表示されます。

can't run as root without the -u switch

どうもIO::Socket::INET、もしくはそれより以下の階層でroot権限で使うのを拒否しているような感じがしてきました。

考察

  • Linuxの操作においてroot権限で行うべきでない動作が存在する
  • Test::Memcachedはroot権限で行うべきではない動作を含んでいる
  • 故にroot権限でTest::Memcachedの実行ができないのは正常

だと思いました。

で、結局どうする

ユーザー権限でしかTest::Memcachedを使わないので、とりあえずlocalにそのままコピーして使ってしまうことにしました。

とはいえ将来的にTest::Memcachedに依存して、test中にTest::Memcachedを実行するモジュールがCPANにアップされ、それが必要になった場合にroot権限でCPANモジュールをinstallしていると問題が生じると思われます。


というわけではやくlocal::libに移行しないといけないのかなーとか思いましたとさ。