internethakai 0.2.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.
- data/CHANGES +53 -0
- data/README +177 -0
- data/bin/hakaigen +10 -0
- data/bin/internethakai +9 -0
- data/internethakai.gemspec +27 -0
- data/lib/internethakai.rb +26 -0
- data/lib/internethakai.rb.~1~ +25 -0
- data/lib/internethakai/action.rb +403 -0
- data/lib/internethakai/client_handler.rb +175 -0
- data/lib/internethakai/client_queue.rb +27 -0
- data/lib/internethakai/concurrency_manager.rb +333 -0
- data/lib/internethakai/concurrency_manager.rb.~1~ +331 -0
- data/lib/internethakai/core.rb +146 -0
- data/lib/internethakai/executor.rb +129 -0
- data/lib/internethakai/generator.rb +32 -0
- data/lib/internethakai/hakairev.rb +119 -0
- data/lib/internethakai/hakairev/executor.rb +43 -0
- data/lib/internethakai/hakairev/http_client.rb +362 -0
- data/lib/internethakai/hakairev/http_client.rb.~1~ +371 -0
- data/lib/internethakai/hakairev/monkey.rb +70 -0
- data/lib/internethakai/hakairev/revpipe.rb +39 -0
- data/lib/internethakai/hakairev/task.rb +39 -0
- data/lib/internethakai/hakairev/time_register.rb +116 -0
- data/lib/internethakai/hakairev/timer_factory.rb +38 -0
- data/lib/internethakai/http_client.rb +120 -0
- data/lib/internethakai/logger.rb +52 -0
- data/lib/internethakai/main.rb +90 -0
- data/lib/internethakai/reporter.rb +143 -0
- data/lib/internethakai/response.rb +65 -0
- data/lib/internethakai/scenario.rb +98 -0
- data/lib/internethakai/scenario.tmpl +58 -0
- data/lib/internethakai/scenario_builder.rb +183 -0
- data/lib/internethakai/scenario_handler.rb +91 -0
- data/lib/internethakai/time_register.rb +53 -0
- data/lib/internethakai/util.rb +130 -0
- metadata +134 -0
@@ -0,0 +1,91 @@
|
|
1
|
+
module InternetHakai
|
2
|
+
# = シナリオを扱うクラス
|
3
|
+
class ScenarioHandler < BaseHandler
|
4
|
+
#require 'resolv'
|
5
|
+
UNIQUE_BY_THREAD = false
|
6
|
+
attr_accessor :config
|
7
|
+
def init config
|
8
|
+
@config = config
|
9
|
+
@size = 0
|
10
|
+
@closed = false
|
11
|
+
@max_request = @config['max_scenario']
|
12
|
+
@max_request_counter = @max_request
|
13
|
+
@act_sum = 0
|
14
|
+
@scenarios = Hash::new
|
15
|
+
@logger = BaseHandler::get_handler(@config["logger"])
|
16
|
+
end
|
17
|
+
def create_scenario process_id=''
|
18
|
+
o = Scenario::new(@config)
|
19
|
+
@size += 1
|
20
|
+
o.scenario_id = (@size.to_s + process_id).to_i
|
21
|
+
o.create_scenario
|
22
|
+
#シナリオのサイズ
|
23
|
+
@scenarios[o.object_id] = o.size
|
24
|
+
@act_sum += o.size
|
25
|
+
o
|
26
|
+
end
|
27
|
+
#すべてのシナリオがつくられた
|
28
|
+
def on_scenarios_created
|
29
|
+
@loop_counter, @mod_counter = @act_sum.divmod(@max_request)
|
30
|
+
@queue = BaseHandler::get_handler(@config['queue'])
|
31
|
+
end
|
32
|
+
def set_on_complete &block
|
33
|
+
@on_complete_callback = block
|
34
|
+
end
|
35
|
+
def on_complete
|
36
|
+
@on_complete_callback.call() if @on_complete_callback
|
37
|
+
end
|
38
|
+
def set_on_turn_complete &block
|
39
|
+
@on_turn_complete_callback = block
|
40
|
+
end
|
41
|
+
def on_turn_complete
|
42
|
+
@queue.add([@on_turn_complete_callback,[]]) if @on_turn_complete_callback
|
43
|
+
@logger.run('o', 2)
|
44
|
+
end
|
45
|
+
def silence
|
46
|
+
def on_turn_complete
|
47
|
+
@queue.add([@on_turn_complete_callback,[]]) if @on_turn_complete_callback
|
48
|
+
end
|
49
|
+
end
|
50
|
+
# = ひとつのアクションが終了時に呼ばれる
|
51
|
+
def quit_action scenario_id
|
52
|
+
#ひとつのアクションが終了
|
53
|
+
@scenarios[scenario_id] -= 1
|
54
|
+
@max_request_counter -= 1
|
55
|
+
#puts "req_counter: #{@max_request_counter}"
|
56
|
+
if @max_request_counter == 0
|
57
|
+
#ひとつのアクション×リクエスト並列数が終了
|
58
|
+
on_turn_complete
|
59
|
+
@max_request_counter = @max_request
|
60
|
+
@loop_counter -= 1
|
61
|
+
end
|
62
|
+
#シナリオ並列数と、リクエスト並列数がちがうので、あまりの処理が必要
|
63
|
+
#puts "loop: #{@loop_counter}"
|
64
|
+
#if @loop_counter == 0
|
65
|
+
# @mod_counter -= 1
|
66
|
+
# if @mod_counter==0
|
67
|
+
# on_turn_complete
|
68
|
+
# on_complete
|
69
|
+
# end
|
70
|
+
#end
|
71
|
+
if(@scenarios[scenario_id]==0)
|
72
|
+
#ひとつのシナリオが終了
|
73
|
+
@size -= 1
|
74
|
+
#@logger.run("size:#{@size}\n", 2)
|
75
|
+
if @size==0
|
76
|
+
@logger.run("O", 2)
|
77
|
+
on_complete
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
def closed?
|
82
|
+
@closed
|
83
|
+
end
|
84
|
+
def close
|
85
|
+
@closed = true
|
86
|
+
end
|
87
|
+
def complete?
|
88
|
+
@size <= 0
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module InternetHakai
|
2
|
+
# = 時間記録
|
3
|
+
class TimeRegister < BaseHandler
|
4
|
+
UNIQUE_BY_THREAD = false
|
5
|
+
def on_create
|
6
|
+
@report = ResponseRecord::new
|
7
|
+
@stack = []
|
8
|
+
end
|
9
|
+
def get_record
|
10
|
+
exec unless @stack.empty?
|
11
|
+
@report
|
12
|
+
end
|
13
|
+
def exec
|
14
|
+
for arg in @stack
|
15
|
+
do_regist(*arg)
|
16
|
+
end
|
17
|
+
@stack = []
|
18
|
+
end
|
19
|
+
def regist name, time, response, error
|
20
|
+
@stack << [name, time, response, error]
|
21
|
+
end
|
22
|
+
def do_regist name, time, response, error
|
23
|
+
time = time.to_f
|
24
|
+
v = @report[name]
|
25
|
+
if response.nil?
|
26
|
+
status = 0
|
27
|
+
else
|
28
|
+
status = response.status
|
29
|
+
v[:size] += response.body.size
|
30
|
+
end
|
31
|
+
|
32
|
+
#if (response.nil? || (status != 200 && (status / 100 != 3)))
|
33
|
+
# v[:errorcount] += 1 ## エラーカウント
|
34
|
+
#end
|
35
|
+
if v[:min].nil? and time != 0
|
36
|
+
v[:min] = time
|
37
|
+
v[:max] = time
|
38
|
+
elsif time != 0
|
39
|
+
v[:min] = v[:min] < time ? v[:min] : time
|
40
|
+
end
|
41
|
+
if time != 0
|
42
|
+
v[:max] = v[:max] > time ? v[:max] : time
|
43
|
+
end
|
44
|
+
v[:totaltime] += time ## 総合時間
|
45
|
+
v[:accesscount] += 1 if time > 0
|
46
|
+
v[:errorcount] += error
|
47
|
+
v["status:#{status}"] = v["status:#{status}"].to_i + 1 unless response.nil?
|
48
|
+
v["time:#{((time*1000).to_i/100)*100}"] = v["time:#{((time*1000).to_i/100)*100}"].to_i + 1
|
49
|
+
#detail は 一度だけ上書き
|
50
|
+
#v[:detail] += detail if(detail != "" && v[:detail]=="")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
module InternetHakai
|
2
|
+
class Util
|
3
|
+
require 'uri'
|
4
|
+
require 'kconv'
|
5
|
+
require 'nkf'
|
6
|
+
def self::encode_method(meth)
|
7
|
+
case meth
|
8
|
+
when 'GET'
|
9
|
+
GET
|
10
|
+
when 'POST'
|
11
|
+
POST
|
12
|
+
when 'PUT'
|
13
|
+
PUT
|
14
|
+
when 'DELETE'
|
15
|
+
DELETE
|
16
|
+
end
|
17
|
+
end
|
18
|
+
def self::time(msg, &b)
|
19
|
+
t = Time::now
|
20
|
+
b.call
|
21
|
+
d = (Time::now - t)*1000
|
22
|
+
puts "#{msg}: #{d}"
|
23
|
+
end
|
24
|
+
def self::hash2poststring(body)
|
25
|
+
body.map do |key,value|
|
26
|
+
"#{URI.encode(key)}=#{URI.encode(value.to_s)}"
|
27
|
+
end.join("&")
|
28
|
+
end
|
29
|
+
def self::set_params(url, params)
|
30
|
+
unless url.include? "?"
|
31
|
+
url += "?"
|
32
|
+
else
|
33
|
+
url[url.size-1] != "&"
|
34
|
+
url += "&"
|
35
|
+
end
|
36
|
+
q = []
|
37
|
+
params.each do |k,v|
|
38
|
+
one = URI::encode(k.to_s)
|
39
|
+
one += "="
|
40
|
+
one += URI::encode(v.to_s)
|
41
|
+
q << one
|
42
|
+
end
|
43
|
+
url + q.join("&")
|
44
|
+
end
|
45
|
+
def self::parse_url url
|
46
|
+
hostpath = url.slice(url.index('://')+3, url.size)
|
47
|
+
if pathstart = hostpath.index('/')
|
48
|
+
host = hostpath.slice(0, pathstart)
|
49
|
+
path = hostpath.slice(pathstart, hostpath.size)
|
50
|
+
else
|
51
|
+
host = hostpath
|
52
|
+
path = '/'
|
53
|
+
end
|
54
|
+
if portstart = host.index(':')
|
55
|
+
host, port = host.split(':')
|
56
|
+
port = port.to_i
|
57
|
+
else
|
58
|
+
port = 80
|
59
|
+
end
|
60
|
+
[host, port, path]
|
61
|
+
end
|
62
|
+
def self::parse_post_string ar
|
63
|
+
ar.map do |key,value|
|
64
|
+
"#{URI.encode(key)}=#{URI.encode(value.to_s)}"
|
65
|
+
end.join("&")
|
66
|
+
end
|
67
|
+
def self::get_query path
|
68
|
+
#ワンライナーで書けた!
|
69
|
+
Hash[ *path[/\?(.*)/, 1].to_s.split("&").map{|kv| ((v = kv.split("=")).size==2 ? v : []).map(&URI::method(:decode))}.flatten ]
|
70
|
+
end
|
71
|
+
def self::convert_encoding(str, params)
|
72
|
+
return if str.nil?
|
73
|
+
encoding = params["encoding"].upcase
|
74
|
+
opt = "-x#{self::get_encode_nkf(encoding)}W"
|
75
|
+
NKF::nkf(opt, str)
|
76
|
+
#Kconv::kconv(str, self::get_encode(encoding), Kconv::UTF8)
|
77
|
+
end
|
78
|
+
def self::recover_encoding(str, params)
|
79
|
+
return if str.nil?
|
80
|
+
encoding = params["encoding"].upcase
|
81
|
+
opt = "-xw#{self::get_encode_nkf_input(encoding)}"
|
82
|
+
NKF::nkf(opt, str)
|
83
|
+
#Kconv::kconv(str, Kconv::UTF8, self::get_encode(encoding))
|
84
|
+
end
|
85
|
+
def self::get_encode encode
|
86
|
+
case encode
|
87
|
+
when "SHIFT_JIS", "SJIS-WIN", "SHIFTJIS"
|
88
|
+
Kconv::SJIS
|
89
|
+
when "UTF-8"
|
90
|
+
Kconv::UTF8
|
91
|
+
when "JIS"
|
92
|
+
Kconv::JIS
|
93
|
+
when "EUC-JP"
|
94
|
+
Kconv::EUC
|
95
|
+
else
|
96
|
+
Kconv::UNKNOWN
|
97
|
+
end
|
98
|
+
end
|
99
|
+
def self::get_encode_nkf encode
|
100
|
+
case encode
|
101
|
+
when "SHIFT_JIS", "SJIS-WIN", "SHIFTJIS"
|
102
|
+
's'
|
103
|
+
when "UTF-8"
|
104
|
+
'w'
|
105
|
+
when "JIS"
|
106
|
+
'j'
|
107
|
+
when "EUC-JP"
|
108
|
+
'e'
|
109
|
+
else
|
110
|
+
nil
|
111
|
+
end
|
112
|
+
end
|
113
|
+
def self::get_encode_nkf_input encode
|
114
|
+
case encode
|
115
|
+
when "SHIFT_JIS", "SJIS-WIN", "SHIFTJIS"
|
116
|
+
'S'
|
117
|
+
when "UTF-8"
|
118
|
+
'W'
|
119
|
+
when "JIS"
|
120
|
+
'J'
|
121
|
+
when "EUC-JP"
|
122
|
+
'E'
|
123
|
+
else
|
124
|
+
nil
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
|
130
|
+
end
|
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: internethakai
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- takada-at
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-02-26 00:00:00 +09:00
|
18
|
+
default_executable: internethakai
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rev
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 3
|
30
|
+
- 2
|
31
|
+
version: 0.3.2
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: iobuffer
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
- 1
|
44
|
+
- 3
|
45
|
+
version: 0.1.3
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
48
|
+
description: " scenario test tool for web application.\n"
|
49
|
+
email: takada-at@klab.jp
|
50
|
+
executables:
|
51
|
+
- hakaigen
|
52
|
+
- internethakai
|
53
|
+
extensions: []
|
54
|
+
|
55
|
+
extra_rdoc_files:
|
56
|
+
- README
|
57
|
+
- CHANGES
|
58
|
+
files:
|
59
|
+
- lib/internethakai/logger.rb
|
60
|
+
- lib/internethakai/executor.rb
|
61
|
+
- lib/internethakai/hakairev.rb
|
62
|
+
- lib/internethakai/scenario_handler.rb
|
63
|
+
- lib/internethakai/main.rb
|
64
|
+
- lib/internethakai/scenario_builder.rb
|
65
|
+
- lib/internethakai/reporter.rb
|
66
|
+
- lib/internethakai/scenario.tmpl
|
67
|
+
- lib/internethakai/hakairev/http_client.rb.~1~
|
68
|
+
- lib/internethakai/hakairev/executor.rb
|
69
|
+
- lib/internethakai/hakairev/revpipe.rb
|
70
|
+
- lib/internethakai/hakairev/monkey.rb
|
71
|
+
- lib/internethakai/hakairev/http_client.rb
|
72
|
+
- lib/internethakai/hakairev/time_register.rb
|
73
|
+
- lib/internethakai/hakairev/task.rb
|
74
|
+
- lib/internethakai/hakairev/timer_factory.rb
|
75
|
+
- lib/internethakai/http_client.rb
|
76
|
+
- lib/internethakai/client_handler.rb
|
77
|
+
- lib/internethakai/action.rb
|
78
|
+
- lib/internethakai/core.rb
|
79
|
+
- lib/internethakai/time_register.rb
|
80
|
+
- lib/internethakai/generator.rb
|
81
|
+
- lib/internethakai/util.rb
|
82
|
+
- lib/internethakai/concurrency_manager.rb
|
83
|
+
- lib/internethakai/concurrency_manager.rb.~1~
|
84
|
+
- lib/internethakai/response.rb
|
85
|
+
- lib/internethakai/client_queue.rb
|
86
|
+
- lib/internethakai/scenario.rb
|
87
|
+
- lib/internethakai.rb.~1~
|
88
|
+
- lib/internethakai.rb
|
89
|
+
- bin/hakaigen
|
90
|
+
- bin/internethakai
|
91
|
+
- internethakai.gemspec
|
92
|
+
- README
|
93
|
+
- CHANGES
|
94
|
+
has_rdoc: true
|
95
|
+
homepage: ""
|
96
|
+
licenses: []
|
97
|
+
|
98
|
+
post_install_message:
|
99
|
+
rdoc_options:
|
100
|
+
- -U
|
101
|
+
- -c
|
102
|
+
- UTF-8
|
103
|
+
- -t
|
104
|
+
- !binary |
|
105
|
+
IuOCpOODs+OCv+ODvOODjeODg+ODiOegtOWjiiI=
|
106
|
+
|
107
|
+
- --main=README
|
108
|
+
require_paths:
|
109
|
+
- lib
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
segments:
|
115
|
+
- 1
|
116
|
+
- 8
|
117
|
+
- 6
|
118
|
+
version: 1.8.6
|
119
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
segments:
|
124
|
+
- 0
|
125
|
+
version: "0"
|
126
|
+
requirements: []
|
127
|
+
|
128
|
+
rubyforge_project: internethakai
|
129
|
+
rubygems_version: 1.3.6
|
130
|
+
signing_key:
|
131
|
+
specification_version: 3
|
132
|
+
summary: scenario test tool for web application
|
133
|
+
test_files: []
|
134
|
+
|