stella 0.5.4 → 0.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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|