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()


どうやって関連づけるのがいいのだろうか?

その他

  • CUI環境のLinuxだとFlashがうごかないだろうからCIサーバーにできないな。。。みんなどうしているんだろう?
  • flexuitタスクのtimeoutは60000 milliseconds(60秒)。ちと長い気がするので15秒にしている。
  • FlexBuilderからの実行にははまりどころはない。いまのところ単に使いづらいだけ。