hulk_smash 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: