2
0

Flash.hx 5.4 KB

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