stella 0.5.4 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/README.textile +14 -10
  2. data/Rakefile +22 -36
  3. data/lib/daemonize.rb +56 -0
  4. data/lib/stella/adapter/ab.rb +49 -39
  5. data/lib/stella/adapter/base.rb +17 -8
  6. data/lib/stella/adapter/httperf.rb +24 -18
  7. data/lib/stella/adapter/pcap_watcher.rb +1 -1
  8. data/lib/stella/adapter/siege.rb +15 -12
  9. data/lib/stella/cli/localtest.rb +2 -3
  10. data/lib/stella/cli/sysinfo.rb +0 -1
  11. data/lib/stella/cli.rb +10 -55
  12. data/lib/stella/command/base.rb +0 -62
  13. data/lib/stella/command/localtest.rb +35 -36
  14. data/lib/stella/data/domain.rb +18 -11
  15. data/lib/stella/data/http.rb +23 -16
  16. data/lib/stella/logger.rb +29 -19
  17. data/lib/stella/response.rb +5 -2
  18. data/lib/stella/storable.rb +138 -52
  19. data/lib/stella/support.rb +107 -8
  20. data/lib/stella/sysinfo.rb +26 -16
  21. data/lib/stella/test/definition.rb +1 -1
  22. data/lib/stella/test/run/summary.rb +23 -13
  23. data/lib/stella/test/stats.rb +114 -0
  24. data/lib/stella/text/resource.rb +1 -1
  25. data/lib/stella.rb +29 -4
  26. data/lib/utils/mathutil.rb +0 -76
  27. data/lib/utils/stats.rb +88 -0
  28. data/lib/win32/Console/ANSI.rb +305 -305
  29. data/lib/win32/Console.rb +970 -970
  30. data/support/ruby-pcap-takuma-patch.txt +13 -13
  31. data/support/text/en.yaml +11 -8
  32. data/support/text/nl.yaml +7 -1
  33. data/{spec/show-agents_spec.rb → tests/01-util_test.rb} +0 -0
  34. data/tests/02-stella-util_test.rb +42 -0
  35. data/tests/10-stella_test.rb +104 -0
  36. data/tests/11-stella-storable_test.rb +68 -0
  37. data/tests/60-stella-command_test.rb +248 -0
  38. data/tests/80-stella-cli_test.rb +45 -0
  39. data/tests/spec-helper.rb +31 -0
  40. data/vendor/{frylock/README.textile → drydock/LICENSE.txt} +2 -52
  41. data/vendor/drydock/README.textile +57 -0
  42. data/vendor/{frylock → drydock}/bin/example +14 -14
  43. data/vendor/{frylock/frylock.gemspec → drydock/drydock.gemspec} +1 -1
  44. data/vendor/{frylock/lib/frylock → drydock/lib/drydock}/exceptions.rb +1 -1
  45. data/vendor/{frylock/lib/frylock.rb → drydock/lib/drydock.rb} +8 -8
  46. data/vendor/{frylock → drydock}/test/command_test.rb +0 -0
  47. metadata +34 -61
  48. data/lib/stella/test/base.rb +0 -38
  49. data/lib/stella/test/summary.rb +0 -82
  50. data/vendor/hitimes-0.4.0/HISTORY +0 -28
  51. data/vendor/hitimes-0.4.0/LICENSE.txt +0 -19
  52. data/vendor/hitimes-0.4.0/README +0 -80
  53. data/vendor/hitimes-0.4.0/Rakefile +0 -63
  54. data/vendor/hitimes-0.4.0/examples/benchmarks.rb +0 -86
  55. data/vendor/hitimes-0.4.0/examples/stats.rb +0 -29
  56. data/vendor/hitimes-0.4.0/ext/extconf.rb +0 -15
  57. data/vendor/hitimes-0.4.0/ext/hitimes_ext.c +0 -21
  58. data/vendor/hitimes-0.4.0/ext/hitimes_instant_clock_gettime.c +0 -20
  59. data/vendor/hitimes-0.4.0/ext/hitimes_instant_osx.c +0 -16
  60. data/vendor/hitimes-0.4.0/ext/hitimes_instant_windows.c +0 -27
  61. data/vendor/hitimes-0.4.0/ext/hitimes_interval.c +0 -340
  62. data/vendor/hitimes-0.4.0/ext/hitimes_interval.h +0 -73
  63. data/vendor/hitimes-0.4.0/ext/hitimes_stats.c +0 -242
  64. data/vendor/hitimes-0.4.0/ext/hitimes_stats.h +0 -30
  65. data/vendor/hitimes-0.4.0/ext/rbconfig-mingw.rb +0 -178
  66. data/vendor/hitimes-0.4.0/ext/rbconfig.rb +0 -178
  67. data/vendor/hitimes-0.4.0/gemspec.rb +0 -54
  68. data/vendor/hitimes-0.4.0/lib/hitimes/mutexed_stats.rb +0 -23
  69. data/vendor/hitimes-0.4.0/lib/hitimes/paths.rb +0 -54
  70. data/vendor/hitimes-0.4.0/lib/hitimes/stats.rb +0 -29
  71. data/vendor/hitimes-0.4.0/lib/hitimes/timer.rb +0 -223
  72. data/vendor/hitimes-0.4.0/lib/hitimes/version.rb +0 -42
  73. data/vendor/hitimes-0.4.0/lib/hitimes.rb +0 -24
  74. data/vendor/hitimes-0.4.0/spec/interval_spec.rb +0 -115
  75. data/vendor/hitimes-0.4.0/spec/mutex_stats_spec.rb +0 -34
  76. data/vendor/hitimes-0.4.0/spec/paths_spec.rb +0 -14
  77. data/vendor/hitimes-0.4.0/spec/spec_helper.rb +0 -6
  78. data/vendor/hitimes-0.4.0/spec/stats_spec.rb +0 -72
  79. data/vendor/hitimes-0.4.0/spec/timer_spec.rb +0 -105
  80. data/vendor/hitimes-0.4.0/spec/version_spec.rb +0 -27
  81. data/vendor/hitimes-0.4.0/tasks/announce.rake +0 -39
  82. data/vendor/hitimes-0.4.0/tasks/config.rb +0 -107
  83. data/vendor/hitimes-0.4.0/tasks/distribution.rake +0 -53
  84. data/vendor/hitimes-0.4.0/tasks/documentation.rake +0 -33
  85. data/vendor/hitimes-0.4.0/tasks/extension.rake +0 -64
  86. data/vendor/hitimes-0.4.0/tasks/rspec.rake +0 -31
  87. data/vendor/hitimes-0.4.0/tasks/rubyforge.rake +0 -52
  88. data/vendor/hitimes-0.4.0/tasks/utils.rb +0 -80
@@ -38,7 +38,7 @@ module Stella
38
38
  attr_accessor :rc, :file, :time, :benchmark, :internet
39
39
 
40
40
  def initialize(options={}, arguments=[])
41
- super(options, arguments)
41
+
42
42
  @name = 'siege'
43
43
  @reps = 1
44
44
  @concurrent = 1
@@ -47,6 +47,8 @@ module Stella
47
47
 
48
48
  @rc = File.join(ENV['HOME'] || ENV['USERPROFILE'], '.siegerc')
49
49
 
50
+ super(options, arguments)
51
+
50
52
  # Siege won't run unless there's a siegerc file. If the default one doesn't exist
51
53
  # we need to call siege.config to create it. This should only happen once.
52
54
  # We use capture_output here so STDOUT and STDERR don't print to the screen.
@@ -121,12 +123,10 @@ module Stella
121
123
 
122
124
  update_orig_logfile if @orig_logfile
123
125
 
124
- save_stats
125
126
  end
126
127
 
127
128
 
128
- def process_options(arguments)
129
- options = OpenStruct.new
129
+ def process_arguments(arguments)
130
130
  opts = OptionParser.new
131
131
  opts.on('-V', '--version') do |v| @version = v end
132
132
  opts.on('-h', '--help') do |v| @help = v end
@@ -147,9 +147,6 @@ module Stella
147
147
  opts.on('-i', '--internet') do |v| @internet = true; end
148
148
  opts.on('-A S', '--user-agent=S', String) do |v| @user_agent ||= []; @user_agent << v end
149
149
 
150
- unless options.benchmark
151
- Stella::LOGGER.warn('--benchmark (or -b) is not selected. Siege will include "think-time" for all requests.')
152
- end
153
150
 
154
151
  opts.on('-n N',Integer) do |v|
155
152
  Stella::LOGGER.error("-n is not a Siege parameter. You probably want -r.")
@@ -160,7 +157,13 @@ module Stella
160
157
  # It also fails when it finds unknown switches (i.e. -X)
161
158
  # Which should leave only the remaining arguments (URIs in this case)
162
159
  opts.parse!(arguments)
163
- options
160
+
161
+ unless @benchmark
162
+ Stella::LOGGER.warn('--benchmark (or -b) is not selected. Siege will include "think time" for all requests.')
163
+ end
164
+
165
+ self.arguments = arguments
166
+
164
167
  rescue OptionParser::InvalidOption => ex
165
168
  # We want to replace this text so we grab just the name of the argument
166
169
  badarg = ex.message.gsub('invalid option: ', '')
@@ -273,7 +276,7 @@ module Stella
273
276
  end
274
277
 
275
278
  # Siege writes the summary to STDERR
276
- def stats_file
279
+ def summary_file
277
280
  File.new(stderr_path) if File.exists?(stderr_path)
278
281
  end
279
282
 
@@ -289,10 +292,10 @@ module Stella
289
292
  File.join(@working_directory, File.basename(@file))
290
293
  end
291
294
 
292
- def stats
293
- return unless stats_file
295
+ def summary
296
+ return unless summary_file
294
297
  raw = {}
295
- stats_file.each_line { |l|
298
+ summary_file.each_line { |l|
296
299
  l.chomp!
297
300
  nvpair = l.split(':')
298
301
  next unless nvpair && nvpair.size == 2
@@ -31,9 +31,8 @@ module Stella
31
31
  def run
32
32
  process_stella_options
33
33
 
34
- options = @adapter.process_options(@arguments)
35
-
36
- @adapter.options = options
34
+ @adapter.process_arguments(@arguments)
35
+
37
36
  @adapter.arguments = @arguments
38
37
 
39
38
  @testdef.vusers = @adapter.vusers
@@ -6,7 +6,6 @@ module Stella
6
6
 
7
7
  def run
8
8
  puts Stella::SYSINFO
9
- #puts "HI"
10
9
  end
11
10
 
12
11
  end
data/lib/stella/cli.rb CHANGED
@@ -1,52 +1,11 @@
1
1
 
2
2
  # http://www.ruby-doc.org/stdlib/libdoc/observer/rdoc/index.html
3
3
 
4
- require 'optparse'
5
- require 'ostruct'
6
4
 
7
5
  require 'stella/cli/base'
8
6
 
9
7
  module Stella
10
8
 
11
- # Stella::Config
12
- #
13
- # This Config class manages the content of ENV['HOME]/.stella. The functionality
14
- # is currently disabled so stella is stateless.
15
- # RUBY_PLATFORM = 'java' in jruby and i386-mswin32 for windows
16
- class Config < Storable
17
- USER_HOME = ENV['USERPROFILE'] || ENV['HOME']
18
- STELLA_DIR = '.stella'
19
- DEFAULT_HOME = File.join(USER_HOME, STELLA_DIR).freeze unless defined? DEFAULT_HOME
20
- DEFAULT_DATA_HOME = File.join(Dir.getwd, 'stella').freeze unless defined? DEFAULT_DATA_HOME
21
-
22
- attr_accessor :conf_path, :data_path
23
- attr_accessor :agents
24
-
25
- def initialize(args={:conf_path => DEFAULT_HOME})
26
-
27
- end
28
-
29
- def working_directory
30
- 'stella'
31
- end
32
-
33
- # Copy the default useragents file to the config directory.
34
- #unless File.exists? uafile_path
35
- # default_uafile = File.join(STELLA_HOME, 'support', 'useragents.txt')
36
- # STDERR.puts "There's no useragents.txt file. Supplied agents will be ignored" unless File.exists?(default_uafile)
37
- # File.copy(default_uafile, @config.uafile_path, true)
38
- #end
39
-
40
- #def load
41
- # puts self.methods
42
- # loaded_config = Config.undump('yaml', FileUtil.read_file_to_array(@config_filepath))
43
- # current_config = @config.marshal_dump
44
- # current_config.merge! loaded_config if loaded_config.is_a? Hash
45
- #
46
- # @config = OpenStruct.new(current_config)
47
- #end
48
-
49
- end
50
9
 
51
10
  # Stella::CLI
52
11
  #
@@ -59,23 +18,28 @@ module Stella
59
18
  # Auto populated with 'command' => Stella::CLI::[class] by each cli class on 'require'.
60
19
  @@commands = {}
61
20
 
21
+ attr_reader :command_name
62
22
  attr_reader :options
63
23
  attr_reader :logger
64
-
24
+ attr_reader :stella_arguments
25
+ attr_reader :command_arguments
65
26
 
66
27
 
67
28
  def initialize(arguments=[], stdin=nil)
68
29
  @arguments = arguments
69
30
  @stdin = stdin
70
31
 
71
- @config = Stella::Config.new
72
32
  @options = OpenStruct.new
73
33
  @options.verbose = 0
74
- @options.data_path = @config.working_directory
34
+ @options.data_path = 'stella'
75
35
  @options.agents = []
76
36
 
77
37
  @stella_arguments = []
78
38
  @command_arguments = []
39
+
40
+ process_arguments
41
+ process_options
42
+
79
43
  end
80
44
 
81
45
  def commands
@@ -84,9 +48,6 @@ module Stella
84
48
 
85
49
  def run
86
50
 
87
- process_arguments
88
- process_options
89
-
90
51
  unless (@command_name)
91
52
  process_options(:display)
92
53
  exit 0
@@ -96,7 +57,7 @@ module Stella
96
57
  # and tell it what shortname that was used to call it.
97
58
  command = @@commands[@command_name].new(@command_name)
98
59
 
99
- # Give the command object access to the config and runtime options
60
+ # Give the command object access to the runtime options and arguments
100
61
  command.stella_options = @options
101
62
  command.arguments = @command_arguments
102
63
  command.working_directory = @options.data_path
@@ -210,9 +171,7 @@ module Stella
210
171
  agent_ary = Stella::Util::expand_str(v || 'random')
211
172
  @options.agents.push(agent_ary)
212
173
  end
213
-
214
- # The following options are considered "repeatable" so they're stored in
215
- # the config file and used as defaults for the next run.
174
+
216
175
  opts.on('-d', '--datapath=S', String, Stella::TEXT.msg(:option_help_datapath, ".#{File::SEPARATOR}stella")) do |v|
217
176
  @options.data_path = v.to_s
218
177
  end
@@ -271,10 +230,6 @@ module Stella
271
230
 
272
231
  Stella::LOGGER.debug("Commands (#{@command_name}): #{@@commands.keys.join(',')}")
273
232
 
274
- #Stella::LOGGER.debug("Configs: ")
275
- #@config.to_hash.each_pair do |n,v|
276
- # Stella::LOGGER.debug(" #{n}=#{v}")
277
- #end
278
233
 
279
234
  Stella::LOGGER.debug("Options: ")
280
235
  @options.marshal_dump.each_pair do |n,v|
@@ -3,19 +3,6 @@
3
3
  module Stella::Command
4
4
  class Base
5
5
 
6
- BrowserNicks = {
7
- 'ff' => 'firefox',
8
- 'ie' => 'internetexplorer'
9
- }.freeze unless defined? BrowserNicks
10
-
11
- OperatingSystemNicks = {
12
- 'win' => 'windows',
13
- 'lin' => 'linux',
14
- 'osx' => 'osx',
15
- 'freebsd' => 'bsd',
16
- 'netbsd' => 'bsd',
17
- 'openbsd' => 'bsd'
18
- }.freeze unless defined? OperatingSystemNicks
19
6
 
20
7
  # TODO: See EC2::Platform for example to improve/generalize platform
21
8
  # discovery. We'll need this for monitoring.
@@ -47,55 +34,6 @@ module Stella::Command
47
34
  sleep remainder if remainder > 0
48
35
  end
49
36
 
50
- # find_agent
51
- #
52
- # Takes an input string which can be either a shortname or a complete
53
- # user agent string. If the string matches the shortname format, it
54
- # will select an agent string from useragents.txt based on the shortname.
55
- # Shortname takes the following format: browser-version-os.
56
- # Examples: ff-3-linux, ie-5, opera-10-win, chrome-0.2-osx, random
57
- # If os doesn't match, it will look for the browser and version. If it can't
58
- # find the version it will look for the browser and apply the version given.
59
- # If browser doesn't match a known browser, it assumes the string is a
60
- # complete user agent and simply returns that value.
61
- def find_agent(name,second=nil,third=nil)
62
- name = (BrowserNicks.has_key?(name)) ? BrowserNicks[name] : name
63
- return name unless @available_agents.has_key?(name) || name == "random"
64
-
65
- index = name
66
- if (second && third) # i.e. opera-9-osx
67
- os = (OperatingSystemNicks.has_key?(third)) ? OperatingSystemNicks[third] : third
68
- index = "#{name}-#{second}-#{os}"
69
- elsif(second && second.to_i > 0) # i.e. opera-9
70
- index = "#{name}-#{second}"
71
- elsif(second) # i.e. opera-osx
72
- os = (OperatingSystemNicks.has_key?(second)) ? OperatingSystemNicks[second] : second
73
- index = "#{name}-#{os}"
74
- elsif(name == "random")
75
- index = @available_agents.keys[ rand(@available_agents.keys.size) ]
76
- end
77
-
78
- # Attempt to find a pool of user agents that match the supplied index
79
- ua_pool = @available_agents[index]
80
-
81
- # In the event we don't find an agent above (which will only happen
82
- # when the user provided a version), we'll take a random agent for
83
- # the same browser and apply the version supplied by the user. We
84
- # create the index using just the major version number so if the user
85
- # supplies a specific verswion number, they will always end up here.
86
- unless ua_pool
87
- os = (OperatingSystemNicks.has_key?(third)) ? OperatingSystemNicks[third] : third
88
- index = (os) ? "#{name}-#{os}" : name
89
- ua_tmp = @available_agents[index][ rand(@available_agents[index].size) ]
90
- ua_tmp.version = second if second.to_i > 0
91
- ua_pool = [ua_tmp]
92
- end
93
-
94
- ua = ua_pool[ rand(ua_pool.size) ]
95
-
96
- ua.to_s
97
-
98
- end
99
37
 
100
38
 
101
39
  end
@@ -26,6 +26,8 @@ module Stella
26
26
 
27
27
  attr_accessor :working_directory
28
28
  attr_reader :available_agents
29
+ attr_reader :test_stats
30
+ attr_reader :rampup_test_stats
29
31
 
30
32
  def initialize(testdef=nil, adapter=nil)
31
33
  @testdef = testdef if testdef
@@ -40,23 +42,15 @@ module Stella
40
42
  @paths = []
41
43
  @format = 'yaml'
42
44
  @agents = []
45
+ @verbose = 0
43
46
 
44
- @available_agents = index_available_agents(File.join(STELLA_HOME, 'support', 'useragents.txt'))
47
+ ua_path = File.join(STELLA_HOME, 'support', 'useragents.txt')
48
+ Stella::LOGGER.debug("LOADING #{ua_path}")
49
+
50
+ @available_agents = Stella::Util.process_useragents(ua_path)
45
51
  end
46
52
 
47
- def index_available_agents(path)
48
- Stella::LOGGER.debug("LOADING #{path}")
49
- return [] unless File.exists?(path)
50
- Stella::Util.process_useragents(FileUtil.read_file_to_array(path))
51
- end
52
53
 
53
- def translate_requested_agents(possible_agents=[])
54
- agents = []
55
- possible_agents.each do |a|
56
- agents << find_agent(*a)
57
- end
58
- agents
59
- end
60
54
 
61
55
  def run
62
56
 
@@ -69,11 +63,11 @@ module Stella
69
63
  return
70
64
  end
71
65
 
72
- @agents = translate_requested_agents(@testdef.agents)
66
+ @agents = Stella::Util.find_agents(@available_agents, @testdef.agents)
73
67
 
74
- test_path = _generate_test_path
68
+ @test_path = _generate_test_path
75
69
 
76
- prepare_test(test_path)
70
+ prepare_test(@test_path)
77
71
 
78
72
  threshold = (@testdef.rampup) ? @testdef.rampup.ceiling : @adapter.vusers
79
73
 
@@ -120,7 +114,7 @@ module Stella
120
114
 
121
115
  # Rampup tests produce multiple summary files which include the batch
122
116
  # number. Regular runs have just one file we set here as the default.
123
- summary_name = "SUMMARY"
117
+ summary_name = "STATS"
124
118
 
125
119
  # It's possible for the interval to not divide evenly into the ceiling
126
120
  # If we have room between the current number of virtual users and the
@@ -133,14 +127,14 @@ module Stella
133
127
  @adapter.vusers += @testdef.rampup.interval
134
128
  end
135
129
  padded_users = @adapter.vusers.to_s.rjust(4, '0')
136
- summary_name = "SUMMARY-#{padded_users}"
130
+ summary_name << "-#{padded_users}"
137
131
  end
138
132
 
139
133
  # Read the run summaries for this batch and produce totals, averages,
140
134
  # and standard deviations.
141
- test_stats = process_test_stats(@test_runpaths)
135
+ @test_stats = process_test_stats(@test_runpaths)
142
136
  print_summary(test_stats) if (@testdef.repetitions > 1)
143
- save_summary(File.join(test_path, "#{summary_name}.#{@format}"), test_stats)
137
+ save_summary(File.join(test_path, "#{summary_name}.#{@format}"), @test_stats)
144
138
 
145
139
 
146
140
  # Non-rampup tests only need to run through the loop once.
@@ -152,22 +146,22 @@ module Stella
152
146
  # Notice the difference between these test stats and the ones above?
153
147
  # These stats are based on the entire rampup test, across all levels
154
148
  # of virtual users.
155
- test_stats = process_test_stats(@all_runpaths)
156
- save_summary(File.join(test_path, "SUMMARY-RAMPUP.#{@format}"), test_stats)
149
+ @rampup_test_stats = process_test_stats(@all_runpaths)
150
+ save_summary(File.join(test_path, "STATS.#{@format}"), @rampup_test_stats)
157
151
  print_summary(test_stats) if (@testdef.repetitions > 1)
158
152
  end
159
153
  rescue Interrupt
160
- puts "HIHIHI2222"
161
154
  exit
162
155
  rescue AdapterError => ex
163
156
  Stella::LOGGER.error(ex.message)
164
157
  end
165
158
 
166
- def latest_test_symlink_path
159
+ def test_path_symlink
167
160
  return unless @working_directory
168
161
  File.join(@working_directory, 'latest')
169
162
  end
170
163
 
164
+
171
165
  private
172
166
 
173
167
  # prepare_test
@@ -185,8 +179,10 @@ module Stella
185
179
  # Make sure the test storage directory is created along with the
186
180
  # latest symlink
187
181
  FileUtil.create_dir(test_path)
188
- #File.unlink(latest_test_symlink_path) if File.exists?(latest_test_symlink_path)
189
- #File.symlink(File.expand_path(test_path), latest_test_symlink_path)
182
+ if Stella.sysinfo.os == :unix
183
+ File.unlink(test_path_symlink) if File.exists?(test_path_symlink)
184
+ File.symlink(File.expand_path(test_path), test_path_symlink)
185
+ end
190
186
 
191
187
  # Write the test ID to the storage directory
192
188
  # NOTE: Disabled until we resolve the issue with JRuby on OSX (won't load openssl)
@@ -267,7 +263,9 @@ module Stella
267
263
  raise AdapterError.new(@adapter.name, @adapter.error)
268
264
  end
269
265
 
270
- stats = @adapter.stats
266
+ @adapter.after
267
+
268
+ stats = @adapter.summary
271
269
 
272
270
  save_summary(@adapter.summary_path(@format), stats)
273
271
 
@@ -289,6 +287,7 @@ module Stella
289
287
  # INPUT:
290
288
  # stats:: Any object that extends Stella::Test::Base object
291
289
  def print_summary(stats)
290
+ return if stats.nil?
292
291
  Stella::LOGGER.info(' ' << "-"*67) unless @quiet
293
292
 
294
293
  Stella::LOGGER.info_printf("%8s: %10d@%-6d %3.0f%% %9.2f/s ", "Total", stats.transactions_total || 0, stats.vusers_avg || 0, stats.availability || 0, stats.transaction_rate_avg || 0)
@@ -320,22 +319,21 @@ module Stella
320
319
  # filepath:: the complete path for the file (string)
321
320
  # stats:: Any object that extends Stella::Test::Base object
322
321
  def save_summary(filepath, stats)
323
- FileUtil.write_file(filepath, stats.dump(@format, :with_titles), true) if stats
322
+ return unless stats
323
+ stats.format = @format
324
+ stats.to_file(filepath)
324
325
  end
325
326
 
326
327
  # Load SUMMARY file for each run and create a summary with
327
328
  # totals, averages, and standard deviations.
328
329
  def process_test_stats(paths)
329
330
  return unless paths && !paths.empty?
330
- test_stats = Stella::Test::Summary.new(@message)
331
- return unless test_stats
332
- all_stats_obj = []
331
+ test_stats = Stella::Test::Stats.new(@message)
332
+
333
333
  paths.each do |path|
334
- file_contents = FileUtil.read_file_to_array("#{path}/SUMMARY.#{@format}")
335
- next if !file_contents || file_contents.empty?
336
- stats = Stella::Test::Run::Summary.undump(@format, file_contents)
337
- stats_obj = Stella::Test::Run::Summary.from_hash(stats)
338
- test_stats.add_run(stats_obj)
334
+ next unless File.exists?("#{path}/SUMMARY.#{@format}")
335
+ test_run = Stella::Test::Run::Summary.from_file("#{path}/SUMMARY.#{@format}")
336
+ test_stats.add_run(test_run)
339
337
  end
340
338
 
341
339
  test_stats
@@ -354,6 +352,7 @@ module Stella
354
352
  end
355
353
 
356
354
 
355
+
357
356
  end
358
357
  end
359
358
 
@@ -2,9 +2,15 @@
2
2
 
3
3
  module Stella::Data
4
4
  class DomainRequest < Stella::Storable
5
- attr_accessor :time, :client_ip, :server_ip, :dns_data, :domain_name, :header
5
+ attr_accessor :dns_data
6
6
  attr_reader :raw_data
7
-
7
+
8
+ field :time => DateTime
9
+ field :client_ip => String
10
+ field :server_ip => String
11
+ field :domain_name => String
12
+ field :header => String
13
+
8
14
  def initialize(raw_data)
9
15
  @raw_data = raw_data
10
16
  @dns_data, @domain_name, @header = DomainUtil::parse_domain_request(@raw_data)
@@ -20,10 +26,6 @@ module Stella::Data
20
26
  false
21
27
  end
22
28
 
23
- def field_names
24
- [ :time, :client_ip, :server_ip, :domain_name, :header ]
25
- end
26
-
27
29
  def to_s
28
30
  "%s: %s -> %s (%s)" % [@time, @client_ip, @server_ip, @domain_name]
29
31
  end
@@ -39,8 +41,17 @@ module Stella::Data
39
41
  end
40
42
 
41
43
  class DomainResponse < Stella::Storable
42
- attr_accessor :time, :client_ip, :server_ip, :dns_data, :domain_name, :header, :addresses, :cnames
44
+ attr_accessor :dns_data
43
45
  attr_reader :raw_data
46
+
47
+ field :time => DateTime
48
+ field :client_ip => String
49
+ field :server_ip => String
50
+ field :domain_name => String
51
+ field :header => String
52
+ field :addresses => Array
53
+ field :cnames => Array
54
+
44
55
 
45
56
  def initialize(raw_data)
46
57
  @raw_data = raw_data
@@ -57,10 +68,6 @@ module Stella::Data
57
68
  false
58
69
  end
59
70
 
60
- def field_names
61
- [ :time, :client_ip, :server_ip, :dns_data, :domain_name, :header, :addresses, :cnames ]
62
- end
63
-
64
71
  def to_s
65
72
  "%s: %s <- %s (%s) %s" % [@time, @client_ip, @server_ip, @domain_name, (@addresses || []).join(',')]
66
73
  end
@@ -17,10 +17,16 @@ module Stella::Data
17
17
  end
18
18
 
19
19
  class HTTPRequest < Stella::Storable
20
- attr_accessor :time, :client_ip, :server_ip, :header, :body, :method, :http_version
21
20
  attr_reader :raw_data
22
- attr_writer :uri, :body
23
- attr_accessor :response
21
+
22
+ field :time => DateTime
23
+ field :client_ip
24
+ field :server_ip
25
+ field :header
26
+ field :uri
27
+ field :body
28
+ field :http_method
29
+ field :http_version
24
30
 
25
31
  def has_body?
26
32
  @body && !@body.nil & !@body.empty?
@@ -35,7 +41,7 @@ module Stella::Data
35
41
  def initialize(raw_data=nil)
36
42
  @raw_data = raw_data
37
43
  if @raw_data
38
- @method, @http_version, @uri, @header, @body = HTTPUtil::parse_http_request(raw_data)
44
+ @http_method, @http_version, @uri, @header, @body = HTTPUtil::parse_http_request(raw_data)
39
45
  end
40
46
  @response = Stella::Data::HTTPResponse.new
41
47
  end
@@ -51,32 +57,37 @@ module Stella::Data
51
57
  #(!header || header[:Content_Type] || header[:Content_Type] !~ /text/) ? Base64.encode64(@body) : @body
52
58
  end
53
59
 
54
- def field_names
55
- [ :time, :client_ip, :server_ip, :header, :uri, :body, :method, :http_version ]
56
- end
60
+
57
61
 
58
62
  def inspect
59
63
  headers = []
60
64
  header.each_pair do |n,v|
61
65
  headers << "#{n.to_s.gsub('_', '-')}: #{v[0]}"
62
66
  end
63
- str = "%s %s HTTP/%s" % [method, uri.to_s, http_version]
67
+ str = "%s %s HTTP/%s" % [http_method, uri.to_s, http_version]
64
68
  str << $/ + headers.join($/)
65
69
  str << $/ + $/ + body if body
66
70
  str
67
71
  end
68
72
 
69
73
  def to_s
70
- str = "%s: %s %s HTTP/%s" % [time.strftime(NICE_TIME_FORMAT), method, uri.to_s, http_version]
74
+ str = "%s: %s %s HTTP/%s" % [time.strftime(NICE_TIME_FORMAT), http_method, uri.to_s, http_version]
71
75
  str
72
76
  end
73
77
 
74
78
  end
75
79
 
76
80
  class HTTPResponse < Stella::Storable
77
- attr_accessor :time, :client_ip, :server_ip, :header, :status, :message, :http_version
78
81
  attr_reader :raw_data
79
- attr_writer :body
82
+
83
+ field :time => DateTime
84
+ field :client_ip => String
85
+ field :server_ip => String
86
+ field :header => String
87
+ field :body => String
88
+ field :status => String
89
+ field :message => String
90
+ field :http_version => String
80
91
 
81
92
  def initialize(raw_data=nil)
82
93
  @raw_data = raw_data
@@ -86,7 +97,7 @@ module Stella::Data
86
97
  end
87
98
 
88
99
  def has_body?
89
- @body && !@body.nil & !@body.empty?
100
+ @body && !@body.nil? & !@body.empty?
90
101
  end
91
102
  def has_request?
92
103
  false
@@ -101,10 +112,6 @@ module Stella::Data
101
112
  (!header || !header[:Content_Type] || header[:Content_Type] !~ /text/) ? '' : @body
102
113
  end
103
114
 
104
- def field_names
105
- [ :time, :client_ip, :server_ip, :header, :body, :status, :message, :http_version ]
106
- end
107
-
108
115
  def inspect
109
116
  headers = []
110
117
  header.each_pair do |n,v|