soda 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
data/bin/SodaSuite CHANGED
@@ -30,11 +30,13 @@
30
30
  ###############################################################################
31
31
  # Needed Ruby libs:
32
32
  ###############################################################################
33
+ require 'rubygems'
33
34
  require 'Soda'
34
35
  require 'getoptlong'
35
36
  require 'libxml'
36
37
  require 'watir'
37
38
  require 'SodaReportSummery'
39
+ require 'SodaSuiteSummary'
38
40
  require 'pp'
39
41
 
40
42
  ###############################################################################
@@ -119,46 +121,15 @@ class SodaSuite
119
121
  # None.
120
122
  #
121
123
  ###############################################################################
122
- def ExecuteTestSuite(suite, rerun = false, reruntest = nil)
124
+ def ExecuteTestSuites(suites)
123
125
  soda = nil
124
- master_result = 0
125
126
  result = nil
126
-
127
- soda = Soda::Soda.new(@SodaParams)
128
-
129
- if (reruntest != nil)
130
- SodaUtils.PrintSoda("Running rerun test setup script: "+
131
- "'#{reruntest}'.\n")
132
- soda.run(reruntest)
133
- end
134
-
135
- suite.each do |test|
136
- result = soda.run(test, rerun)
137
- if (result == -1)
138
- SodaUtils.PrintSoda("Failed executing test file: #{test}!\n",
139
- SodaUtils::ERROR)
140
- master_result = -1
141
-
142
- begin
143
- soda.browser.close()
144
- rescue Exception => e
145
- print "Exception: #{e.message}\n"
146
- ensure
147
- end
148
- soda = Soda::Soda.new(@SodaParams)
149
- end
150
- end
151
-
152
- begin
153
- soda.browser.close()
154
- rescue Exception => e
155
- print "Exception: #{e.message}\n"
156
- ensure
157
- end
158
127
 
159
- soda = nil
160
- return master_result
161
- end
128
+ soda = Soda::Soda.new(@SodaParams)
129
+ result = soda.RunAllSuites(suites)
130
+
131
+ return result
132
+ end
162
133
 
163
134
  ###############################################################################
164
135
  # Execute -- Medhod
@@ -621,6 +592,11 @@ def Main
621
592
  PrintHelp()
622
593
  end
623
594
 
595
+ if (params['suites'].length > 0 && params['resultsdir'] == nil)
596
+ SodaUtils.PrintSoda("Missing argument --resultsdir!\n")
597
+ PrintHelp()
598
+ end
599
+
624
600
  if (params['debug'])
625
601
  SodaUtils.PrintSoda("SodaSuite Params:\n")
626
602
  params.each do |k, v|
@@ -649,12 +625,7 @@ def Main
649
625
 
650
626
  if (params['suites'].length > 0)
651
627
  sweet = SodaSuite.new(params)
652
- params['suites'].each do |swt|
653
- result = sweet.ExecuteTestSuite(swt)
654
- if (result != 0)
655
- master_result = -1
656
- end
657
- end
628
+ result = sweet.ExecuteTestSuites(params['suites'])
658
629
  end
659
630
 
660
631
  if (params['test_files'].length > 0)
@@ -672,20 +643,19 @@ def Main
672
643
  end
673
644
  end
674
645
 
675
- # see if we should rerun failed tests #
676
- if (rerun_failed_test && failed_tests.length > 0)
677
- SodaUtils.PrintSoda("Rerunning failed tests.\n")
678
- sweet.ExecuteTestSuite(failed_tests, true, rerun_test_script)
679
- SodaUtils.PrintSoda("Finished rerunning failed tests.\n")
680
- end
681
-
682
646
  if (params['resultsdir'] != nil)
683
647
  begin
684
- summery = SodaReportSummery.new(params['resultsdir'],
685
- params['summaryfile'], true)
648
+ if (params['suites'].length > 0)
649
+ summary = SodaSuiteSummary.new(params['resultsdir'],
650
+ params['summaryfile'], true)
651
+ else
652
+ summery = SodaReportSummery.new(params['resultsdir'],
653
+ params['summaryfile'], true)
654
+ end
686
655
  rescue Exception => e
687
- print "Error: calling: SodaReportSummery!\n"
688
- print "StackTrace: #{e.backtrace}\n\n"
656
+ print "Error: calling: SodaReportSummery: #{e.message}\n"
657
+ print e.backtrace.join("\n")
658
+ print "\n\n"
689
659
  exit(-1)
690
660
  ensure
691
661
  end
@@ -28,6 +28,7 @@
28
28
 
29
29
  require 'rubygems'
30
30
  require 'SodaReportSummery'
31
+ require 'SodaSuiteSummary'
31
32
  require 'getoptlong'
32
33
 
33
34
  ###############################################################################
@@ -51,6 +52,10 @@ Required Flags:
51
52
  --reportdir: This flag tells #{$0} where to find the Soda log files.
52
53
 
53
54
  Optional Flags:
55
+ --usesuites: This flag say that the summary to be generated is for reports
56
+ that were created by SodaSuite using the --suite flag and not the --test
57
+ flag.
58
+
54
59
  --help: Prints this message and exits.
55
60
 
56
61
  HLP
@@ -77,10 +82,12 @@ def Main()
77
82
  reportdir = nil
78
83
  summary_file = nil
79
84
  summary_obj = nil
85
+ use_suites = false
80
86
 
81
87
  opts = GetoptLong.new(
82
88
  ['--reportdir', '-r', GetoptLong::REQUIRED_ARGUMENT],
83
- ['--help', '-h', GetoptLong::OPTIONAL_ARGUMENT]
89
+ ['--help', '-h', GetoptLong::OPTIONAL_ARGUMENT],
90
+ ['--usesuites', '-s', GetoptLong::OPTIONAL_ARGUMENT]
84
91
  )
85
92
 
86
93
  opts.quiet = true
@@ -88,6 +95,8 @@ def Main()
88
95
  case (opt)
89
96
  when "--reportdir"
90
97
  reportdir = arg
98
+ when "--usesuites"
99
+ use_suites = true
91
100
  when "--help"
92
101
  PrintHelp()
93
102
  exit(0)
@@ -103,11 +112,17 @@ def Main()
103
112
  summary_file = "#{reportdir}/summary.html"
104
113
  begin
105
114
  print "(*)Creating summary report...\n"
106
- summary_obj = SodaReportSummery.new(reportdir, summary_file, true)
115
+ if (use_suites)
116
+ summary_obj = SodaSuiteSummary.new(reportdir, summary_file, true)
117
+ else
118
+ summary_obj = SodaReportSummery.new(reportdir, summary_file, true)
119
+ end
107
120
  print "(*)Finished creating report.\n"
108
121
  print "(*)Summary File: #{summary_file}\n"
109
122
  rescue Exception => e
110
- print "(!)Error: #{e.message}!\n\n"
123
+ print "(!)Error: #{e.message}!\n"
124
+ print e.backtrace.join("\n")
125
+ print "\n\n"
111
126
  exit(2)
112
127
  ensure
113
128
  end
data/lib/Soda.rb CHANGED
@@ -57,6 +57,7 @@ require "fields/FileField"
57
57
  require "fields/LiField"
58
58
  require 'thread'
59
59
  require 'date'
60
+ require 'pp'
60
61
 
61
62
  ###############################################################################
62
63
  # Soda -- Class
@@ -2676,7 +2677,7 @@ JSCode
2676
2677
  # returns a SodaReport object.
2677
2678
  #
2678
2679
  ###############################################################################
2679
- def run(file, rerun = false)
2680
+ def run(file, rerun = false, genhtml = true)
2680
2681
  result = 0
2681
2682
  master_result = 0
2682
2683
  thread_soda = nil
@@ -2743,11 +2744,157 @@ JSCode
2743
2744
 
2744
2745
  @rep.SodaPrintCurrentReport()
2745
2746
  @rep.EndTestReport()
2746
- @rep.ReportHTML()
2747
+ @rep.ReportHTML() if (genhtml)
2747
2748
 
2748
2749
  return master_result
2749
2750
  end
2750
2751
 
2752
+ ###############################################################################
2753
+ # RunAllSuites -- Method
2754
+ # This function run a list of suite files as suites, not as tests.
2755
+ #
2756
+ # Input:
2757
+ # suites: An array of Soda suite files to be ran.
2758
+ #
2759
+ # Output:
2760
+ # returns a hash with the results from the ran suites.
2761
+ #
2762
+ ###############################################################################
2763
+ def RunAllSuites(suites)
2764
+ results = {}
2765
+ err = 0
2766
+ indent = " " * 2
2767
+ indent2 = "#{indent}" * 2
2768
+ indent3 = "#{indent}" * 4
2769
+ hostname = `hostname`
2770
+ hostname = hostname.chomp()
2771
+
2772
+ suites.each do |s|
2773
+ base_suite_name = File.basename(s)
2774
+ RestartGlobalTime()
2775
+ results[base_suite_name] = RunSuite(s)
2776
+ RestartGlobalTime()
2777
+ end
2778
+
2779
+ time = Time.now()
2780
+ time = "#{time.to_i}-#{time.usec}"
2781
+ suite_report = "#{@resultsDir}/#{hostname}-#{time}-suite.xml"
2782
+ fd = File.new(suite_report, "w+")
2783
+ fd.write("<data>\n")
2784
+
2785
+ RestartGlobalTime()
2786
+
2787
+ results.each do |k,v|
2788
+ fd.write("\t<suite>\n")
2789
+ fd.write("\t#{indent}<suitefile>#{k}</suitefile>\n")
2790
+ v.each do |testname, testhash|
2791
+ fd.write("\t#{indent2}<test>\n")
2792
+ fd.write("\t#{indent3}<testfile>#{testname}</testfile>\n")
2793
+ testhash.each do |tname, tvalue|
2794
+ if (tname == "result")
2795
+ err = -1 if (tvalue.to_i != 0)
2796
+ end
2797
+ new_name = "#{tname}"
2798
+ new_name = new_name.gsub(" ", "_")
2799
+ fd.write("\t#{indent3}<#{new_name}>#{tvalue}</#{new_name}>\n")
2800
+ end
2801
+ fd.write("\t#{indent2}</test>\n")
2802
+ end
2803
+ fd.write("\t</suite>\n")
2804
+ end
2805
+ fd.write("</data>\n")
2806
+ fd.close()
2807
+
2808
+ RestartGlobalTime()
2809
+
2810
+ return err
2811
+ end
2812
+
2813
+ ###############################################################################
2814
+ #
2815
+ ###############################################################################
2816
+ def RunSuite(suitefile)
2817
+ parser = nil
2818
+ doc = nil
2819
+ result = {}
2820
+ tests = []
2821
+ setup_test = nil
2822
+ cleanup_test = nil
2823
+ setup_results = 0
2824
+
2825
+ begin
2826
+ parser = LibXML::XML::Parser.file(suitefile)
2827
+ doc = parser.parse()
2828
+ doc = doc.root()
2829
+
2830
+ doc.each do |node|
2831
+ next if (node.name !~ /script/)
2832
+ attrs = node.attributes()
2833
+ attrs = attrs.to_h()
2834
+
2835
+ if (attrs.key?('file'))
2836
+ base_name = File.basename(attrs['file'])
2837
+ if (base_name =~ /^setup/)
2838
+ setup_test = attrs['file']
2839
+ elsif (base_name =~ /^cleanup/)
2840
+ cleanup_test = attrs['file']
2841
+ else
2842
+ tests.push(attrs['file'])
2843
+ end
2844
+ elsif (attrs.key?('fileset'))
2845
+ files = File.join(attrs['fileset'], "*.xml")
2846
+ files = Dir.glob(files)
2847
+ files.each do |f|
2848
+ tests.push(f)
2849
+ end
2850
+ end
2851
+ end
2852
+ rescue Exception => e
2853
+ print "ERROR: #{e.message}!\n"
2854
+ print e.backtrace.join("\n")
2855
+ result = nil
2856
+ ensure
2857
+ end
2858
+
2859
+
2860
+ if (setup_test != nil)
2861
+ setup_result = run(setup_test, false, false)
2862
+ if (setup_result != 0)
2863
+ SodaUtils.PrintSoda("Failed calling setup test: "+
2864
+ "'#{setup_test}'!\n", SodaUtils::ERROR)
2865
+ result[setup_test] = {'result' => -1}
2866
+ setup_result = false
2867
+ else
2868
+ setup_result = true
2869
+ result[setup_test] = {'result' => 0}
2870
+ end
2871
+ else
2872
+ setup_result = true
2873
+ end
2874
+
2875
+ if (setup_result)
2876
+ tests.each do |test|
2877
+ result[test] = {}
2878
+ result[test]['result'] = run(test, false)
2879
+ result[test].merge!(@rep.GetRawResults)
2880
+ @rep.ZeroTestResults()
2881
+ end
2882
+ end
2883
+
2884
+ if (cleanup_test != nil)
2885
+ cleanup_result = run(cleanup_test, false, false)
2886
+ if (cleanup_result != 0)
2887
+ SodaUtils.PrintSoda("Failed calling cleanup test: "+
2888
+ "'#{cleanup_test}'!\n", SodaUtils::ERROR)
2889
+ result[cleanup_test] = {'result' => -1}
2890
+ else
2891
+ result[cleanup_test] = {'result' => 0}
2892
+ end
2893
+ end
2894
+
2895
+ return result
2896
+ end
2897
+
2751
2898
  ###############################################################################
2752
2899
  # GetCurrentBrowser -- Method
2753
2900
  # This method get the current Watir browser object.
data/lib/SodaReporter.rb CHANGED
@@ -45,12 +45,17 @@ require 'SodaLogReporter'
45
45
  # simple reporter class that tracks asserts, exceptions, and log messages
46
46
  ###############################################################################
47
47
  class SodaReporter
48
+ attr_accessor :asserts_count, :js_error_count, :css_error_count,
49
+ :assertFails_count, :exception_count, :test_skip_count,
50
+ :test_blocked_count, :test_watchdog_count
48
51
 
49
52
  def initialize(testfile, savehtml = false, resultsdir = nil, debug = 0,
50
53
  callback = nil, rerun = false)
51
54
  @sodatest_file = testfile
52
55
  @saveHtmlFiles = savehtml
53
56
  @debug = debug
57
+ @start_time = nil
58
+ @end_time = nil
54
59
  @js_error_count = 0
55
60
  @css_error_count = 0
56
61
  @asserts_count = 0
@@ -116,8 +121,76 @@ class SodaReporter
116
121
  log("[New Test]\n")
117
122
  log("Starting soda test: #{@sodatest_file}\n")
118
123
  log("Saving HTML files => #{@saveHtmlFiles.to_s()}.\n")
124
+ @start_time = Time.now().strftime("%m/%d/%Y-%H:%M:%S")
119
125
  end
120
126
 
127
+ ###############################################################################
128
+ # GetRawResults -- Method
129
+ # This method gets test results data.
130
+ #
131
+ # Input:
132
+ # None.
133
+ #
134
+ # Output:
135
+ # returns a hash of test report data.
136
+ #
137
+ ###############################################################################
138
+ def GetRawResults()
139
+
140
+ @end_time = Time.now().strftime("%m/%d/%Y-%H:%M:%S") if (@end_time == nil)
141
+ start = DateTime.strptime("#{@start_time}",
142
+ "%m/%d/%Y-%H:%M:%S")
143
+ stop = DateTime.strptime("#{@end_time}",
144
+ "%m/%d/%Y-%H:%M:%S")
145
+ total_time = (stop - start)
146
+
147
+ results = {
148
+ 'Test Assert Count' => @asserts_count,
149
+ 'Test JavaScript Error Count' => @js_error_count,
150
+ 'Test CSS Error Count' => @css_error_count,
151
+ 'Test Assert Failures' => @assertFails_count,
152
+ 'Test Exceptions' => @exception_count,
153
+ 'Test Skip Count' => @test_skip_count,
154
+ 'Test Blocked Count' => @test_blocked_count,
155
+ 'Test WatchDog Count' => @test_watchdog_count,
156
+ 'Test Warning Count' => @test_warning_count,
157
+ 'Test Event Count' => @total,
158
+ 'Test Start Time' => @start_time,
159
+ 'Test Stop Time' => @end_time
160
+ }
161
+
162
+ return results
163
+ end
164
+
165
+ ###############################################################################
166
+ # ZeroTestResults -- Method
167
+ # This method zero's out needed reported values for a test when running
168
+ # a suite. Really this is only needed until SugarCRM internally starts
169
+ # using real suites and I can go back to undo the hack's put in place to
170
+ # do suite reporting when using the --test option to run suites.
171
+ #
172
+ # Input:
173
+ # None.
174
+ #
175
+ # Output:
176
+ # None.
177
+ #
178
+ ###############################################################################
179
+ def ZeroTestResults()
180
+ @asserts_count = 0
181
+ @js_error_count = 0
182
+ @css_error_count = 0
183
+ @assertFails_count = 0
184
+ @exception_count = 0
185
+ @test_skip_count = 0
186
+ @test_blocked_count = 0
187
+ @test_watchdog_count = 0
188
+ @test_warning_count = 0
189
+ @total = 0
190
+ @start_time = nil
191
+ @end_time = nil
192
+ end
193
+
121
194
  ###############################################################################
122
195
  # GetResultDir -- Method
123
196
  # This method returns the current result dir.
@@ -398,6 +471,7 @@ class SodaReporter
398
471
  NFSRenameHack(@log_filename, tmp_logfile)
399
472
 
400
473
  @log_filename = tmp_logfile
474
+ @end_time = Time.now().strftime("%m/%d/%Y-%H:%M:%S")
401
475
  end
402
476
 
403
477
  ###############################################################################