Rosでノード間通信するのに必要なので、Pharo上にXMLRPCを実現するpharo-xmlrpcというパッケージを利用している。
http://code.google.com/p/pharo-xmlrpc/
ベータ公開中のようであるが、テストはオールグリーンということで導入すると痛い目にあう。実際のところ、1.3RCはおろか1.2.1であってもテストの実行に失敗する。
問題は2点あり、ひとつはstructノードの生成に関すること、もう一つはネットワークポートに関することである。
以前このブログで、デコード時の問題を解決するパッチを公開した。このパッチでは、decodeStruct:というstructのデコード時にノードを深くたどりすぎるバグに対処するものだった。
http://d.hatena.ne.jp/nqthm/20110822/p1
実はこのパッチを当てると今まで動いていたテストが失敗するようになる。というのも実はエンコード時に以下のような結果を生成するようになっていたからである。
<struct><struct>....</struct></struct>
要するにstructノードを二重に生成してしまっているのだ。このためにパッチ前のデコード処理とうまく整合するようになっている。
structノードの生成は、encode:内でwrapVal:type:とencodeStruct:内の二カ所で連続して行っている。
本来こういった問題を回避するためのテストコードが必要で、実際そのためのテストコードもXMLRPCEncoderTest>>testEncoderにあるのだが、そもそもencodeStruct:でstructを生成することを前提にチェックしており問題は露見しない。不思議なのは、同じテストの別の箇所は全てencode:を用いてチェックしているのに、この部分だけはencodeStruct:を用いている。
以上のバグについては、XMLRPCDecoder>>decodeStruct:,
XMLRPCEncoder>>encodeStruct:, XMLRPCEncoderTest>>testEncoderを修正すれば良い。
もう一つのバグは、XMLRPCHttpModuleに関するものである。具体的な現象としては、テストを一度実行するとそれ以降、ネットワークポートが既にアサイン済みである旨のメッセージが出て、テストに失敗するというもの。どうもテスト終了時にネットワークポートの解放ができていないようである。
これはXMLRPCHttpModule class>>pauseでservice unassignPortを実行することで回避した。本来、ここに置くべきなのか不明なのだが、とりあえずの対処として行った。
近日公開予定と思われるPharo-1.3では、pharo-xmlrpcのインストール中にエラーが発生する。この理由は、XMLRPCHttpModule class>>initializeがStartUpListへの登録に、1.3では存在しない(らしい)AutoStartクラスへの参照を含んでいるからである。initializeの実行に失敗しただけなので、手動で実行すれば良いだろう。
なお、パッチは以下に置いてある。