rutema 0.9.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,13 @@
1
+ == 1.0.0 / 2008-10-06
2
+ * DB schema change: title and description added to scenario table
3
+ * footer parameter for the email reporter
4
+ * Specification titles included in the text reports
5
+ * When parsing multiple specifications a duplicate name will now generate a parser error
6
+ * rutema_updater upgrades existing databases, check http://patir.rubyforge.org/rutema/update_090_to_100.html
7
+ * rutemah scrapped
8
+ * rutemax logs it's version always
9
+ * activerecord 2.1.1 is now in use
10
+
1
11
  == 0.9.3 / 2008-09-10
2
12
  * Sorted result summaries in the text and the email reporter
3
13
  * ActiveRecordReporter registration logging
data/Manifest.txt CHANGED
@@ -3,13 +3,12 @@ History.txt
3
3
  Manifest.txt
4
4
  README.txt
5
5
  Rakefile
6
- bin/rutemah
7
6
  bin/rutemax
7
+ bin/rutema_upgrader
8
8
  distro_test.sh
9
9
  lib/rutema/configuration.rb
10
10
  lib/rutema/db.rb
11
11
  lib/rutema/gems.rb
12
- lib/rutema/historian.rb
13
12
  lib/rutema/model.rb
14
13
  lib/rutema/reporter.rb
15
14
  lib/rutema/reporters/activerecord.rb
@@ -19,11 +18,10 @@ lib/rutema/reporters/text.rb
19
18
  lib/rutema/specification.rb
20
19
  lib/rutema/system.rb
21
20
  selftest.sh
21
+ test/data/sample09.db
22
22
  test/distro_test/config/database.rutema
23
- test/distro_test/config/database.rutemah
24
23
  test/distro_test/config/full.rutema
25
24
  test/distro_test/config/jruby.rutema
26
- test/distro_test/config/jruby.rutemah
27
25
  test/distro_test/config/minimal.rutema
28
26
  test/distro_test/specs/T001.spec
29
27
  test/distro_test/specs/T002.spec
@@ -35,8 +33,8 @@ test/distro_test/specs/no_title.spec
35
33
  test/distro_test/specs/sample.spec
36
34
  test/rutema.rutema
37
35
  test/rutema.spec
36
+ test/migration.spec
38
37
  test/test_configuration.rb
39
- test/test_historian.rb
40
38
  test/test_model.rb
41
39
  test/test_reporter.rb
42
40
  test/test_specification.rb
data/Rakefile CHANGED
@@ -14,13 +14,13 @@ Hoe.new('rutema', "#{Rutema::Version::STRING}") do |p|
14
14
  p.description = p.paragraphs_of('README.txt', 1..5).join("\n\n")
15
15
  p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
16
16
  p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
17
- p.extra_deps<<['patir',">=0.5.7"]
17
+ p.extra_deps<<['patir',">=0.6.0"]
18
18
  p.extra_deps<<['highline']
19
19
  p.extra_deps<<['mailfactory']
20
- p.extra_deps<<['activerecord','=2.0.2']
20
+ p.extra_deps<<['activerecord','=2.1.1']
21
21
  p.extra_deps<<['ruport']
22
22
  p.extra_deps<<['acts_as_reportable']
23
- p.spec_extras={:executables=>["rutemax","rutemah"],
23
+ p.spec_extras={:executables=>["rutemax","rutema_upgrader"],
24
24
  :default_executable=>"rutemax"}
25
25
  end
26
26
 
@@ -0,0 +1,74 @@
1
+ # Copyright (c) 2008 Vassilis Rizopoulos. All rights reserved.
2
+ require 'rubygems'
3
+ require 'rutema/system'
4
+ require 'patir/base'
5
+
6
+ #Parses the command line arguments
7
+ def parse_command_line args
8
+ args.options do |opt|
9
+ opt.on("Usage:")
10
+ opt.on("rutema_upgrader [options] config_file")
11
+ opt.on("Options:")
12
+ opt.on("--debug", "-d","Turns on debug messages") { $DEBUG=true }
13
+ opt.on("-v", "--version","Displays the version") { $stdout.puts("v#{Version::STRING}");exit 0 }
14
+ opt.on("--help", "-h", "-?", "This text") { $stdout.puts opt; exit 0 }
15
+ opt.parse!
16
+ #and now the rest
17
+ if args.empty?
18
+ $stdout.puts opt
19
+ exit 0
20
+ else
21
+ return args.shift
22
+ end
23
+ end
24
+ end
25
+ logger=Patir.setup_logger
26
+ config_file=parse_command_line(ARGV)
27
+ begin
28
+ raise "No configuration file defined!" if !config_file
29
+ configuration=Rutema::RutemaXConfigurator.new(config_file,logger).configuration
30
+ Dir.chdir(File.dirname(config_file)) do
31
+ coordinator=Rutema::Coordinator.new(configuration,logger)
32
+ specs=coordinator.parse_all_specifications
33
+ specifications=Hash.new
34
+ specs.each do |s|
35
+ specifications[s.name]=[s.title,s.description]
36
+ end
37
+ database=nil
38
+ configuration.reporters.each do |rep|
39
+ if rep[:class]==Rutema::ActiveRecordReporter
40
+ database=rep[:db][:database]
41
+ break
42
+ end
43
+ end
44
+ if database && File.exists?(database)
45
+ Rutema.connect_to_ar(database,logger,false)
46
+ test_scenario=Rutema::Model::Scenario.find(:first)
47
+ if test_scenario.respond_to?(:title) && test_scenario.respond_to?(:description)
48
+ logger.info("Schema appears updated")
49
+ else
50
+ logger.info("Updating schema")
51
+ #Rutema::Model::UpgradeV9toV10.up
52
+ end
53
+ logger.info("Setting title and description values")
54
+ Rutema::Model::Scenario.find(:all).each do |sc|
55
+ if specifications[sc.name]
56
+ logger.info("Setting columns for #{sc.name}:#{sc.id}")
57
+ sc.title=specifications[sc.name][0]
58
+ sc.description=specifications[sc.name][1]
59
+ sc.save
60
+ end
61
+ end
62
+ else
63
+ logger.fatal("Database '#{database}' does not exist")
64
+ end
65
+ end
66
+ rescue Patir::ConfigurationException
67
+ logger.debug($!)
68
+ logger.fatal("Configuration error '#{$!.message}'")
69
+ exit 1
70
+ rescue
71
+ logger.debug($!)
72
+ logger.fatal("#{$!.message}")
73
+ exit 1
74
+ end
data/bin/rutemax CHANGED
File without changes
data/distro_test.sh CHANGED
@@ -1,7 +1,6 @@
1
1
  #!/bin/sh
2
2
  rutemax -c test/distro_test/config/minimal.rutema
3
- rutemax -c test/distro_test/config/database.rutema
4
- rutemah -c test/distro_test/config/database.rutemah all
3
+ rutemax -c test/distro_test/config/database.rutema
5
4
  rutemax -c test/distro_test/config/full.rutema --check
6
5
  rutemax -c test/distro_test/config/full.rutema
7
6
  #rutemax -c test/distro_test/config/minimal.rutema --step
@@ -63,7 +63,6 @@ module Rutema
63
63
 
64
64
  #Hash values for passing data to the system. It's supposed to be used in the reporters and contain
65
65
  #values such as version numbers, tester names etc.
66
- #
67
66
  def context= definition
68
67
  @context||=Hash.new
69
68
  raise Patir::ConfigurationException,"Only accepting hash values as context_data" unless definition.kind_of?(Hash)
@@ -72,7 +71,7 @@ module Rutema
72
71
  end
73
72
  end
74
73
 
75
- #Adds the files to the specification available to RutemaX.
74
+ #Adds the files to the specifications available to RutemaX.
76
75
  def tests= array_of_files
77
76
  @tests||=Array.new
78
77
  @tests+=array_of_files
@@ -117,18 +116,6 @@ module Rutema
117
116
  end
118
117
  end
119
118
 
120
- #This module defines the "configuration directives" used in the configuration of RutemaH
121
- module RutemaHConfiguration
122
- #The configuration keys for the historian's database. This is adapter dependent.
123
- #
124
- #Currently SQLite is supported on MRI and h2 on jRuby.
125
- #
126
- #:database defines the name of the file (or directory for h2) to use for the database and is the only required key.
127
- def db= definition
128
- raise Patir::ConfigurationException,"required key :database is missing from #{definition}" unless definition[:database]
129
- @db=definition
130
- end
131
- end
132
119
  #This class reads a RutemaX configuration file
133
120
  class RutemaXConfigurator<Patir::Configurator
134
121
  include RutemaXConfiguration
@@ -161,20 +148,4 @@ module Rutema
161
148
  end
162
149
  end
163
150
 
164
- #This class reads a RutemaH configuration file
165
- class RutemaHConfigurator<RutemaXConfigurator
166
- include RutemaHConfiguration
167
- def initialize config_file,logger=nil
168
- super(config_file,logger)
169
- end
170
-
171
- def configuration
172
- cfg=super
173
- Dir.chdir(File.dirname(config_file)) do |path|
174
- @db[:database]=File.expand_path(@db[:database])
175
- cfg.db=@db
176
- end
177
- return cfg
178
- end
179
- end
180
151
  end
data/lib/rutema/gems.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  require 'rubygems'
2
- gem 'activerecord','=2.0.2'
2
+ gem 'activerecord','=2.1.1'
3
3
  require 'active_record'
4
+ gem 'patir','>=0.5.8'
4
5
  require 'patir/configuration'
5
6
  require 'patir/command'
6
7
  require 'patir/base'
8
+
7
9
  require 'ruport/acts_as_reportable'
8
10
  require 'mailfactory'
9
11
  require 'highline'
data/lib/rutema/model.rb CHANGED
@@ -32,6 +32,8 @@ module Rutema
32
32
  t.column :start_time, :datetime,:null=>false
33
33
  t.column :stop_time, :datetime
34
34
  t.column :version, :string
35
+ t.column :title, :string
36
+ t.column :description, :string
35
37
  end
36
38
 
37
39
  create_table :steps do |t|
@@ -56,7 +58,7 @@ module Rutema
56
58
  has_many :scenarios
57
59
  has_many :parse_errors
58
60
  serialize :context
59
- acts_as_reportable
61
+ acts_as_reportable
60
62
  end
61
63
 
62
64
  class Scenario<ActiveRecord::Base
@@ -74,5 +76,19 @@ module Rutema
74
76
  belongs_to :run
75
77
  acts_as_reportable
76
78
  end
79
+
80
+ class UpgradeV9toV10<ActiveRecord::Migration
81
+ def self.up
82
+ puts("Adding new columns")
83
+ add_column(:scenarios, :title, :string,{:default=>"title"})
84
+ add_column(:scenarios, :description, :string,{:default=>"description"})
85
+ puts("Updating existing scenario entries")
86
+ Rutema::Model::Scenario.find(:all).each do |sc|
87
+ puts "Updating scenario #{sc.id}"
88
+ sc.title="#{name}"
89
+ sc.description="#{name}"
90
+ end
91
+ end
92
+ end
77
93
  end
78
94
  end
@@ -25,7 +25,7 @@ module Rutema
25
25
  @dbfile=database_configuration[:database]
26
26
  end
27
27
  Rutema.connect_to_ar(@dbfile,@logger)
28
- @logger.info("Reporter '#{self.to_s}' registered")
28
+ @logger.info("Reporter #{self.to_s} registered")
29
29
  end
30
30
 
31
31
  #We get all the data for a Rutema::Model::Run entry in here.
@@ -53,8 +53,12 @@ module Rutema
53
53
  spec=specifications[scenario.sequence_name]
54
54
  if spec
55
55
  sc.version=spec.version if spec.has_version?
56
+ sc.title=spec.title
57
+ sc.description=spec.description
56
58
  else
57
59
  @logger.debug("Could not find specification for #{scenario.sequence_name}")
60
+ sc.title=scenario.sequence_name
61
+ sc.description=""
58
62
  end
59
63
  if scenario.strategy==:attended
60
64
  sc.attended=true
@@ -43,6 +43,8 @@ module Rutema
43
43
  #customize
44
44
  @subject=definition[:subject]
45
45
  @subject||=""
46
+ @footer=definition[:footer]
47
+ @footer||=""
46
48
  @logger.info("Reporter '#{self.to_s}' registered")
47
49
  end
48
50
 
@@ -54,6 +56,7 @@ module Rutema
54
56
  def report specifications,runner_states,parse_errors,configuration
55
57
  @mail.subject = "#{@subject}"
56
58
  @mail.text = TextReporter.new.report(specifications,runner_states,parse_errors,configuration)
59
+ @mail.text << "\n\n#{@footer}"
57
60
  begin
58
61
  if @recipients.empty?
59
62
  @logger.error("No recipients for the report mail")
@@ -27,15 +27,15 @@ module Rutema
27
27
  msg<<"\nNo scenarios in this run" if runner_states.empty?
28
28
  msg<<"\nOne scenario in the current run:" if runner_states.size==1
29
29
  msg<<"\n#{runner_states.size} scenarios in the current run:" if runner_states.size>1
30
- rstates=runner_states.sort_by{ |state| state.sequence_id.to_s }
30
+ rstates=runner_states.sort_by do |state|
31
+ state.sequence_id.to_i
32
+ end
31
33
  rstates.each do |state|
34
+ msg<<"\n#{specifications[state.sequence_name].title}" if specifications[state.sequence_name]
32
35
  msg<<"\n#{state.summary}\n---"
33
36
  end
34
37
  return msg
35
38
  end
36
- def sorted_scenario_report runner_states
37
-
38
- end
39
39
  end
40
40
 
41
41
  end
data/lib/rutema/system.rb CHANGED
@@ -9,9 +9,9 @@ require 'rutema/gems'
9
9
  module Rutema
10
10
  #This module defines the version numbers for the library
11
11
  module Version
12
- MAJOR=0
13
- MINOR=9
14
- TINY=3
12
+ MAJOR=1
13
+ MINOR=0
14
+ TINY=0
15
15
  STRING=[ MAJOR, MINOR, TINY ].join( "." )
16
16
  end
17
17
  #The Elements module provides the namespace for the various modules adding parser functionality
@@ -61,7 +61,11 @@ module Rutema
61
61
  class ParserError<RuntimeError
62
62
  end
63
63
 
64
- #Base class that bombs out when used....
64
+ #Base class that bombs out when used.
65
+ #
66
+ #Initialze expects a hash and as a base implementation assigns :logger as the internal logger.
67
+ #
68
+ #By default the internal logger will log to the console if no logger is provided.
65
69
  class SpecificationParser
66
70
  attr_reader :configuration
67
71
  def initialize params
@@ -313,7 +317,18 @@ module Rutema
313
317
  @configuration.context.end_time=Time.now
314
318
  @logger.info("Run completed in #{@configuration.context.end_time-@configuration.context.start_time}s")
315
319
  end
316
-
320
+
321
+ #Parses all specification files defined in the configuration
322
+ def parse_all_specifications
323
+ @configuration.tests.collect do |t|
324
+ begin
325
+ parse_specification(t)
326
+ rescue
327
+ @logger.debug($!)
328
+ @logger.error($!.message)
329
+ end
330
+ end.compact
331
+ end
317
332
  #Delegates reporting to all configured reporters spawning one thread per reporter
318
333
  #
319
334
  #It then joins the threads and returns when all of them are finished.
@@ -377,7 +392,13 @@ module Rutema
377
392
  @parsed_files<<filename
378
393
  @parsed_files.uniq!
379
394
  spec=@parser.parse_specification(spec_file)
380
- @specifications[spec.name]=spec
395
+ if @specifications[spec.name]
396
+ msg="Duplicate specification name '#{spec.name}' in '#{spec_file}'"
397
+ @logger.error(msg)
398
+ @parse_errors<<{:filename=>spec_file,:error=>msg}
399
+ else
400
+ @specifications[spec.name]=spec
401
+ end
381
402
  rescue ParserError
382
403
  @logger.error("Error parsing '#{spec_file}': #{$!.message}")
383
404
  @parse_errors<<{:filename=>filename,:error=>$!.message}
@@ -389,16 +410,6 @@ module Rutema
389
410
  end
390
411
  return spec
391
412
  end
392
- def parse_all_specifications
393
- @configuration.tests.collect do |t|
394
- begin
395
- parse_specification(t)
396
- rescue
397
- @logger.debug($!)
398
- @logger.error($!.message)
399
- end
400
- end.compact
401
- end
402
413
 
403
414
  def run_scenarios specs
404
415
  specs.compact!
@@ -591,6 +602,7 @@ module Rutema
591
602
  def initialize command_line_args
592
603
  parse_command_line(command_line_args)
593
604
  @logger=Patir.setup_logger(@log_file)
605
+ @logger.info("rutemax v#{Version::STRING}")
594
606
  begin
595
607
  raise "No configuration file defined!" if !@config_file
596
608
  @configuration=RutemaXConfigurator.new(@config_file,@logger).configuration
@@ -618,7 +630,7 @@ module Rutema
618
630
  opt.on("--log FILE", "-l FILE",String,"Redirects the log output to FILE") { |@log_file|}
619
631
  opt.on("--check","Runs just the check test"){@check=true}
620
632
  opt.on("--step","Runs test cases step by step"){@step=true}
621
- opt.on("-v", "--version","Displays the version") { $stdout.puts("v#{Version::STRING}");exit 0 }
633
+ opt.on("-v", "--version","Displays the version") { $stdout.puts("rutemax v#{Version::STRING}");exit 0 }
622
634
  opt.on("--help", "-h", "-?", "This text") { $stdout.puts opt; exit 0 }
623
635
  opt.on("The commands are:")
624
636
  opt.on("\tall - Runs all tests")
Binary file
@@ -0,0 +1,9 @@
1
+ <specification name="TR002">
2
+ <title>Migration v0.9 to v1.0</title>
3
+ <description>Test that the database migration code is succesfull between versions 0.9.0 and 1.0.0</description>
4
+ <scenario>
5
+ <command cmd="cp data/sample09.db data/test.db"/>
6
+ <command cmd="rutema_upgrader data/test.db"/>
7
+ <command cmd="rm data/test.db"/>
8
+ </scenario>
9
+ </specification>
data/test/rutema.rutema CHANGED
@@ -1,3 +1,3 @@
1
1
  configuration.parser={:class=>Rutema::MinimalXMLParser}
2
2
  configuration.reporter={:class=>Rutema::ActiveRecordReporter, :db=>{:database=>"rutema.db"}}
3
- configuration.tests=["rutema.spec"]
3
+ configuration.tests=["rutema.spec","migration.spec"]
data/test/rutema.spec CHANGED
@@ -1,11 +1,10 @@
1
1
  <specification name="TR001">
2
2
  <title>Rutema self hosting test</title>
3
- <description>Test that rutemax and rutemah are usable as steps in a specification using the distro test example</description>
3
+ <description>Test that rutemax is usable as a step in a specification using the distro test example</description>
4
4
  <scenario>
5
5
  <command cmd="rutemax -c distro_test/config/minimal.rutema"/>
6
6
  <command cmd="rutemax -c distro_test/config/database.rutema"/>
7
7
  <command cmd="rutemax -c distro_test/config/database.rutema distro_test/specs/T001.spec"/>
8
8
  <command cmd="rutemax -c distro_test/config/full.rutema"/>
9
- <command cmd="rutemah -c distro_test/config/database.rutemah all"/>
10
9
  </scenario>
11
10
  </specification>
@@ -32,14 +32,7 @@ module TestRutema
32
32
  assert_not_nil(cfg.tests)
33
33
  assert_not_nil(cfg.context)
34
34
  end
35
- def test_rutemah_configuration
36
- cfg=nil
37
- #load the valid configuration
38
- assert_nothing_raised() { cfg=Rutema::RutemaHConfigurator.new("distro_test/config/database.rutemah").configuration}
39
- assert_not_nil(cfg.db)
40
- assert_nothing_raised() { cfg=Rutema::RutemaHConfigurator.new("distro_test/config/jruby.rutemah").configuration}
41
- assert_not_nil(cfg.db)
42
- end
35
+
43
36
  def test_specification_paths
44
37
  cfg=Rutema::RutemaXConfigurator.new("distro_test/config/full.rutema").configuration
45
38
  assert_not_nil(cfg.tests)
@@ -67,33 +67,57 @@ module TestRutema
67
67
  st.step=MockCommand.new(2)
68
68
  st.step=MockCommand.new(3)
69
69
  @status=[st]
70
+
70
71
  end
71
72
  def test_new
73
+ spec=mock()
74
+ spec.expects(:title).returns("A test sequence")
75
+ specs={"test_seq"=>spec}
72
76
  definition={:server=>"localhost",:port=>25,:recipients=>["test"],:sender=>"rutema",:subject=>"test"}
73
77
  r=Rutema::EmailReporter.new(definition)
74
78
  Net::SMTP.expects(:start).times(2)
75
- assert_nothing_raised() { puts r.report(nil,@status,@parse_errors,nil) }
76
- assert_nothing_raised() { puts r.report(nil,[],[],nil) }
79
+ assert_nothing_raised() { puts r.report(specs,@status,@parse_errors,nil) }
80
+ assert_nothing_raised() { puts r.report(specs,[],[],nil) }
77
81
  end
78
82
 
79
83
  def test_multiple_scenarios
84
+ #The status mocks
80
85
  status1=mock()
81
- status1.expects(:summary).returns("test1. Status - error. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - warning\n\t3:'try' - error")
82
- status1.expects(:sequence_id).returns(2)
86
+ status1.expects(:summary).returns("test6. Status - error. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - warning\n\t3:'try' - error")
87
+ status1.expects(:sequence_id).returns(6)
88
+ status1.expects(:sequence_name).returns("T2").times(2)
83
89
  status2=mock()
84
- status2.expects(:summary).returns("test2. Status - success. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - success\n\t3:'try' - success")
85
- status2.expects(:sequence_id).returns(1)
90
+ status2.expects(:summary).returns("test10. Status - success. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - success\n\t3:'try' - success")
91
+ status2.expects(:sequence_id).returns(10)
92
+ status2.expects(:sequence_name).returns("T1").times(2)
86
93
  status3=mock()
87
- status3.expects(:summary).returns("test3. Status - success. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - success\n\t3:'try' - success")
94
+ status3.expects(:summary).returns("testNil. Status - success. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - success\n\t3:'try' - success")
88
95
  status3.expects(:sequence_id).returns(nil)
96
+ status3.expects(:sequence_name).returns(nil)
89
97
  status4=mock()
90
- status4.expects(:summary).returns("test4. Status - success. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - success\n\t3:'try' - success")
91
- status4.expects(:sequence_id).returns("1s")
92
- @status=[status1,status2,status3,status4]
98
+ status4.expects(:summary).returns("test10s. Status - success. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - success\n\t3:'try' - success")
99
+ status4.expects(:sequence_id).returns("10s")
100
+ status4.expects(:sequence_name).returns("Setup").times(2)
101
+ status5=mock()
102
+ status5.expects(:summary).returns("test60. Status - error. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - warning\n\t3:'try' - error")
103
+ status5.expects(:sequence_id).returns(60)
104
+ status5.expects(:sequence_name).returns("T1").times(2)
105
+ stati=[status1,status2,status3,status4,status5]
106
+ #mock the mailing code
93
107
  definition={:server=>"localhost",:port=>25,:recipients=>["test"],:sender=>"rutema",:subject=>"test"}
94
108
  r=Rutema::EmailReporter.new(definition)
95
109
  Net::SMTP.expects(:start)
96
- assert_nothing_raised() { puts r.report(nil,@status,@parse_errors,nil) }
110
+ #The specification mocks
111
+ spec1=mock()
112
+ spec1.expects(:title).times(2).returns("T1")
113
+ spec2=mock()
114
+ spec2.expects(:title).returns("T2")
115
+ spec3=mock()
116
+ spec3.expects(:title).returns("Setup")
117
+ specs={"T1"=>spec1,
118
+ "T2"=>spec2,
119
+ "Setup"=>spec3}
120
+ assert_nothing_raised() { puts r.report(specs,stati,@parse_errors,nil) }
97
121
  end
98
122
  end
99
123
  end
data/test/test_system.rb CHANGED
@@ -120,19 +120,27 @@ EOT
120
120
  conf=OpenStruct.new(:parser=>{:class=>Rutema::BaseXMLParser},
121
121
  :tools=>{},
122
122
  :paths=>{},
123
- :tests=>[],
123
+ :tests=>["distro_test/specs/sample.spec","distro_test/specs/duplicate_name.spec"],
124
124
  :reporters=>[],
125
125
  :context=>OpenStruct.new)
126
126
  coord=nil
127
- assert_nothing_raised() { coord=Rutema::Coordinator.new(conf) }
128
127
  assert_nothing_raised() do
128
+ coord=Rutema::Coordinator.new(conf)
129
129
  coord.run(:all)
130
+ assert_equal(1,coord.parse_errors.size)
131
+ coord=Rutema::Coordinator.new(conf)
130
132
  coord.run(:attended)
133
+ assert_equal(1,coord.parse_errors.size)
134
+ coord=Rutema::Coordinator.new(conf)
131
135
  coord.run(:unattended)
136
+ assert_equal(1,coord.parse_errors.size)
137
+ coord=Rutema::Coordinator.new(conf)
132
138
  coord.run("distro_test/specs/sample.spec")
139
+ assert_equal(0,coord.parse_errors.size)
140
+ coord=Rutema::Coordinator.new(conf)
133
141
  coord.run("distro_test/specs/no_title.spec")
142
+ assert_equal(1,coord.parse_errors.size)
134
143
  end
135
- assert_equal(1,coord.parse_errors.size)
136
144
  puts coord.to_s if $DEBUG
137
145
  end
138
146
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rutema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vassilis Rizopoulos
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-09-10 00:00:00 +02:00
12
+ date: 2008-10-06 00:00:00 +02:00
13
13
  default_executable: rutemax
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.5.7
23
+ version: 0.6.0
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: highline
@@ -50,7 +50,7 @@ dependencies:
50
50
  requirements:
51
51
  - - "="
52
52
  - !ruby/object:Gem::Version
53
- version: 2.0.2
53
+ version: 2.1.1
54
54
  version:
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: ruport
@@ -86,7 +86,7 @@ description: "== DESCRIPTION: rutema is a test execution tool with a twist. It a
86
86
  email: riva@braveworld.net
87
87
  executables:
88
88
  - rutemax
89
- - rutemah
89
+ - rutema_upgrader
90
90
  extensions: []
91
91
 
92
92
  extra_rdoc_files:
@@ -100,13 +100,12 @@ files:
100
100
  - Manifest.txt
101
101
  - README.txt
102
102
  - Rakefile
103
- - bin/rutemah
104
103
  - bin/rutemax
104
+ - bin/rutema_upgrader
105
105
  - distro_test.sh
106
106
  - lib/rutema/configuration.rb
107
107
  - lib/rutema/db.rb
108
108
  - lib/rutema/gems.rb
109
- - lib/rutema/historian.rb
110
109
  - lib/rutema/model.rb
111
110
  - lib/rutema/reporter.rb
112
111
  - lib/rutema/reporters/activerecord.rb
@@ -116,11 +115,10 @@ files:
116
115
  - lib/rutema/specification.rb
117
116
  - lib/rutema/system.rb
118
117
  - selftest.sh
118
+ - test/data/sample09.db
119
119
  - test/distro_test/config/database.rutema
120
- - test/distro_test/config/database.rutemah
121
120
  - test/distro_test/config/full.rutema
122
121
  - test/distro_test/config/jruby.rutema
123
- - test/distro_test/config/jruby.rutemah
124
122
  - test/distro_test/config/minimal.rutema
125
123
  - test/distro_test/specs/T001.spec
126
124
  - test/distro_test/specs/T002.spec
@@ -132,8 +130,8 @@ files:
132
130
  - test/distro_test/specs/sample.spec
133
131
  - test/rutema.rutema
134
132
  - test/rutema.spec
133
+ - test/migration.spec
135
134
  - test/test_configuration.rb
136
- - test/test_historian.rb
137
135
  - test/test_model.rb
138
136
  - test/test_reporter.rb
139
137
  - test/test_specification.rb
@@ -161,13 +159,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
159
  requirements: []
162
160
 
163
161
  rubyforge_project: patir
164
- rubygems_version: 1.2.0
162
+ rubygems_version: 1.3.0
165
163
  signing_key:
166
164
  specification_version: 2
167
165
  summary: rutema is a test execution and management framework for heterogeneous testing environments
168
166
  test_files:
169
167
  - test/test_configuration.rb
170
- - test/test_historian.rb
171
168
  - test/test_model.rb
172
169
  - test/test_reporter.rb
173
170
  - test/test_specification.rb
data/bin/rutemah DELETED
@@ -1,9 +0,0 @@
1
- # Copyright (c) 2007 Vassilis Rizopoulos. All rights reserved.
2
- begin
3
- require 'rutema/historian'
4
- rescue LoadError
5
- require 'rubygems'
6
- require 'rutema/historian'
7
- end
8
-
9
- Rutema::RutemaH.new(ARGV)
@@ -1,106 +0,0 @@
1
- # Copyright (c) 2007 Vassilis Rizopoulos. All rights reserved.
2
- $:.unshift File.join(File.dirname(__FILE__),"..")
3
- require 'rutema/model'
4
- require 'rutema/system'
5
- require 'rutema/db'
6
- require 'rutema/gems'
7
-
8
- module Rutema
9
- #The "historian" application class
10
- #
11
- #RutemaH provides reports for test results over time using the data stored by the ActiveRecordReporter
12
- class RutemaH
13
- require 'optparse'
14
- def initialize command_line_args
15
- parse_command_line(command_line_args)
16
- logger=Patir.setup_logger(@log_file)
17
- begin
18
- raise "No configuration file defined!" if !@config_file
19
- configuration=RutemaHConfigurator.new(@config_file,logger).configuration
20
- historian=Historian.new(configuration,logger)
21
- puts historian.history(@command)
22
- rescue Patir::ConfigurationException
23
- logger.debug($!)
24
- logger.fatal("Configuration error '#{$!.message}'")
25
- exit 1
26
- rescue
27
- logger.debug($!)
28
- logger.fatal("#{$!.message}")
29
- exit 1
30
- end
31
- end
32
- private
33
- def parse_command_line args
34
- args.options do |opt|
35
- opt.on("Usage:")
36
- opt.on("rutemah [options] -c CONFIG command")
37
- opt.on("Options:")
38
- opt.on("--debug", "-d","Turns on debug messages") { $DEBUG=true }
39
- opt.on("--config FILE", "-c FILE",String,"Loads the configuration from FILE") { |@config_file|}
40
- opt.on("--log FILE", "-l FILE",String,"Redirects the log output to FILE") { |@log_file|}
41
- opt.on("-v", "--version","Displays the version") { $stdout.puts("v#{Version::STRING}");exit 0 }
42
- opt.on("--help", "-h", "-?", "This text") { $stdout.puts opt; exit 0 }
43
- opt.on("Commands are:")
44
- opt.on("all - lists all entries in the database")
45
- opt.on("\"testname\" - lists all tests runs for the given test name")
46
- opt.parse!
47
- #and now the rest
48
- if args.empty?
49
- $stdout.puts opt
50
- exit 0
51
- else
52
- @command=args.shift
53
- end
54
- end
55
- end#parse_command_line
56
- end
57
-
58
- class Historian
59
- def initialize configuration,logger=nil
60
- @logger=logger
61
- @logger||=Patir.setup_logger
62
- @configuration=configuration
63
- Rutema.connect_to_ar(@configuration.db[:database],@logger,false)
64
- end
65
-
66
- def history mode
67
- begin
68
- case mode
69
- when "all"
70
- table=Model::Scenario.report_table(:all)
71
- if table.empty?
72
- @logger.warn("No entries found")
73
- else
74
- ret=Ruport::Data::Grouping(beautify(table),:by=>"run_id")
75
- end
76
- when String
77
- ret=per_spec(mode)
78
- end
79
- rescue
80
- @logger.debug($!)
81
- @logger.error("Could not retrieve scenario data from the database")
82
- end
83
- return ret
84
- end
85
- private
86
- def beautify table
87
- @logger.debug("Beautifying...")
88
- table.reorder("run_id","name","status","attended","version","start_time","stop_time")
89
- table.replace_column("version") {|r| r.version ? r.version : "N/A"}
90
- table.replace_column("attended") {|r| r.attended=="t" ? "yes" : "no"}
91
- table.replace_column("start_time") {|r| r.stop_time ? r.start_time : nil}
92
- return table
93
- end
94
- def per_spec spec_name
95
- @logger.debug("History of #{spec_name}")
96
- table=Model::Scenario.report_table(:all,:conditions=>"name = '#{spec_name}'",:except=>["id","number"])
97
- if table.empty?
98
- @logger.warn("No test run records found for #{spec_name}")
99
- nil
100
- else
101
- beautify(table)
102
- end
103
-
104
- end
105
- end
106
- end
@@ -1,7 +0,0 @@
1
- #include the configuration from database.rutema
2
- configuration.load_from_file("database.rutema")
3
- #This is the verbose version of the configuration entry:
4
- #configuration.db={:database=>"sample.db",:adapter=>"sqlite3"}
5
- #For the time being the adapter is being automatically set according to the platform we're running on, so the :adapter is ignored
6
- #SQLite for MRI and h2 for jRuby
7
- configuration.db={:database=>"sample.db"}
@@ -1,7 +0,0 @@
1
- #include the configuration from database.rutema
2
- configuration.load_from_file("database.rutema")
3
- #This is the verbose version of the configuration entry:
4
- #configuration.db=:database=>"db/h2",:adapter=>"jdbch2"}
5
- #For the time being the adapter is being automatically set according to the platform we're running on, so the :adapter is ignored
6
- #SQLite for MRI and h2 for jRuby
7
- configuration.db={:database=>"db/h2"}
@@ -1,82 +0,0 @@
1
- $:.unshift File.join(File.dirname(__FILE__),"..","lib")
2
- require 'test/unit'
3
- require 'ostruct'
4
- require 'fileutils'
5
- require 'rutema/historian'
6
- #$DEBUG=true
7
- module TestRutema
8
- class TestHistorian<Test::Unit::TestCase
9
- def setup
10
- @configuration=OpenStruct.new
11
- @configuration.db={:database=>":memory:"}
12
- @configuration.db={:database=>"db/h2"} if RUBY_PLATFORM =~ /java/
13
- end
14
- def teardown
15
- ActiveRecord::Base.remove_connection
16
- FileUtils.rm_rf("db/") if File.exists?("db/")
17
- end
18
- def test_history
19
- assert_nothing_raised() do
20
- h=Rutema::Historian.new(@configuration)
21
- Rutema::Model::Schema.up
22
- a_bunch_of_data
23
- assert_not_nil( h.history("all"), "There should be some history there" )
24
- assert_not_nil(h.history("TC001"), "TC001 should have some history" )
25
- assert_nil(h.history("test5"), "No history expected of test5" )
26
- assert_not_nil( h.history("all") )
27
- assert_not_nil( h.history("TC002") )
28
- end
29
- end
30
- def test_no_db
31
- ActiveRecord::Base.remove_connection
32
- if RUBY_PLATFORM =~ /java/
33
- @configuration.db={:database=>"foo",:adapter=>"jdbch2"}
34
- else
35
- @configuration.db={:database=>"foo",:adapter=>"sqlite3"}
36
-
37
- end
38
- assert_nothing_raised() do
39
- h=Rutema::Historian.new(@configuration)
40
- assert_nothing_raised() { h.history("all")}
41
- end
42
- end
43
-
44
- def a_bunch_of_data
45
- runs=[]
46
- runs<<Rutema::Model::Run.new(:context=>{:version=>"0.4a"},:scenarios=>success_scenarios)
47
- runs<<Rutema::Model::Run.new(:context=>{:version=>"0.4b"},:scenarios=>success_scenarios)
48
- runs<<Rutema::Model::Run.new(:context=>{:version=>"0.4c"},:scenarios=>failure_scenarios)
49
- runs.each{|r| r.save}
50
- end
51
- def success_scenarios
52
- scenarios=[]
53
- 1.upto(2) do |i|
54
- steps=[]
55
- steps<<Rutema::Model::Step.new(:name=>"hard",:number=>1,:status=>"success",
56
- :output=>"the first step is hard",:error=>"",:duration=>1)
57
- steps<<Rutema::Model::Step.new(:name=>"easy",:number=>2,:status=>"success",
58
- :output=>"the next step is easy",:error=>"",:duration=>1)
59
- scenarios<<Rutema::Model::Scenario.new(:name=>"TC00#{i}",:version=>"100",
60
- :attended=>false,:status=>"success",
61
- :start_time=>(Time.now-10000*i),:stop_time=>(Time.now-10000*i),
62
- :steps=>steps)
63
- end
64
- return scenarios
65
- end
66
- def failure_scenarios
67
- failed_step=Rutema::Model::Step.new(:name=>"echo",:number=>1,:status=>"error",
68
- :output=>"Hel^.",:error=>"IO error",:duration=>1)
69
- [Rutema::Model::Scenario.new(:name=>"TC003",:version=>"10",
70
- :attended=>false,:status=>"error",:steps=>[failed_step],
71
- :start_time=>(Time.now-10000),:stop_time=>Time.now)]
72
- end
73
- def setup_for_mri
74
- ActiveRecord::Base.establish_connection(:adapter => "sqlite3",:database =>":memory:")
75
- @configuration.db={:database=>":memory:",:adapter=>"sqlite3"}
76
- end
77
- def setup_for_java
78
- ActiveRecord::Base.establish_connection(:adapter => "jdbch2",:database =>"db/h2")
79
- @configuration.db={:database=>"db/h2",:adapter=>"jdbch2"}
80
- end
81
- end
82
- end