FlexUnit Ant Taskのはまりどころ
1. 実はswfが作成されていない
FlexUnit Ant TaskというよりはAnt。mxmlcのコンパイルをexecで起動する場合でOSに Windows XP を指定すると Vistaではビルドされない!!!。そのためswfができないのでエラーになる。エラーメッセージからだとわからないな。
test: [flexunit] opened server socket [flexunit] Exception in thread "Thread-2" timeout waiting for flexunit report [flexunit] at com.adobe.ac.ant.tasks.FlexUnitTask$1.run(Unknown Source) [flexunit] Caused by: java.net.SocketTimeoutException: Accept timed out
os="Windows XP, Windows Vista" とするとよい。Windowsだけだとうごいてくれない。。。。
2. ポート番号が使われている場合
port番号のデフォルトポート1024が使われている場合
test: [flexunit] Exception in thread "Thread-4" error receiving report from flexunit [flexunit] at com.adobe.ac.ant.tasks.FlexUnitTask$1.run(Unknown Source) [flexunit] Caused by: java.net.BindException: Address already in use: JVM_Bind
flexunitを port="1025" と設定するとうごくが
Error #2044: ハンドルされていない IOErrorEvent : text=Error #2031: ソケットエラー。 at flexunit.junit::JUnitTestRunner/sendResults()
となる。AntTestRunner.mxmlも変更する必要がある。JUnitTestRunnerのportを設定する
runner = new JUnitTestRunner(); + runner.port = 1025;
3. テスト結果が化ける
FlexUnit Ant Task固有の問題。テスト結果が文字化けする。
http://weblogs.macromedia.com/pmartin/archives/2006/06/flexunit_ant.cfm
に patch をおくったがspamがひどかったのでコメントがごっそりきえている。。。
patchをはっつけておく。
--- FlexUnitTask.java.orig Mon Sep 24 17:18:22 2007 +++ FlexUnitTask.java Thu Apr 17 21:17:25 2008 @@ -3,7 +3,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; +import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; @@ -183,7 +183,7 @@ { private ServerSocket serverSocket = null; private Socket clientSocket = null; - private InputStream in = null; + private InputStreamReader in = null; private OutputStream out = null; public void run() @@ -331,7 +331,7 @@ log( "accepting data from client" ); } - in = clientSocket.getInputStream(); + in = new InputStreamReader(clientSocket.getInputStream(), "UTF-8"); out = clientSocket.getOutputStream(); }
4. 起動するFlashPlayer(Windows)
Windowsの場合は Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler AntTestRunner.swf") で起動。
Mac OS X は Runtime.getRuntime().exec("open AntTestRunner.swf") 。
それ以外はUnix扱いで Runtime.getRuntime().exec("gflashplayer AntTestRunner.swf")。
スタンドアロン版のFlash Player
自分の環境だと.swf は以下のようになっていて
>assoc .swf .swf=ShockwaveFlash.ShockwaveFlash
スタンドアロン版のFlash Playerが起動する。
実際にはこれで問題ないが ExternalInterface をつかっていてエラーになっていた。
Error #2067: ExternalInterface はこのコンテナで使用できません。ExternalInterface を使用するには、 Internet Explorer ActiveX、Firefox、Mozilla 1.7.5 以上、または NPRuntime をサポートするブラウザが必要です。
となる。たまたま log.as をつかっていて発生した。try,catch で Error を握りつぶして対応した。
IE7
>assoc .swf=IE.HTTP
としたら一応うごいたがセキュリティのエラー警告のボタンを手動でおさないといけないのでこれだとナイトリービルドできないのでだめ。関連づけの方法がまちがっているのかも?
Firefox 3
>assoc .swf=FirefoxHTML
でうごかすとエラーになる。
SecurityError: Error #2149: セキュリティサンドボックス侵害 : file:///C:/program/flex/flextest/target/swf/AntTestRunner.swf は file:///C:/program/flex/flextest/target/swf/AntTestRunner.swf への fscommand 呼び出しを作成できません (allowScriptAccess は です)。 at FSCommand$/_fscommand() at global/flash.system::fscommand() at AntTestRunner/onTestComplete() at flexunit.junit::JUnitTestRunner/exit() at flexunit.junit::JUnitTestRunner/dataHandler()
どうやって関連づけるのがいいのだろうか?