hulk_smash 0.1.0

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.
@@ -0,0 +1,44 @@
1
+ require_relative 'validator'
2
+
3
+ module HulkSmash
4
+ class Result
5
+ attr_reader :avg_response_time, :requests_per_second, :validator
6
+
7
+ def initialize(siege_result)
8
+ @siege_result = siege_result
9
+ @validator = Validator.new siege_result
10
+ parse_result
11
+ end
12
+
13
+ def valid?
14
+ validator.valid?
15
+ end
16
+
17
+ def reasons_for_failure
18
+ validator.reasons_for_failure
19
+ end
20
+
21
+ private
22
+
23
+ def siege_result
24
+ @siege_result
25
+ end
26
+
27
+ def parse_result
28
+ if valid?
29
+ parse_avg_response_time
30
+ parse_requests_per_second
31
+ end
32
+ end
33
+
34
+ def parse_avg_response_time
35
+ regex = /Response time:\s*([\d\.]*) secs/
36
+ @avg_response_time = regex.match(siege_result)[1].to_f*1000
37
+ end
38
+
39
+ def parse_requests_per_second
40
+ regex = /Transaction rate:\s*([\d\.]*) trans\/sec/
41
+ @requests_per_second = regex.match(siege_result)[1].to_f
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,42 @@
1
+ require_relative 'result'
2
+ require 'stringio'
3
+
4
+ module HulkSmash
5
+ class Smasher
6
+ attr_reader :url, :duration, :concurrent_users
7
+
8
+ def initialize(url='http://localhost', options={})
9
+ @duration = options[:duration] || self.class.default_duration
10
+ @concurrent_users = options[:concurrent_users] || self.class.default_concurrent_users
11
+ @url = url
12
+ end
13
+
14
+ def run_load_test
15
+ execute_siege_command "siege -b -t#{duration} -c#{concurrent_users} #{url}"
16
+ end
17
+
18
+ def run_scalability_test
19
+ execute_siege_command "siege -t#{duration} -c#{concurrent_users} #{url}"
20
+ end
21
+
22
+ private
23
+
24
+ def execute_siege_command(command)
25
+ `#{command} > #{results_file} 2>&1`
26
+ results = File.read(results_file)
27
+ HulkSmash::Result.new(results)
28
+ end
29
+
30
+ def results_file
31
+ @results_file ||= File.expand_path('../../../log/results.log', __FILE__)
32
+ end
33
+
34
+ def self.default_duration
35
+ '5s'
36
+ end
37
+
38
+ def self.default_concurrent_users
39
+ 15
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,26 @@
1
+ module HulkSmash
2
+ class Validator
3
+ attr_reader :reasons_for_failure, :siege_result
4
+
5
+ def initialize(siege_result)
6
+ @siege_result = siege_result
7
+ @reasons_for_failure = []
8
+ end
9
+
10
+ def valid?
11
+ validate_version_is_supported
12
+ reasons_for_failure.empty?
13
+ end
14
+
15
+ private
16
+
17
+ def version
18
+ regex = /\*\* SIEGE \s*([\d\.]*)$/
19
+ @version ||= regex.match(siege_result)[1].to_f
20
+ end
21
+
22
+ def validate_version_is_supported
23
+ @reasons_for_failure << "Siege version must be 2.x" if version < 2 || version >= 3
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ module HulkSmash
2
+ module Version
3
+ def self.major
4
+ 0
5
+ end
6
+
7
+ def self.minor
8
+ 1
9
+ end
10
+
11
+ def self.patch
12
+ 0
13
+ end
14
+ end
15
+
16
+ def self.version
17
+ [Version.major, Version.minor, Version.patch].join(".")
18
+ end
19
+ end
data/lib/hulk_smash.rb ADDED
@@ -0,0 +1,2 @@
1
+ require_relative 'hulk_smash/version'
2
+ require_relative 'hulk_smash/smasher'
data/log/.gitkeep ADDED
File without changes
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hulk_smash
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Matt Simpson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.9.2
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 0.9.2
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 2.8.0
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.8.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: yard
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 0.7.5
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.7.5
62
+ - !ruby/object:Gem::Dependency
63
+ name: guard-rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 0.6.0
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.6.0
78
+ description:
79
+ email: matt.simpson@asolutions.com
80
+ executables: []
81
+ extensions: []
82
+ extra_rdoc_files: []
83
+ files:
84
+ - lib/hulk_smash/version.rb
85
+ - lib/hulk_smash.rb
86
+ - lib/hulk_smash/smasher.rb
87
+ - lib/hulk_smash/result.rb
88
+ - lib/hulk_smash/validator.rb
89
+ - log/.gitkeep
90
+ homepage: http://asynchrony.com
91
+ licenses: []
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ! '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 1.8.24
112
+ signing_key:
113
+ specification_version: 3
114
+ summary: Hulking is the act of testing the scalability of your app
115
+ test_files: []
116
+ has_rdoc: