flashplayer 9.115.0 → 10.1.1.pre

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "sprout", ">= 1.0.pre"
4
+
5
+ group :development do
6
+ gem "shoulda"
7
+ gem "mocha"
8
+ end
9
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 10.1.1.pre
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path File.dirname(__FILE__), 'lib'
3
+ $:.unshift lib unless $:.include?(lib)
4
+
5
+ require 'bundler'
6
+ Bundler.setup
7
+
8
+ require 'flashplayer'
9
+
10
+ Gem::Specification.new do |s|
11
+ s.name = FlashPlayer::NAME
12
+ s.version = FlashPlayer::VERSION
13
+ s.author = "Luke Bayes"
14
+ s.email = "projectsprouts@googlegroups.com"
15
+ s.homepage = "http://www.adobe.com/products/flex"
16
+ s.summary = "Adobe Flash Player"
17
+ s.description = "The Adobe Flash Player"
18
+ s.files = FileList['**/**/*'].exclude /.git|.svn|.DS_Store/
19
+ s.add_bundler_dependencies
20
+ s.require_paths << 'lib'
21
+ end
22
+
@@ -0,0 +1,13 @@
1
+ require 'sprout'
2
+
3
+ lib = File.expand_path File.dirname(__FILE__)
4
+ $:.unshift lib unless $:.include?(lib)
5
+
6
+ require 'flashplayer/errors'
7
+ require 'flashplayer/module'
8
+ require 'flashplayer/mm_config'
9
+ require 'flashplayer/trust'
10
+ require 'flashplayer/log_file'
11
+ require 'flashplayer/task'
12
+ require 'flashplayer/specification'
13
+
@@ -0,0 +1,92 @@
1
+ require 'rubygems'
2
+ require 'open4'
3
+
4
+ $CLIX_WRAPPER_TARGET = File.join(File.expand_path(File.dirname(__FILE__)), 'clix_wrapper.rb')
5
+
6
+ class CLIXFlashPlayerError < StandardError; end
7
+
8
+ class CLIXFlashPlayer
9
+ VERSION = '0.1.0'
10
+
11
+ def initialize
12
+ @activate_pid = nil
13
+ @player_pid = nil
14
+ @thread = nil
15
+ end
16
+
17
+ def execute(player, swf)
18
+ cleanup
19
+ player = clean_path(player)
20
+ swf = clean_path(swf)
21
+ validate(player, swf)
22
+
23
+ if(!player.match('Contents/MacOS'))
24
+ player = File.join(player, 'Contents', 'MacOS', 'Flash Player')
25
+ end
26
+
27
+ setup_trap
28
+
29
+ @thread = Thread.new {
30
+ @player_pid = open4.popen4("#{player.split(' ').join('\ ')}")[0]
31
+ begin
32
+ raise "clix_wrapper.rb could not be found at: #{wrapper}" if !File.exists?($CLIX_WRAPPER_TARGET)
33
+ command = "ruby #{$CLIX_WRAPPER_TARGET} '#{player}' '#{swf}'"
34
+ @activate_pid, stdin, stdout, stderr = open4.popen4(command)
35
+ $stdout.puts stdout.read
36
+ error = stderr.read
37
+ raise error if !error.nil? && error != ''
38
+ Process.wait(@player_pid)
39
+ rescue StandardError => e
40
+ $stdout.puts e.to_s
41
+ kill
42
+ raise e
43
+ end
44
+ }
45
+ end
46
+
47
+ def kill
48
+ system("kill -9 #{@player_pid}")
49
+ end
50
+
51
+ def join
52
+ if(@thread.alive?)
53
+ @thread.join
54
+ end
55
+ end
56
+
57
+ def alive?
58
+ return @thread.alive?
59
+ end
60
+
61
+ private
62
+
63
+ def clean_path(path)
64
+ File.expand_path(path.gsub("'", '').gsub("\\", ''))
65
+ end
66
+
67
+ def cleanup
68
+ if(@thread && @thread.alive?)
69
+ kill
70
+ @thread.join
71
+ end
72
+ end
73
+
74
+ def validate(player, swf)
75
+ raise CLIXFlashPlayerError.new("Player must not be nil") if(player.nil? || player == '')
76
+ raise CLIXFlashPlayerError.new("Player cannot be found: '#{player}'") if(!File.exists?(player))
77
+ raise CLIXFlashPlayerError.new("SWF must not be nil") if(swf.nil? || swf == '')
78
+ raise CLIXFlashPlayerError.new("SWF cannot be found: '#{swf}'") if(!File.exists?(swf))
79
+ end
80
+
81
+ def setup_trap
82
+ # Trap the CTRL+C Interrupt signal
83
+ # Which prevents nasty exception messages
84
+ Kernel.trap('INT') do
85
+ if(@thread.alive?)
86
+ @thread.kill
87
+ end
88
+ end
89
+ end
90
+
91
+ end
92
+
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/ruby
2
+ require 'rubygems'
3
+
4
+ player = ARGV[0]
5
+ swf = ARGV[1]
6
+
7
+ raise "CLIXWrapper requires 'player' argument like:\nruby clix_wrapper [player] [swf]" if(player.nil?)
8
+ raise "CLIXWrapper could not find player at '#{player}'" if !File.exists?(player)
9
+
10
+ raise "CLIXWrapper requires 'swf' argument like:\nruby clix_wrapper [player] [swf]" if(swf.nil?)
11
+ raise "CLIXWrapper could not find swf at '#{swf}'" if !File.exists?(swf)
12
+
13
+ begin
14
+ require 'appscript'
15
+ # Give the player focus:
16
+ Appscript.app(player).activate
17
+ # Open the SWF:
18
+ Appscript.app(player).open(MacTypes::Alias.path(swf))
19
+ rescue LoadError => e
20
+ raise "\n\n[ERROR] You must install the rb-appscript gem to use the desktop debug Flash Player, you do this by running:\n\nsudo gem install rb-appscript"
21
+ end
22
+
@@ -0,0 +1,12 @@
1
+
2
+ module FlashPlayer
3
+
4
+ ##
5
+ # Had trouble finding or resolving a path.
6
+ class PathError < StandardError; end
7
+
8
+ ##
9
+ # There was a problem with an input.
10
+ class UsageError < StandardError; end
11
+ end
12
+
@@ -0,0 +1,79 @@
1
+
2
+ module FlashPlayer
3
+
4
+ class LogFile
5
+
6
+ attr_accessor :logger
7
+
8
+ def initialize
9
+ @config = MMConfig.new
10
+ @logger = $stdout
11
+ end
12
+
13
+ def tail thread
14
+ @config.create
15
+ tail_path flashlog_path, thread
16
+ end
17
+
18
+ private
19
+
20
+ def tail_path path, thread=nil
21
+ logger.puts ">> Tailing '#{path}', press CTRL+C to quit"
22
+ create_flashlog_at path
23
+ clear_flashlog_at path
24
+ read_flashlog_at path, thread
25
+ end
26
+
27
+ def read_flashlog_at path, thread=nil
28
+ thread ||= Thread.new{}
29
+ lines_put = 0
30
+
31
+ trap("INT") { thread.kill }
32
+
33
+ while thread.alive? do
34
+ File.open(path, 'r') do |file|
35
+ lines_read = 0
36
+ file.readlines.each do |line|
37
+ if(lines_read >= lines_put)
38
+ logger.puts "[trace] #{line}"
39
+ logger.flush
40
+ lines_put += 1
41
+ end
42
+ lines_read += 1
43
+ end
44
+ end
45
+ logger.flush
46
+ sleep(0.2)
47
+ end
48
+
49
+ logger.puts ""
50
+ logger.puts ">> Exiting from tailing '#{path}' at user request"
51
+ end
52
+
53
+ def flashlog_path
54
+ File.join(FlashPlayer.home, 'Logs', 'flashlog.txt')
55
+ end
56
+
57
+ def clear_flashlog_at path
58
+ File.open(path, 'w') do |f|
59
+ f.write('')
60
+ end
61
+ end
62
+
63
+ def create_flashlog_at path
64
+ if(!File.exists?(path))
65
+ FileUtils.makedirs(File.dirname(path))
66
+ FileUtils.touch(path)
67
+ end
68
+ end
69
+
70
+ end
71
+ end
72
+
73
+ desc "Tail the flashlog.txt and block"
74
+ def flashlog args
75
+ task args do
76
+ reader = FlashPlayer::LogFile.new
77
+ reader.tail
78
+ end
79
+ end
@@ -0,0 +1,88 @@
1
+
2
+ module FlashPlayer
3
+
4
+ class MMConfig
5
+ FILE_NAME = 'mm.cfg'
6
+
7
+ attr_accessor :logger
8
+
9
+ def initialize
10
+ @file_name = FILE_NAME
11
+ @logger = $stdout
12
+ end
13
+
14
+ def create
15
+ create_if_necessary_at config_path
16
+ end
17
+
18
+ private
19
+
20
+ def create_if_necessary_at path
21
+ write_config(path, content(path)) if(file_blank?(path))
22
+ end
23
+
24
+ def flashplayer_home
25
+ FlashPlayer.home
26
+ end
27
+
28
+ def config_path
29
+ if(flashplayer_home == osx_fp9_dir)
30
+ path = File.join(osx_fp9_dir, @file_name)
31
+ else
32
+ path = File.join(system_home, @file_name)
33
+ end
34
+ end
35
+
36
+ def file_blank?(file)
37
+ !File.exists?(file) || File.read(file).empty?
38
+ end
39
+
40
+ def write_config(location, content)
41
+ if(user_confirmation?(location))
42
+ File.open(location, 'w') do |f|
43
+ f.write(content)
44
+ end
45
+ logger.puts ">> Created file: " + File.expand_path(location)
46
+ location
47
+ else
48
+ raise FlashPlayer::PathError.new("Unable to create #{file_name} at: #{location}")
49
+ end
50
+ end
51
+
52
+ def content(file)
53
+ return <<EOF
54
+ ErrorReportingEnable=1
55
+ MaxWarnings=0
56
+ TraceOutputEnable=1
57
+ TraceOutputFileName=#{file}
58
+ EOF
59
+ end
60
+
61
+ def user_confirmation?(location)
62
+ puts <<EOF
63
+
64
+ Correctly configured mm.cfg file not found at: #{location}
65
+
66
+ This file is required in order to capture trace output.
67
+
68
+ Would you like this file created automatically? [Yn]
69
+
70
+ EOF
71
+ answer = $stdin.gets.chomp.downcase
72
+ return (answer == 'y' || answer == '')
73
+ end
74
+
75
+ def osx_fp9_dir
76
+ File.join(system_library, 'Application Support', 'Macromedia')
77
+ end
78
+
79
+ def system_library
80
+ Sprout.current_system.library
81
+ end
82
+
83
+ def system_home
84
+ Sprout.current_system.home
85
+ end
86
+ end
87
+ end
88
+
@@ -0,0 +1,52 @@
1
+
2
+ module FlashPlayer
3
+ NAME = 'flashplayer'
4
+
5
+ # Do this craptastic, otherwise we get a carriage return
6
+ # after our version, and that poops on our archive folder
7
+ # after downloading...
8
+ version_file = File.join(File.dirname(__FILE__), '..', '..', 'VERSION')
9
+ VERSION = File.read(version_file).gsub("\n", '')
10
+
11
+ class << self
12
+
13
+ def home
14
+ # NOTE: Look up the value every time,
15
+ # this way we're not storing state globally
16
+ # and the performance penalty is minimal...
17
+ home_paths.each do |path|
18
+ return path if File.exists?(path)
19
+ end
20
+ raise FlashPlayer::PathError.new('FlashPlayer unable to find home folder for your System')
21
+ end
22
+
23
+ def trust
24
+ File.join(home, '#Security', 'FlashPlayerTrust', 'sprout.cfg')
25
+ end
26
+
27
+ private
28
+
29
+ def system_home
30
+ Sprout.current_system.home
31
+ end
32
+
33
+ def system_library
34
+ Sprout.current_system.library
35
+ end
36
+
37
+ # Collection of the potential locations of the Flash Player Home
38
+ # For each supported Platform, the first existing location
39
+ # will be used.
40
+ def home_paths
41
+ [
42
+ File.join(system_library, 'Preferences', 'Macromedia', 'Flash Player'),
43
+ File.join(system_library, 'Application Support', 'Macromedia'),
44
+ File.join(system_home, 'Application Data', 'Macromedia', 'Flash Player'),
45
+ File.join(system_home, 'AppData', 'Roaming', 'Macromedia', 'Flash Player'),
46
+ File.join(system_home, '.macromedia', 'Flash_Player')
47
+ ]
48
+ end
49
+
50
+ end
51
+ end
52
+
@@ -0,0 +1,31 @@
1
+
2
+ Sprout::Specification.new do |s|
3
+ s.name = FlashPlayer::NAME
4
+ s.version = FlashPlayer::VERSION
5
+
6
+ s.add_remote_file_target do |t|
7
+ t.platform = :osx
8
+ t.archive_type = :zip
9
+ t.url = "http://download.macromedia.com/pub/flashplayer/updaters/10/flashplayer_10_sa_debug.app.zip"
10
+ t.md5 = "ff6824b7fd676dd1b613204221f5b5b9"
11
+ t.add_executable :flashplayer, "Flash Player Debugger.app/Contents/MacOS/Flash Player Debugger"
12
+ end
13
+ =begin
14
+ s.add_remote_file_target do |t|
15
+ t.platform = :win32
16
+ t.archive_type = :exe
17
+ t.url = "http://download.macromedia.com/pub/flashplayer/updaters/10/flashplayer_10_sa_debug.exe"
18
+ t.md5 = "4d8d58d72709f44421b2ea4e89cc30be"
19
+ t.add_executable :flashplayer, "flashplayer_10_sa_debug.exe"
20
+ end
21
+
22
+ s.add_remote_file_target do |t|
23
+ t.platform = :linux
24
+ t.archive_type = :tgz
25
+ t.url = "http://download.macromedia.com/pub/flashplayer/updaters/10/flashplayer_10_sa_debug.tar.gz"
26
+ t.md5 = "6cabe6038343374b547043d29de14417"
27
+ t.add_executable :flashplayer, "flash_player_10_linux_dev/standalone/debugger/flashplayer"
28
+ end
29
+ =end
30
+ end
31
+
@@ -0,0 +1,408 @@
1
+
2
+ module FlashPlayer
3
+
4
+ class Task
5
+
6
+ attr_accessor :input
7
+
8
+ attr_accessor :pkg_name
9
+ attr_accessor :pkg_version
10
+
11
+ def initialize
12
+ @logger = $stdout
13
+ @mm_config = MMConfig.new
14
+ @reader = LogFile.new
15
+ @trust_config = Trust.new
16
+ @process = nil
17
+
18
+ @pkg_name = FlashPlayer::NAME
19
+ @pkg_version = FlashPlayer::VERSION
20
+ end
21
+
22
+ def execute swf
23
+ update_mm_config
24
+ update_trust_config_with swf
25
+ player_thread = launch_player_with swf
26
+ tail_flashlog player_thread
27
+ end
28
+
29
+ def logger=(logger)
30
+ @logger = logger
31
+ @mm_config.logger = logger
32
+ @reader.logger = logger
33
+ @trust_config.logger = logger
34
+ end
35
+
36
+ def logger
37
+ @logger
38
+ end
39
+
40
+ private
41
+
42
+ def update_mm_config
43
+ @mm_config.create
44
+ end
45
+
46
+ def update_trust_config_with swf
47
+ @trust_config.add File.dirname(swf)
48
+ end
49
+
50
+ def clean_path path
51
+ current_system.clean_path path
52
+ end
53
+
54
+ def current_system
55
+ @current_system ||= Sprout.current_system
56
+ end
57
+
58
+ def launch_player_with swf
59
+ player = Sprout::Executable.load(:flashplayer, pkg_name, pkg_version).path
60
+ swf = clean_path swf
61
+ current_system.open_flashplayer_with player, swf
62
+ end
63
+
64
+ def tail_flashlog player_thread
65
+ @reader.tail player_thread
66
+ end
67
+ end
68
+ end
69
+
70
+ ##
71
+ # Update the native System instances
72
+ # to handle FlashPlayer launching in
73
+ # order to overcome non-cli limitations.
74
+ #
75
+ module Sprout
76
+ module System
77
+
78
+ class WinSystem
79
+ def open_flashplayer_with exe, swf
80
+ return Thread.new {
81
+ system command
82
+ }
83
+ end
84
+ end
85
+
86
+ class OSXSystem
87
+ def open_flashplayer_with exe, swf
88
+ require 'flashplayer/clix_flash_player'
89
+ @clix_player = CLIXFlashPlayer.new
90
+ @clix_player.execute(exe, swf)
91
+ return @clix_player
92
+ end
93
+ end
94
+
95
+ class UnixSystem
96
+ def open_flashplayer_with exe, swf
97
+ return Thread.new {
98
+ require 'open4'
99
+ @player_pid, stdin, stdout, stderr = Open4.popen4(command)
100
+ stdout.read
101
+ }
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ def flashplayer args
108
+ # TODO:
109
+ # This shouldn't take over the SWF task name
110
+ # but instead should be assigned a SWF.
111
+ task args do
112
+ player = FlashPlayer::Task.new
113
+ player.execute args
114
+ end
115
+ end
116
+
117
+ =begin
118
+
119
+ class FlashPlayerTask < Rake::Task
120
+ # This is the opening prelude to a collection of test results. When the
121
+ # task encounters this string in the trace output log file, it will begin
122
+ # collecting trace statements with the expectation that the following
123
+ # strings will be well-formatted XML data matching what JUnit emits for
124
+ # Cruise Control.
125
+ #
126
+ # See the lib/asunit3/asunit.framework.XMLResultPrinter for more information.
127
+ @@test_result_pre_delimiter = '<XMLResultPrinter>'
128
+
129
+ # This is the closing string that will indicate the end of test result XML data
130
+ @@test_result_post_delimiter = '</XMLResultPrinter>'
131
+
132
+ @@home = nil
133
+ @@trust = nil
134
+
135
+ def initialize(task_name, app)
136
+ super(task_name, app)
137
+ @default_gem_name = 'sprout-flashplayer-tool'
138
+ @default_gem_version = '10.22.0'
139
+ @default_result_file = 'AsUnitResults.xml'
140
+ @inside_test_result = false
141
+ end
142
+
143
+ def self.define_task(args, &block)
144
+ t = super
145
+ yield t if block_given?
146
+ t.define
147
+ end
148
+
149
+ # Local system path to the Flash Player Trust file
150
+ def FlashPlayerTask.trust
151
+ if(@@trust)
152
+ return @@trust
153
+ end
154
+ @@trust = File.join(FlashPlayerTask.home, '#Security', 'FlashPlayerTrust', 'sprout.cfg')
155
+ return @@trust
156
+ end
157
+
158
+ # Local system path to where the Flash Player stores trace output logs and trust files
159
+ def FlashPlayerTask.home
160
+ if(@@home)
161
+ return @@home
162
+ end
163
+
164
+ FlashPlayerTask.home_paths.each do |path|
165
+ if(File.exists?(path))
166
+ return @@home = path
167
+ end
168
+ end
169
+
170
+ if(@@home.nil?)
171
+ raise FlashPlayerError.new('FlashPlayer unable to find home folder for your platform')
172
+ end
173
+ return @@home
174
+ end
175
+
176
+ # Collection of the potential locations of the Flash Player Home
177
+ # For each supported Platform, the first existing location
178
+ # will be used.
179
+ def FlashPlayerTask.home_paths
180
+ return [File.join(User.library, 'Preferences', 'Macromedia', 'Flash Player'),
181
+ File.join(User.library, 'Application Support', 'Macromedia'),
182
+ File.join(User.home, 'Application Data', 'Macromedia', 'Flash Player'),
183
+ File.join(User.home, 'AppData', 'Roaming', 'Macromedia', 'Flash Player'),
184
+ File.join(User.home, '.macromedia', 'Flash_Player')]
185
+ end
186
+
187
+ # The swf parameter can be set explicitly in the block sent to this task as in:
188
+ #
189
+ # flashplayer :run do |t|
190
+ # t.swf = 'bin/SomeProject.swf'
191
+ # end
192
+ #
193
+ # Or it can be set implicitly as a rake prerequisite as follows:
194
+ #
195
+ # flashplayer :run => 'bin/SomeProject' do |t|
196
+ # end
197
+ #
198
+ def swf=(swf)
199
+ @swf = swf
200
+ end
201
+
202
+ def swf
203
+ @swf ||= nil
204
+ if(@swf.nil?)
205
+ prerequisites.each do |req|
206
+ if(req.index('.swf'))
207
+ @swf = req.to_s
208
+ break
209
+ end
210
+ end
211
+ end
212
+ return @swf
213
+ end
214
+
215
+ def gem_version=(version)
216
+ @gem_version = version
217
+ end
218
+
219
+ def gem_version
220
+ return @gem_version ||= nil
221
+ end
222
+
223
+ # Full name of the sprout tool gem that this tool task will use.
224
+ # This defaults to sprout-flashplayer-tool
225
+ def gem_name=(name)
226
+ @gem_name = name
227
+ end
228
+
229
+ def gem_name
230
+ return @gem_name ||= @default_gem_name
231
+ end
232
+
233
+ # The File where JUnit test results should be written. This value
234
+ # defaults to 'AsUnitResults.xml'
235
+ #
236
+ def test_result_file=(file)
237
+ @test_result_file = file
238
+ end
239
+
240
+ def test_result_file
241
+ @test_result_file ||= @default_result_file
242
+ end
243
+
244
+ def test_result
245
+ @test_result ||= ''
246
+ end
247
+
248
+ def define # :nodoc:
249
+ CLEAN.add(test_result_file)
250
+ end
251
+
252
+ def execute(*args)
253
+ super
254
+ raise FlashPlayerError.new("FlashPlayer task #{name} required field swf is nil") unless swf
255
+
256
+ log_file = nil
257
+
258
+ # Don't let trust or log file failures break other features...
259
+ begin
260
+ config = FlashPlayerConfig.new
261
+ log_file = config.log_file
262
+ FlashPlayerTrust.new(File.expand_path(File.dirname(swf)))
263
+
264
+ if(File.exists?(log_file))
265
+ File.open(log_file, 'w') do |f|
266
+ f.write('')
267
+ end
268
+ else
269
+ FileUtils.makedirs(File.dirname(log_file))
270
+ FileUtils.touch(log_file)
271
+ end
272
+ rescue StandardError => e
273
+ puts '[WARNING] FlashPlayer encountered an error working with the mm.cfg log and/or editing the Trust file'
274
+ end
275
+
276
+ @running_process = nil
277
+ @thread = run(gem_name, gem_version, swf)
278
+ read_log(@thread, log_file) unless log_file.nil?
279
+ @thread.join
280
+ end
281
+
282
+ def run(tool, gem_version, swf)
283
+ path_to_exe = Sprout.get_executable(tool, nil, gem_version)
284
+ target = User.clean_path(path_to_exe)
285
+ @player_pid = nil
286
+
287
+ thread_out = $stdout
288
+ command = "#{target} #{User.clean_path(swf)}"
289
+
290
+ usr = User.new()
291
+ if(usr.is_a?(WinUser) && !usr.is_a?(CygwinUser))
292
+ return Thread.new {
293
+ system command
294
+ }
295
+ elsif usr.is_a?(OSXUser)
296
+ require 'clix_flash_player'
297
+ @clix_player = CLIXFlashPlayer.new
298
+ @clix_player.execute(target, swf)
299
+ return @clix_player
300
+ else
301
+ return Thread.new {
302
+ require 'open4'
303
+ @player_pid, stdin, stdout, stderr = Open4.popen4(command)
304
+ stdout.read
305
+ }
306
+ end
307
+ end
308
+
309
+ def close
310
+ usr = User.new
311
+ if(usr.is_a?(WinUser))
312
+ Thread.kill(@thread)
313
+ elsif(usr.is_a?(OSXUser))
314
+ @clix_player.kill unless @clix_player.nil?
315
+ else
316
+ Process.kill("SIGALRM", @player_pid)
317
+ end
318
+ end
319
+
320
+ def read_log(thread, log_file)
321
+ lines_put = 0
322
+
323
+ if(log_file.nil?)
324
+ raise FlashPlayerError.new('[ERROR] Unable to find the trace output log file because the expected location was nil')
325
+ end
326
+
327
+ if(!File.exists?(log_file))
328
+ raise FlashPlayerError.new('[ERROR] Unable to find the trace output log file in the expected location: ' + log_file)
329
+ end
330
+
331
+ while(thread.alive?)
332
+ sleep(0.2)
333
+ lines_read = 0
334
+
335
+ File.open(log_file, 'r') do |file|
336
+ file.readlines.each do |line|
337
+ lines_read = lines_read + 1
338
+ if(lines_read > lines_put)
339
+ if(!parse_test_result(line, thread))
340
+ puts "[trace] #{line}"
341
+ end
342
+ $stdout.flush
343
+ lines_put = lines_put + 1
344
+ end
345
+ end
346
+ end
347
+ end
348
+ end
349
+
350
+ # Returns true if inside of a test result
351
+ def parse_test_result(line, thread)
352
+ if(@inside_test_result)
353
+ if(line.index(@@test_result_post_delimiter))
354
+ @inside_test_result = false
355
+ write_test_result(test_result)
356
+ close
357
+ examine_test_result test_result
358
+ return true
359
+ else
360
+ test_result << line
361
+ end
362
+ end
363
+
364
+ if(line.index(@@test_result_pre_delimiter))
365
+ @inside_test_result = true
366
+ end
367
+
368
+ return @inside_test_result
369
+ end
370
+
371
+ def write_test_result(result)
372
+ FileUtils.makedirs(File.dirname(test_result_file))
373
+ File.open(test_result_file, File::CREAT|File::TRUNC|File::RDWR) do |f|
374
+ f.puts(result)
375
+ end
376
+ end
377
+
378
+ def examine_test_result(result)
379
+ require 'rexml/document'
380
+ doc = nil
381
+ begin
382
+ doc = REXML::Document.new(result)
383
+ rescue REXML::ParseException => e
384
+ puts "[WARNING] Invalid test results encountered"
385
+ return
386
+ end
387
+
388
+ # Handle JUnit Failures
389
+ failures = []
390
+
391
+ doc.elements.each('/testsuites/testsuite/testsuite/testcase/error') do |element|
392
+ failures << element.text
393
+ end
394
+
395
+ doc.elements.each("/testsuites/testsuite/testsuite/testcase/failure") do |element|
396
+ failures << element.text
397
+ end
398
+
399
+ if(failures.size > 0)
400
+ raise AssertionFailure.new("[ERROR] Test Failures Encountered \n#{failures.join("\n")}")
401
+ end
402
+ end
403
+
404
+ end
405
+
406
+ =end
407
+
408
+