stella 0.7.3.002 → 0.7.4.001
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +9 -0
- data/bin/stella +26 -12
- data/examples/cookies/plan.rb +0 -1
- data/examples/essentials/plan.rb +1 -1
- data/lib/stella.rb +58 -42
- data/lib/stella/cli.rb +12 -4
- data/lib/stella/client.rb +43 -18
- data/lib/stella/client/container.rb +4 -1
- data/lib/stella/common.rb +255 -0
- data/lib/stella/data.rb +6 -4
- data/lib/stella/data/http.rb +126 -2
- data/lib/stella/engine.rb +25 -8
- data/lib/stella/engine/functional.rb +37 -30
- data/lib/stella/engine/load_create.rb +12 -10
- data/lib/stella/engine/load_package.rb +3 -4
- data/lib/stella/engine/load_queue.rb +9 -28
- data/lib/stella/engine/loadbase.rb +218 -82
- data/lib/stella/logger.rb +143 -0
- data/lib/stella/testplan.rb +174 -18
- data/stella.gemspec +5 -18
- metadata +6 -19
- data/lib/stella/client/modifiers.rb +0 -20
- data/lib/stella/config.rb +0 -87
- data/lib/stella/data/http/body.rb +0 -15
- data/lib/stella/data/http/request.rb +0 -129
- data/lib/stella/data/http/response.rb +0 -92
- data/lib/stella/exceptions.rb +0 -20
- data/lib/stella/mixins.rb +0 -5
- data/lib/stella/mixins/numeric.rb +0 -24
- data/lib/stella/mixins/string.rb +0 -16
- data/lib/stella/mixins/thread.rb +0 -6
- data/lib/stella/mixins/time.rb +0 -75
- data/lib/stella/stats.rb +0 -79
- data/lib/stella/testplan/stats.rb +0 -26
- data/lib/stella/testplan/usecase.rb +0 -119
- data/lib/stella/version.rb +0 -15
@@ -0,0 +1,143 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Stella
|
4
|
+
|
5
|
+
class Logger
|
6
|
+
@@disable = false
|
7
|
+
def self.disable!() @@disable = true end
|
8
|
+
def self.disabled?() @@disable == true end
|
9
|
+
|
10
|
+
attr_accessor :lev
|
11
|
+
attr_reader :templates
|
12
|
+
|
13
|
+
def initialize(output=STDOUT)
|
14
|
+
@mutex, @buffer = Mutex.new, StringIO.new
|
15
|
+
@lev, @offset = 1, 0
|
16
|
+
@templates = {}
|
17
|
+
@autoflush = false
|
18
|
+
return if Logger.disabled?
|
19
|
+
self.output = output
|
20
|
+
end
|
21
|
+
|
22
|
+
def autoflush!() @autoflush = true end
|
23
|
+
def autoflush?() @autoflush == true end
|
24
|
+
|
25
|
+
def add_template(name, str)
|
26
|
+
@templates[name.to_sym] = str
|
27
|
+
end
|
28
|
+
|
29
|
+
def template(name)
|
30
|
+
@templates[name]
|
31
|
+
end
|
32
|
+
|
33
|
+
def template?(name)
|
34
|
+
@templates.has_key? name
|
35
|
+
end
|
36
|
+
|
37
|
+
def print(level, *msg)
|
38
|
+
return if level > @lev || Logger.disabled?
|
39
|
+
@buffer.print *msg
|
40
|
+
flush if autoflush?
|
41
|
+
true
|
42
|
+
end
|
43
|
+
def print!(level, msg)
|
44
|
+
return unless @lev == level
|
45
|
+
print level, msg
|
46
|
+
end
|
47
|
+
|
48
|
+
def puts(level, *msg)
|
49
|
+
return if level > @lev || Logger.disabled?
|
50
|
+
@buffer.puts *msg
|
51
|
+
flush if autoflush?
|
52
|
+
true
|
53
|
+
end
|
54
|
+
|
55
|
+
def info(*msg) puts 1, *msg end
|
56
|
+
def info1(*msg) puts 1, *msg end
|
57
|
+
def info2(*msg) puts 2, *msg end
|
58
|
+
def info3(*msg) puts 3, *msg end
|
59
|
+
def info4(*msg) puts 4, *msg end
|
60
|
+
|
61
|
+
def tinfo(templ, *args)
|
62
|
+
info template(templ) % args
|
63
|
+
end
|
64
|
+
|
65
|
+
def twarn(templ, *args)
|
66
|
+
warn template(templ) % args
|
67
|
+
end
|
68
|
+
|
69
|
+
class UnknownTemplate < Stella::Error
|
70
|
+
end
|
71
|
+
|
72
|
+
def method_missing(meth, *args)
|
73
|
+
raise UnknownTemplate.new(meth.to_s) unless template? meth
|
74
|
+
tinfo meth, *args
|
75
|
+
end
|
76
|
+
|
77
|
+
def output=(o)
|
78
|
+
@mutex.synchronize do
|
79
|
+
if o.kind_of? String
|
80
|
+
o = File.open(o, File::CREAT|File::TRUNC|File::RDWR, 0644)
|
81
|
+
end
|
82
|
+
@output = o
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def flush
|
87
|
+
return if Logger.disabled?
|
88
|
+
@mutex.synchronize do
|
89
|
+
#return if @offset == @output.tell
|
90
|
+
@buffer.seek @offset
|
91
|
+
@output.print @buffer.read unless @buffer.eof?
|
92
|
+
@offset = @buffer.tell
|
93
|
+
@output.flush
|
94
|
+
end
|
95
|
+
true
|
96
|
+
end
|
97
|
+
|
98
|
+
def path
|
99
|
+
@output.path if @output.respond_to? :path
|
100
|
+
end
|
101
|
+
|
102
|
+
def clear
|
103
|
+
return if Logger.disabled?
|
104
|
+
flush
|
105
|
+
@mutex.synchronize do
|
106
|
+
@buffer.rewind
|
107
|
+
@offset = 0
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def close
|
112
|
+
return if Logger.disabled?
|
113
|
+
flush
|
114
|
+
@buffer.close
|
115
|
+
@output.close
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
# Prints to a buffer.
|
121
|
+
# Must call flush to send to output.
|
122
|
+
class SyncLogger < Logger
|
123
|
+
def print(level, *msg)
|
124
|
+
return if level > @lev || Logger.disabled?
|
125
|
+
@mutex.synchronize {
|
126
|
+
@buffer.print *msg
|
127
|
+
flush if autoflush?
|
128
|
+
}
|
129
|
+
true
|
130
|
+
end
|
131
|
+
|
132
|
+
def puts(level, *msg)
|
133
|
+
#Stella.ld [level, @lev, msg]
|
134
|
+
return if level > @lev || Logger.disabled?
|
135
|
+
@mutex.synchronize {
|
136
|
+
@buffer.puts *msg
|
137
|
+
flush if autoflush?
|
138
|
+
}
|
139
|
+
true
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
data/lib/stella/testplan.rb
CHANGED
@@ -1,11 +1,24 @@
|
|
1
|
-
|
2
|
-
require 'stella/testplan/stats'
|
1
|
+
autoload :CSV, 'csv'
|
3
2
|
|
4
3
|
module Stella
|
5
4
|
class Testplan
|
6
5
|
include Gibbler::Complex
|
7
6
|
extend Attic
|
8
7
|
|
8
|
+
@file_cache = {}
|
9
|
+
|
10
|
+
class << self
|
11
|
+
attr_reader :file_cache
|
12
|
+
def readlines path
|
13
|
+
if @file_cache.has_key?(path)
|
14
|
+
Stella.ld "FILE CACHE HIT: #{path}"
|
15
|
+
return @file_cache[path]
|
16
|
+
end
|
17
|
+
Stella.ld "FILE CACHE LOAD: #{path}"
|
18
|
+
@file_cache[path] = File.readlines(path)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
9
22
|
attic :base_path
|
10
23
|
attic :plan_path
|
11
24
|
|
@@ -108,7 +121,7 @@ class Testplan
|
|
108
121
|
dig = long ? r.digest_cache : r.digest_cache.shorter
|
109
122
|
str << " %-62s".bright % ["#{r.desc} (#{dig})"]
|
110
123
|
str << " %s" % [r]
|
111
|
-
if Stella.
|
124
|
+
if Stella.stdout.lev > 2
|
112
125
|
[:wait].each { |i| str << " %s: %s" % [i, r.send(i)] }
|
113
126
|
end
|
114
127
|
end
|
@@ -121,23 +134,166 @@ class Testplan
|
|
121
134
|
1.0 - @testplan_current_ratio
|
122
135
|
end
|
123
136
|
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
module Stella
|
142
|
+
class Testplan
|
143
|
+
|
144
|
+
#
|
145
|
+
# Any valid Ruby syntax will do the trick:
|
146
|
+
#
|
147
|
+
# usecase(10, "Self-serve") {
|
148
|
+
# post("/listing/add", "Add a listing") {
|
149
|
+
# wait 1..4
|
150
|
+
# param :name => random(8)
|
151
|
+
# param :city => "Vancouver"
|
152
|
+
# response(302) {
|
153
|
+
# repeat 3
|
154
|
+
# }
|
155
|
+
# }
|
156
|
+
# }
|
157
|
+
#
|
158
|
+
class Usecase
|
159
|
+
include Gibbler::Complex
|
160
|
+
include Stella::Data::Helpers
|
161
|
+
extend Attic
|
162
|
+
|
163
|
+
class Auth < Struct.new(:kind, :user, :pass)
|
164
|
+
include Gibbler::Complex
|
165
|
+
end
|
166
|
+
|
167
|
+
attic :base_path # we don't want gibbler to see this
|
168
|
+
attic :plan_path
|
169
|
+
|
170
|
+
attr_accessor :desc
|
171
|
+
attr_writer :ratio
|
172
|
+
attr_reader :http_auth
|
173
|
+
|
174
|
+
attr_accessor :requests
|
175
|
+
attr_accessor :resources
|
176
|
+
|
177
|
+
class UnknownResource < Stella::Error
|
178
|
+
def message; "UnknownResource: #{@obj}"; end
|
179
|
+
end
|
180
|
+
|
181
|
+
def initialize(&blk)
|
182
|
+
@requests, @resources = [], {}
|
183
|
+
instance_eval &blk unless blk.nil?
|
184
|
+
end
|
185
|
+
|
186
|
+
def desc(*args)
|
187
|
+
@desc = args.first unless args.empty?
|
188
|
+
@desc
|
189
|
+
end
|
190
|
+
|
191
|
+
def resource(name, value=nil)
|
192
|
+
@resources[name] = value unless value.nil?
|
193
|
+
@resources[name]
|
194
|
+
end
|
195
|
+
|
196
|
+
def ratio
|
197
|
+
r = (@ratio || 0).to_f
|
198
|
+
r = r/100 if r > 1
|
199
|
+
r
|
200
|
+
end
|
201
|
+
|
202
|
+
def ratio_pretty
|
203
|
+
r = (@ratio || 0).to_f
|
204
|
+
r > 1.0 ? r.to_i : (r * 100).to_i
|
205
|
+
end
|
206
|
+
|
207
|
+
# Reads the contents of the file <tt>path</tt> (the current working
|
208
|
+
# directory is assumed to be the same directory containing the test plan).
|
209
|
+
def read(path)
|
210
|
+
path = File.join(base_path, path) if base_path
|
211
|
+
Stella.ld "READING FILE: #{path}"
|
212
|
+
Stella::Testplan.readlines path
|
213
|
+
end
|
214
|
+
|
215
|
+
def list(path)
|
216
|
+
read(path).collect { |line| line.strip }
|
217
|
+
end
|
218
|
+
|
219
|
+
def csv(path)
|
220
|
+
path = File.join(base_path, path) if base_path
|
221
|
+
Stella.ld "READING CSV: #{path}"
|
222
|
+
file = Stella::Testplan.readlines path
|
223
|
+
CSV.parse file.join
|
224
|
+
end
|
225
|
+
|
226
|
+
def quickcsv(path)
|
227
|
+
path = File.join(base_path, path) if base_path
|
228
|
+
Stella.ld "READING CSV(QUICK): #{path}"
|
229
|
+
ar = []
|
230
|
+
file = Stella::Testplan.readlines path
|
231
|
+
file.each do |l|
|
232
|
+
l.strip!
|
233
|
+
ar << l.split(',')
|
234
|
+
end
|
235
|
+
ar
|
236
|
+
end
|
237
|
+
|
238
|
+
def freeze
|
239
|
+
@requests.each { |r| r.freeze }
|
240
|
+
super
|
241
|
+
self
|
242
|
+
end
|
243
|
+
|
244
|
+
def auth(user, pass=nil, kind=:basic)
|
245
|
+
@http_auth ||= Auth.new
|
246
|
+
@http_auth.user, @http_auth.pass, @http_auth.kind = user, pass, kind
|
247
|
+
end
|
248
|
+
|
249
|
+
def add_request(meth, *args, &blk)
|
250
|
+
req = Stella::Data::HTTP::Request.new meth.to_s.upcase, args[0], &blk
|
251
|
+
req.desc = args[1] if args.size > 1 # Description is optional
|
252
|
+
Stella.ld req
|
253
|
+
@requests << req
|
254
|
+
req
|
255
|
+
end
|
256
|
+
def get(*args, &blk); add_request :get, *args, &blk; end
|
257
|
+
def put(*args, &blk); add_request :put, *args, &blk; end
|
258
|
+
def post(*args, &blk); add_request :post, *args, &blk; end
|
259
|
+
def head(*args, &blk); add_request :head, *args, &blk; end
|
260
|
+
def delete(*args, &blk); add_request :delete, *args, &blk; end
|
261
|
+
|
262
|
+
def xget(*args, &blk); Stella.ld "Skipping get" end
|
263
|
+
def xput(*args, &blk); Stella.ld "Skipping put" end
|
264
|
+
def xpost(*args, &blk); Stella.ld "Skipping post" end
|
265
|
+
def xhead(*args, &blk); Stella.ld "Skipping head" end
|
266
|
+
def xdelete(*args, &blk); Stella.ld "Skipping delete" end
|
267
|
+
|
268
|
+
end
|
269
|
+
|
124
270
|
end
|
125
271
|
end
|
126
272
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
273
|
+
|
274
|
+
|
275
|
+
module Stella
|
276
|
+
class Testplan
|
277
|
+
|
278
|
+
class Stats
|
279
|
+
include Gibbler::Complex
|
280
|
+
attr_reader :requests
|
281
|
+
|
282
|
+
def initialize
|
283
|
+
@requests = OpenStruct.new
|
284
|
+
reset
|
285
|
+
end
|
286
|
+
|
287
|
+
def total_requests
|
288
|
+
@requests.successful + @requests.failed
|
289
|
+
end
|
290
|
+
|
291
|
+
def reset
|
292
|
+
@requests.successful = 0
|
293
|
+
@requests.failed = 0
|
294
|
+
end
|
295
|
+
|
142
296
|
end
|
297
|
+
|
298
|
+
end
|
143
299
|
end
|
data/stella.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
@spec = Gem::Specification.new do |s|
|
2
2
|
s.name = "stella"
|
3
3
|
s.rubyforge_project = 'stella'
|
4
|
-
s.version = "0.7.
|
4
|
+
s.version = "0.7.4.001"
|
5
5
|
s.summary = "Blame Stella for breaking your web applications."
|
6
6
|
s.description = s.summary
|
7
7
|
s.author = "Delano Mandelbaum"
|
@@ -15,10 +15,10 @@
|
|
15
15
|
|
16
16
|
s.executables = %w[stella]
|
17
17
|
|
18
|
-
s.add_dependency 'benelux', '>= 0.5.
|
18
|
+
s.add_dependency 'benelux', '>= 0.5.2'
|
19
19
|
s.add_dependency 'drydock', '>= 0.6.8'
|
20
20
|
s.add_dependency 'gibbler', '>= 0.7.1'
|
21
|
-
s.add_dependency 'sysinfo', '>= 0.7.
|
21
|
+
s.add_dependency 'sysinfo', '>= 0.7.1'
|
22
22
|
s.add_dependency 'storable', '>= 0.5.8'
|
23
23
|
s.add_dependency 'nokogiri'
|
24
24
|
|
@@ -42,33 +42,20 @@
|
|
42
42
|
lib/stella/cli.rb
|
43
43
|
lib/stella/client.rb
|
44
44
|
lib/stella/client/container.rb
|
45
|
-
lib/stella/
|
46
|
-
lib/stella/config.rb
|
45
|
+
lib/stella/common.rb
|
47
46
|
lib/stella/data.rb
|
48
47
|
lib/stella/data/http.rb
|
49
|
-
lib/stella/data/http/body.rb
|
50
|
-
lib/stella/data/http/request.rb
|
51
|
-
lib/stella/data/http/response.rb
|
52
48
|
lib/stella/engine.rb
|
53
49
|
lib/stella/engine/functional.rb
|
54
50
|
lib/stella/engine/load_create.rb
|
55
51
|
lib/stella/engine/load_package.rb
|
56
52
|
lib/stella/engine/load_queue.rb
|
57
53
|
lib/stella/engine/loadbase.rb
|
58
|
-
lib/stella/exceptions.rb
|
59
54
|
lib/stella/guidelines.rb
|
60
|
-
lib/stella/
|
61
|
-
lib/stella/mixins/numeric.rb
|
62
|
-
lib/stella/mixins/string.rb
|
63
|
-
lib/stella/mixins/thread.rb
|
64
|
-
lib/stella/mixins/time.rb
|
65
|
-
lib/stella/stats.rb
|
55
|
+
lib/stella/logger.rb
|
66
56
|
lib/stella/testplan.rb
|
67
|
-
lib/stella/testplan/stats.rb
|
68
|
-
lib/stella/testplan/usecase.rb
|
69
57
|
lib/stella/utils.rb
|
70
58
|
lib/stella/utils/httputil.rb
|
71
|
-
lib/stella/version.rb
|
72
59
|
lib/threadify.rb
|
73
60
|
stella.gemspec
|
74
61
|
support/sample_webapp/app.rb
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stella
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.4.001
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Delano Mandelbaum
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-11-
|
12
|
+
date: 2009-11-11 00:00:00 -05:00
|
13
13
|
default_executable:
|
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.
|
23
|
+
version: 0.5.2
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: drydock
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - ">="
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0.7.
|
53
|
+
version: 0.7.1
|
54
54
|
version:
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: storable
|
@@ -100,33 +100,20 @@ files:
|
|
100
100
|
- lib/stella/cli.rb
|
101
101
|
- lib/stella/client.rb
|
102
102
|
- lib/stella/client/container.rb
|
103
|
-
- lib/stella/
|
104
|
-
- lib/stella/config.rb
|
103
|
+
- lib/stella/common.rb
|
105
104
|
- lib/stella/data.rb
|
106
105
|
- lib/stella/data/http.rb
|
107
|
-
- lib/stella/data/http/body.rb
|
108
|
-
- lib/stella/data/http/request.rb
|
109
|
-
- lib/stella/data/http/response.rb
|
110
106
|
- lib/stella/engine.rb
|
111
107
|
- lib/stella/engine/functional.rb
|
112
108
|
- lib/stella/engine/load_create.rb
|
113
109
|
- lib/stella/engine/load_package.rb
|
114
110
|
- lib/stella/engine/load_queue.rb
|
115
111
|
- lib/stella/engine/loadbase.rb
|
116
|
-
- lib/stella/exceptions.rb
|
117
112
|
- lib/stella/guidelines.rb
|
118
|
-
- lib/stella/
|
119
|
-
- lib/stella/mixins/numeric.rb
|
120
|
-
- lib/stella/mixins/string.rb
|
121
|
-
- lib/stella/mixins/thread.rb
|
122
|
-
- lib/stella/mixins/time.rb
|
123
|
-
- lib/stella/stats.rb
|
113
|
+
- lib/stella/logger.rb
|
124
114
|
- lib/stella/testplan.rb
|
125
|
-
- lib/stella/testplan/stats.rb
|
126
|
-
- lib/stella/testplan/usecase.rb
|
127
115
|
- lib/stella/utils.rb
|
128
116
|
- lib/stella/utils/httputil.rb
|
129
|
-
- lib/stella/version.rb
|
130
117
|
- lib/threadify.rb
|
131
118
|
- stella.gemspec
|
132
119
|
- support/sample_webapp/app.rb
|