internethakai 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. data/CHANGES +53 -0
  2. data/README +177 -0
  3. data/bin/hakaigen +10 -0
  4. data/bin/internethakai +9 -0
  5. data/internethakai.gemspec +27 -0
  6. data/lib/internethakai.rb +26 -0
  7. data/lib/internethakai.rb.~1~ +25 -0
  8. data/lib/internethakai/action.rb +403 -0
  9. data/lib/internethakai/client_handler.rb +175 -0
  10. data/lib/internethakai/client_queue.rb +27 -0
  11. data/lib/internethakai/concurrency_manager.rb +333 -0
  12. data/lib/internethakai/concurrency_manager.rb.~1~ +331 -0
  13. data/lib/internethakai/core.rb +146 -0
  14. data/lib/internethakai/executor.rb +129 -0
  15. data/lib/internethakai/generator.rb +32 -0
  16. data/lib/internethakai/hakairev.rb +119 -0
  17. data/lib/internethakai/hakairev/executor.rb +43 -0
  18. data/lib/internethakai/hakairev/http_client.rb +362 -0
  19. data/lib/internethakai/hakairev/http_client.rb.~1~ +371 -0
  20. data/lib/internethakai/hakairev/monkey.rb +70 -0
  21. data/lib/internethakai/hakairev/revpipe.rb +39 -0
  22. data/lib/internethakai/hakairev/task.rb +39 -0
  23. data/lib/internethakai/hakairev/time_register.rb +116 -0
  24. data/lib/internethakai/hakairev/timer_factory.rb +38 -0
  25. data/lib/internethakai/http_client.rb +120 -0
  26. data/lib/internethakai/logger.rb +52 -0
  27. data/lib/internethakai/main.rb +90 -0
  28. data/lib/internethakai/reporter.rb +143 -0
  29. data/lib/internethakai/response.rb +65 -0
  30. data/lib/internethakai/scenario.rb +98 -0
  31. data/lib/internethakai/scenario.tmpl +58 -0
  32. data/lib/internethakai/scenario_builder.rb +183 -0
  33. data/lib/internethakai/scenario_handler.rb +91 -0
  34. data/lib/internethakai/time_register.rb +53 -0
  35. data/lib/internethakai/util.rb +130 -0
  36. 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
+