Flash.hx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package runci.targets;
  2. import sys.io.File;
  3. import sys.FileSystem;
  4. import haxe.io.Path;
  5. import haxe.Json;
  6. import sys.io.Process;
  7. import haxe.Http;
  8. import runci.System.*;
  9. import runci.Config.*;
  10. class Flash {
  11. static var miscFlashDir(get,never):String;
  12. static inline function get_miscFlashDir() return miscDir + 'flash/';
  13. static public function getLatestFPVersion():Array<Int> {
  14. var appcast = Xml.parse(haxe.Http.requestUrl("http://fpdownload2.macromedia.com/get/flashplayer/update/current/xml/version_en_mac_pep.xml"));
  15. var versionStr = new haxe.xml.Access(appcast).node.XML.node.update.att.version;
  16. return versionStr.split(",").map(Std.parseInt);
  17. }
  18. static public function setupFlexSdk():Void {
  19. if (commandSucceed("mxmlc", ["--version"])) {
  20. infoMsg('mxmlc has already been installed.');
  21. } else {
  22. var apacheMirror = Json.parse(Http.requestUrl("http://www.apache.org/dyn/closer.lua?as_json=1")).preferred;
  23. var flexVersion = "4.16.0";
  24. runCommand("wget", ["-nv", '${apacheMirror}/flex/${flexVersion}/binaries/apache-flex-sdk-${flexVersion}-bin.tar.gz'], true);
  25. runCommand("tar", ["-xf", 'apache-flex-sdk-${flexVersion}-bin.tar.gz', "-C", Sys.getEnv("HOME")]);
  26. var flexsdkPath = Sys.getEnv("HOME") + '/apache-flex-sdk-${flexVersion}-bin';
  27. addToPATH(flexsdkPath + "/bin");
  28. var playerglobalswcFolder = flexsdkPath + "/player";
  29. FileSystem.createDirectory(playerglobalswcFolder + "/11.1");
  30. var flashVersion = runci.targets.Flash.getLatestFPVersion();
  31. runCommand("wget", ["-nv", 'http://download.macromedia.com/get/flashplayer/updaters/${flashVersion[0]}/playerglobal${flashVersion[0]}_${flashVersion[1]}.swc', "-O", playerglobalswcFolder + "/11.1/playerglobal.swc"], true);
  32. File.saveContent(flexsdkPath + "/env.properties", 'env.PLAYERGLOBAL_HOME=$playerglobalswcFolder');
  33. runCommand("mxmlc", ["--version"]);
  34. }
  35. }
  36. static public var playerCmd:String;
  37. static public function setupFlashPlayerDebugger():Void {
  38. var mmcfgPath = switch (systemName) {
  39. case "Linux":
  40. Sys.getEnv("HOME") + "/mm.cfg";
  41. case "Mac":
  42. "/Library/Application Support/Macromedia/mm.cfg";
  43. case _:
  44. throw "unsupported system";
  45. }
  46. switch (systemName) {
  47. case "Linux":
  48. playerCmd = "flashplayerdebugger";
  49. if(Sys.command("type", [playerCmd]) != 0) {
  50. Linux.requireAptPackages([
  51. "libglib2.0", "libfreetype6"
  52. ]);
  53. var majorVersion = getLatestFPVersion()[0];
  54. runCommand("wget", ["-nv", 'http://fpdownload.macromedia.com/pub/flashplayer/updaters/${majorVersion}/flash_player_sa_linux_debug.x86_64.tar.gz'], true);
  55. runCommand("tar", ["-xf", "flash_player_sa_linux_debug.x86_64.tar.gz", "-C", Sys.getEnv("HOME")]);
  56. playerCmd = Path.join([Sys.getEnv("HOME"), "flashplayerdebugger"]);
  57. }
  58. if (!FileSystem.exists(mmcfgPath)) {
  59. File.saveContent(mmcfgPath, "ErrorReportingEnable=1\nTraceOutputFileEnable=1");
  60. }
  61. switch (ci) {
  62. case GithubActions:
  63. runCommand("xvfb-run", ["-a", playerCmd, "-v"]);
  64. case _:
  65. runCommand(playerCmd, ["-v"]);
  66. }
  67. case "Mac":
  68. if (commandResult("brew", ["cask", "list", "flash-player-debugger"]).exitCode == 0) {
  69. return;
  70. }
  71. runCommand("brew", ["uninstall", "[email protected]"]);
  72. runCommand("brew", ["uninstall", "[email protected]"]);
  73. runCommand("brew", ["untap", "local/openssl"]);
  74. runCommand("brew", ["untap", "local/python2"]);
  75. runCommand("brew", ["update"]);
  76. runCommand("brew", ["cask", "install", "flash-player-debugger"]);
  77. // Disable the "application downloaded from Internet" warning
  78. runCommand("xattr", ["-d", "-r", "com.apple.quarantine", "/Applications/Flash Player Debugger.app"]);
  79. var dir = Path.directory(mmcfgPath);
  80. if (!FileSystem.exists(dir)) {
  81. runCommand("sudo", ["mkdir", "-p", dir]);
  82. runCommand("sudo", ["chmod", "a+w", dir]);
  83. }
  84. if (!FileSystem.exists(mmcfgPath)) {
  85. File.saveContent(mmcfgPath, "ErrorReportingEnable=1\nTraceOutputFileEnable=1");
  86. }
  87. }
  88. }
  89. /**
  90. Run a Flash swf file.
  91. Return whether the test is successful or not.
  92. It detemines the test result by reading the flashlog.txt, looking for "SUCCESS: true".
  93. */
  94. static public function runFlash(swf:String):Bool {
  95. swf = FileSystem.fullPath(swf);
  96. Sys.println('going to run $swf');
  97. switch (systemName) {
  98. case "Linux":
  99. switch (ci) {
  100. case GithubActions:
  101. new Process("xvfb-run", ["-a", playerCmd, swf]);
  102. case _:
  103. new Process(playerCmd, [swf]);
  104. }
  105. case "Mac":
  106. Sys.command("open", ["-a", "/Applications/Flash Player Debugger.app", swf]);
  107. }
  108. //wait a little until flashlog.txt is created
  109. var flashlogPath = switch (systemName) {
  110. case "Linux":
  111. Sys.getEnv("HOME") + "/.macromedia/Flash_Player/Logs/flashlog.txt";
  112. case "Mac":
  113. Sys.getEnv("HOME") + "/Library/Preferences/Macromedia/Flash Player/Logs/flashlog.txt";
  114. case _:
  115. throw "unsupported system";
  116. }
  117. for (t in 0...5) {
  118. runCommand("sleep", ["2"]);
  119. if (FileSystem.exists(flashlogPath))
  120. break;
  121. }
  122. if (!FileSystem.exists(flashlogPath)) {
  123. failMsg('$flashlogPath not found.');
  124. return false;
  125. }
  126. //read flashlog.txt continously
  127. var traceProcess = new Process("tail", ["-f", flashlogPath]);
  128. var success = false;
  129. while (true) {
  130. try {
  131. var line = traceProcess.stdout.readLine();
  132. if (line.indexOf("success: ") >= 0) {
  133. success = line.indexOf("success: true") >= 0;
  134. break;
  135. }
  136. } catch (e:haxe.io.Eof) {
  137. break;
  138. }
  139. }
  140. traceProcess.kill();
  141. traceProcess.close();
  142. Sys.command("cat", [flashlogPath]);
  143. return success;
  144. }
  145. static public function run(args:Array<String>) {
  146. setupFlashPlayerDebugger();
  147. setupFlexSdk();
  148. var success = true;
  149. for (argsVariant in [[], ["--swf-version", "32"]]) {
  150. runCommand("haxe", ["compile-flash9.hxml", "-D", "fdb", "-D", "dump", "-D", "dump_ignore_var_ids"].concat(args).concat(argsVariant));
  151. var runSuccess = runFlash("bin/unit9.swf");
  152. if (!runSuccess) {
  153. success = false;
  154. }
  155. }
  156. changeDirectory(miscFlashDir);
  157. runCommand("haxe", ["run.hxml"]);
  158. if (!success)
  159. fail();
  160. }
  161. }