super-test 1.0.9

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.
Files changed (108) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGE.txt +9 -0
  3. data/README.txt +13 -0
  4. data/bin/idb +19 -0
  5. data/bin/ii +113 -0
  6. data/bin/istart_mock +36 -0
  7. data/bin/istop_mock +16 -0
  8. data/bin/kk +181 -0
  9. data/bin/rubyatp +42 -0
  10. data/bin/start_mock +36 -0
  11. data/bin/stop_mock +16 -0
  12. data/bin/xgo +45 -0
  13. data/conf/conf.rb +11 -0
  14. data/conf/db03.yml +31 -0
  15. data/conf/db13.yml +37 -0
  16. data/conf/db19.yml +33 -0
  17. data/conf/online.yml +32 -0
  18. data/conf/super_test.yml +40 -0
  19. data/conf/system.yml +26 -0
  20. data/conf/sz00.yml +31 -0
  21. data/conf/sz06.yml +34 -0
  22. data/conf/wise00.yml +11 -0
  23. data/data/case.house +0 -0
  24. data/data/char.house +0 -0
  25. data/data/images/Bluehills.jpg +0 -0
  26. data/data/images/Sunset.jpg +0 -0
  27. data/data/images/Waterlilies.jpg +0 -0
  28. data/data/images/Winter.jpg +0 -0
  29. data/data/query.house +18595 -0
  30. data/data/user.house +8 -0
  31. data/lib/action/module/check_action.rb +58 -0
  32. data/lib/action/module/cnnt_action.rb +161 -0
  33. data/lib/action/module/datacenter_action.rb +48 -0
  34. data/lib/action/module/http_pack_helper.rb +163 -0
  35. data/lib/action/module/httpserver_action.rb +297 -0
  36. data/lib/action/module/inc.rb +21 -0
  37. data/lib/action/module/mcpack_action.rb +57 -0
  38. data/lib/action/module/sql_action.rb +84 -0
  39. data/lib/action/module/ssh_action.rb +37 -0
  40. data/lib/action/system/user_action.rb +180 -0
  41. data/lib/common/appium_helper.rb +217 -0
  42. data/lib/common/atp_helper.rb +74 -0
  43. data/lib/common/atp_report.rb +344 -0
  44. data/lib/common/data_house.rb +405 -0
  45. data/lib/common/data_model.rb +87 -0
  46. data/lib/common/http/assert_helper.rb +343 -0
  47. data/lib/common/http/fix_hpricot.rb +118 -0
  48. data/lib/common/http/html_helper.rb +362 -0
  49. data/lib/common/http/http_helper.rb +469 -0
  50. data/lib/common/http/multipart.rb +81 -0
  51. data/lib/common/isandbox_helper.rb +195 -0
  52. data/lib/common/json_helper.rb +43 -0
  53. data/lib/common/mock_helper.rb +168 -0
  54. data/lib/common/mtop_helper.rb +141 -0
  55. data/lib/common/myconf_helper.rb +49 -0
  56. data/lib/common/mylog_helper.rb +77 -0
  57. data/lib/common/pairwise.rb +121 -0
  58. data/lib/common/query_house.rb +89 -0
  59. data/lib/common/report_helper.rb +97 -0
  60. data/lib/common/robot_helper.rb +85 -0
  61. data/lib/common/socket/check.rb +325 -0
  62. data/lib/common/socket/conf_modifier.rb +149 -0
  63. data/lib/common/socket/context.rb +55 -0
  64. data/lib/common/socket/data.rb +392 -0
  65. data/lib/common/socket/data_helper.rb +41 -0
  66. data/lib/common/socket/env.rb +317 -0
  67. data/lib/common/socket/inc.rb +24 -0
  68. data/lib/common/socket/log.rb +213 -0
  69. data/lib/common/socket/log4s.rb +58 -0
  70. data/lib/common/socket/log_helper.rb +332 -0
  71. data/lib/common/socket/my_sql.rb +77 -0
  72. data/lib/common/socket/net.rb +74 -0
  73. data/lib/common/socket/network.rb +115 -0
  74. data/lib/common/socket/rlib/conf_modifier.rb +130 -0
  75. data/lib/common/socket/rlib/data_helper.rb +33 -0
  76. data/lib/common/socket/rlib/log_helper.rb +303 -0
  77. data/lib/common/socket/rlib/process_helper.rb +91 -0
  78. data/lib/common/socket/stub.rb +276 -0
  79. data/lib/common/socket/util.rb +266 -0
  80. data/lib/patterns/inc.rb +10 -0
  81. data/lib/patterns/mc_base_pattern.rb +474 -0
  82. data/lib/patterns/some_pattern.rb +145 -0
  83. data/lib/super_test.rb +114 -0
  84. data/log/super_test.log +0 -0
  85. data/log/super_test.log.wf +0 -0
  86. data/test/cover_me.rb +6 -0
  87. data/tool/jenny +0 -0
  88. data/tool/mcsend/mcsend2 +0 -0
  89. data/tool/mcsend/mcsend2_shead +0 -0
  90. data/tool/mcserver/conf/mcserver.conf +77 -0
  91. data/tool/mcserver/conf/mcserverauthip +17 -0
  92. data/tool/mcserver/mcserver +0 -0
  93. data/tool/mcserver/mcserver_trans +0 -0
  94. data/tool/mysql +0 -0
  95. data/tool/net/mcsend/mcsend +0 -0
  96. data/tool/net/mcsend/mcsend_trans +0 -0
  97. data/tool/net/mcsend/nshead.data +7 -0
  98. data/tool/net/mcsend/res_nshead.data +7 -0
  99. data/tool/net/my_client/my_client +0 -0
  100. data/tool/net/tsclient/client.tcl +205 -0
  101. data/tool/others/kk +190 -0
  102. data/tool/others/rubyatp +42 -0
  103. data/tool/others/supertest_install.sh +34 -0
  104. data/tool/trip/idb +0 -0
  105. data/tool/ts-agent/nshead.bft +12 -0
  106. data/tool/ts-agent/server.conf +10 -0
  107. data/tool/ts-agent/server.tcl +376 -0
  108. metadata +275 -0
@@ -0,0 +1,81 @@
1
+ # Takes a hash of string and file parameters and returns a string of text
2
+ # formatted to be sent as a multipart form post.
3
+ #
4
+ # Author:: Cody Brimhall <mailto:cbrimhall@ucdavis.edu>
5
+ # Created:: 22 Feb 2008
6
+ # coding: utf-8
7
+
8
+ require 'mime/types'
9
+ require 'cgi'
10
+
11
+
12
+ module Multipart
13
+ VERSION = "1.0.0" unless const_defined?(:VERSION)
14
+
15
+ # Formats a given hash as a multipart form post
16
+ # If a hash value responds to :string or :read messages, then it is
17
+ # interpreted as a file and processed accordingly; otherwise, it is assumed
18
+ # to be a string
19
+ class Post
20
+ # We have to pretend like we're a web browser...
21
+ USERAGENT = "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/523.10.6 (KHTML, like Gecko) Version/3.0.4 Safari/523.10.6" unless const_defined?(:USERAGENT)
22
+ #BOUNDARY = "0123456789ABLEWASIEREISAWELBA9876543210" unless const_defined?(:BOUNDARY)
23
+ BOUNDARY = "--------------01234HELLOSPACE56789" unless const_defined?(:BOUNDARY)
24
+ CONTENT_TYPE = "multipart/form-data; boundary=#{ BOUNDARY }" unless const_defined?(:CONTENT_TYPE)
25
+ HEADER = { "Content-Type" => CONTENT_TYPE, "User-Agent" => USERAGENT } unless const_defined?(:HEADER)
26
+
27
+ def self.prepare_query(params)
28
+ fp = []
29
+
30
+ params.each do |k, v|
31
+ # Are we trying to make a file parameter?
32
+ if v.respond_to?(:path) and v.respond_to?(:read) then
33
+ fp.push(FileParam.new(k, v.path, v.read))
34
+ # We must be trying to make a regular parameter
35
+ else
36
+ fp.push(StringParam.new(k, v))
37
+ end
38
+ end
39
+
40
+ # Assemble the request body using the special multipart format
41
+ query = fp.collect {|p| "--" + BOUNDARY + "\r\n" + p.to_multipart }.join("") + "--" + BOUNDARY + "--\r\n"
42
+ return query, HEADER
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ # Formats a basic string key/value pair for inclusion with a multipart post
49
+ class StringParam
50
+ attr_accessor :k, :v
51
+
52
+ def initialize(k, v)
53
+ @k = k
54
+ @v = v
55
+ end
56
+
57
+ def to_multipart
58
+ return "Content-Disposition: form-data; name=\"#{k}\"\r\n\r\n#{v.to_s.force_encoding('ISO-8859-1')}\r\n"
59
+ end
60
+ end
61
+
62
+ # Formats the contents of a file or string for inclusion with a multipart
63
+ # form post
64
+ class FileParam
65
+ attr_accessor :k, :filename, :content
66
+
67
+ def initialize(k, filename, content)
68
+ @k = k
69
+ @filename = filename
70
+ @content = content
71
+ end
72
+
73
+ def to_multipart
74
+ # If we can tell the possible mime-type from the filename, use the
75
+ # first in the list; otherwise, use "application/octet-stream"
76
+ mime_type = MIME::Types.type_for(filename)[0] || MIME::Types["application/octet-stream"][0]
77
+ return "Content-Disposition: form-data; name=\"#{k}\"; filename=\"#{ filename }\"\r\n" +
78
+ "Content-Type: #{ mime_type.simplified }\r\n\r\n#{ content }\r\n"
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,195 @@
1
+ #!/usr/bin/env ruby
2
+ # coding: utf-8
3
+ #
4
+ # Author:: yzm
5
+ # Date:: 2016-03-01 19:05:44 +0800
6
+ ###########################################
7
+
8
+
9
+
10
+ # 封装访问ios设备沙盒文件的核心模块
11
+ module ISandBoxHelper
12
+ # include ConfigHelper
13
+
14
+ # === 功能:
15
+ # 向非越狱iphone推送一段内容
16
+ #
17
+ # === 参数解释:
18
+ # filename: 只是存储文件名,不带路径,目前mock路径是约定的
19
+ # data: 推送内容,一般是string,其他可以直接写入文件的写可以
20
+ #
21
+ # === Example:
22
+ # Example #1:
23
+ #
24
+ def ipush_data(path, data, filename='')
25
+ mount
26
+ begin
27
+ root_folder = $isandbox_operator.tmp_folder_name + path
28
+ exec_cmd("mkdir #{root_folder}") unless File.directory? root_folder
29
+ filename = root_folder + '/' + filename.to_s.split('/')[-1]
30
+ # 去除可能的 //
31
+ filename.sub(/\/\//, '/')
32
+ File.open(filename, "w+") do |file|
33
+ file.puts data
34
+ end
35
+ rescue
36
+ p "error:#{$!} at:#{$@}"
37
+ ensure
38
+ umount
39
+ end
40
+ end
41
+
42
+ # === 功能:
43
+ # 向非越狱iphone推送一个mock文件
44
+ #
45
+ # === 参数解释:
46
+ # filename: mock文件在MAC上的路径和文件名
47
+ #
48
+ # === Example:
49
+ # Example #1:
50
+ #
51
+ def ipush_file(path, file)
52
+ mount
53
+ begin
54
+ path = $isandbox_operator.tmp_folder_name + path
55
+ path.sub(/\/\//, '/')
56
+ exec_cmd "cp #{file} #{path}"
57
+ rescue
58
+ p "error:#{$!} at:#{$@}"
59
+ ensure
60
+ umount
61
+ end
62
+ end
63
+
64
+ # === 功能:
65
+ # 从非越狱iphone拉取一个文件
66
+ #
67
+ # === 参数解释:
68
+ # path: 文件在iphone上的路径和文件名
69
+ #
70
+ # === Example:
71
+ # Example #1:
72
+ #
73
+ def ipull_file(path)
74
+
75
+ mount
76
+ begin
77
+ exec_cmd "cat #{path}" if File.file? path
78
+ rescue
79
+ p "error:#{$!} at:#{$@}"
80
+ ensure
81
+ umount
82
+ end
83
+ end
84
+
85
+ # === 功能:
86
+ # 从非越狱iphone删除文件
87
+ #
88
+ # === 参数解释:
89
+ # - path: 待删除文件或路径
90
+ #
91
+ # === Example:
92
+ # Example #1:
93
+ #
94
+ def iremove_file(path)
95
+ mount
96
+ begin
97
+ path = $isandbox_operator.tmp_folder_name + path
98
+ if File.directory? path
99
+ path = path + '/*'
100
+ path.sub(/\/\//, '/')
101
+ end
102
+ exec_cmd "rm -rf #{path}"
103
+ rescue
104
+ p "error:#{$!} at:#{$@}"
105
+ ensure
106
+ umount
107
+ end
108
+ end
109
+
110
+ ##########################
111
+ # 以下为内部方法,不建议调用 #
112
+ ##########################
113
+ private
114
+
115
+ # === 功能:
116
+ # 挂载alitrip沙盒
117
+ # === 参数解释:
118
+ #
119
+ # === Example:
120
+ # Example #1:
121
+ #
122
+ def mount
123
+ $isandbox_operator = ISandboxOperator.new if $has_instance.nil?
124
+ $isandbox_operator.mount
125
+ end
126
+
127
+ # === 功能:
128
+ # 卸载alitrip沙盒
129
+ # === 参数解释:
130
+ #
131
+ # === Example:
132
+ # Example #1:
133
+ #
134
+ def umount
135
+ $isandbox_operator.umount
136
+ end
137
+
138
+ # === 功能:
139
+ # 执行shell命令
140
+ # === 参数解释:
141
+ # cmd: shell命令
142
+ # === Example:
143
+ # Example #1:
144
+ #
145
+ def exec_cmd(cmd)
146
+ $isandbox_operator.exec_cmd cmd
147
+ end
148
+
149
+ class ISandboxOperator
150
+
151
+ attr_accessor :tmp_folder_name
152
+ attr_accessor :udid
153
+ attr_accessor :container
154
+
155
+ def initialize
156
+ fail 'ifuse must be install' unless ifuse_exist?
157
+ # @caps = ConfigHelper::CONF["appium_driver"]["caps"]
158
+ # @udid = @caps["udid"]
159
+ @udid = `idevice_id -l`.split(' ')[0]
160
+ @container = 'com.taobao.alitrip'
161
+ $has_instance = self
162
+ self
163
+ end
164
+
165
+ def mount
166
+ @tmp_folder_name = Time.new.to_i.to_s
167
+ exec_cmd "mkdir #{@tmp_folder_name}" unless File.exists? @tmp_folder_name
168
+ exec_cmd "ifuse -u #{@udid} --container #{@container} #{@tmp_folder_name}"
169
+ @flag_folder = @tmp_folder_name + '/tmp'
170
+ while true
171
+ break if File.directory? @flag_folder
172
+ end
173
+ @has_mount = true
174
+ end
175
+
176
+ def umount
177
+ exec_cmd "umount #{@tmp_folder_name}"
178
+ while true
179
+ break unless File.directory? @flag_folder
180
+ end
181
+ exec_cmd "rm -rf #{@tmp_folder_name}"
182
+ end
183
+
184
+ def exec_cmd(cmd)
185
+ system cmd
186
+ end
187
+
188
+ ## 检测用户电脑上是否存在 ifuse
189
+ def ifuse_exist?
190
+ exec_cmd('ifuse -h > /dev/null 2>&1')
191
+ end
192
+
193
+ end
194
+
195
+ end
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env ruby
2
+ # coding: utf-8
3
+ #
4
+ # Author:: hanyu
5
+ # Date:: 2009.12.3
6
+
7
+ # ruby的json库因为只处理utf-8字符,我们用起来很不方便
8
+ # 所以我们使用的是 ruby-json 库
9
+ # 必须 gem install ruby-json
10
+ require 'json'
11
+
12
+ module JsonHelper
13
+
14
+ # === 功能:
15
+ # 封装对JSON的解析
16
+ #
17
+ # === 参数解释:
18
+ # - str JSON字符串
19
+ #
20
+ # === Example:
21
+ # Example #1:
22
+ # puts ({"fs"=>"非技术","xv"=>[3,4,{3=>4},"飞拉萨"],4=>5}).to_json
23
+ # #=> {"fs":"非技术","xv":[3,4,{"3":4},"飞拉萨"],"4":5}
24
+ #
25
+ # h = parse_json('{"fjsl":"方式来快递费",243:42,"ha":[3,4,"方式来开发","fs"],"非技术":"附件"}')
26
+ # p h
27
+ # #=> {"fjsl"=>"方式来快递费", "243"=>42, "ha"=>[3, 4, "方式来开发", "fs"], "非技术"=>"附件"}
28
+ def parse_json(str)
29
+ JSON.parse(str)
30
+ end
31
+ alias from_json parse_json
32
+ alias decode_json parse_json
33
+
34
+ # === 功能:
35
+ # 将对象转成json字符串
36
+ # 本来是不需要的,为了与parse_json对称,特意加的
37
+ def to_json(obj)
38
+ obj.to_json
39
+ end
40
+ alias encode_json to_json
41
+
42
+ end
43
+
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env ruby
2
+ # coding: utf-8
3
+ #
4
+ # Author:: yzm
5
+ # Date:: 2016-03-25 19:41:22 +0800
6
+ ###########################################
7
+
8
+
9
+
10
+ # 封装mtop结果mock的核心模块
11
+ module MockHelper
12
+
13
+ include JsonHelper
14
+ include ISandBoxHelper
15
+
16
+ # === 功能:
17
+ # 用于alitrip客户端mock数据,推送mock数据到手机,可多次调用,不会冲掉之前的mock
18
+ # === 参数解释:
19
+ # what 此处填string内容/此处填PC上数据文件的路径/Hash
20
+ # === Example:
21
+ # Example #1:
22
+ # mock 'string content'
23
+ # Example #2:
24
+ # mock /filepath/on/PC
25
+ def start_mock(what, fn=nil)
26
+
27
+ system 'adb shell dumpsys activity top trip start mtop_mock_response > /dev/null 2>&1'
28
+ mobile_mock_folder = '/mnt/sdcard/AlitripMockData/'
29
+
30
+ if what.class == String
31
+ begin
32
+ json_data = JSON.parse what.dup
33
+ fail 'api is missing' if (json_data['api'].nil? and fn.nil?)
34
+ if fn
35
+ file_name = fn
36
+ else
37
+ file_name = json_data['api'] + '.json'
38
+ end
39
+
40
+ data = what.to_s
41
+ rescue
42
+ begin
43
+ data = IO.read(what.to_s)
44
+ json_data = JSON.parse data
45
+ fail 'api is missing' if (json_data['api'].nil? and fn.nil?)
46
+ if fn
47
+ file_name = fn
48
+ else
49
+ file_name = json_data['api'] + '.json'
50
+ end
51
+
52
+ rescue
53
+ raise Exception, 'file not exist'
54
+ end
55
+ end
56
+ elsif what.is_a? Hash
57
+ fail 'api is missing' if (what['api'].nil? and fn.nil?)
58
+
59
+ data = what.to_json.to_s
60
+
61
+ if fn
62
+ file_name = fn
63
+ else
64
+ file_name = data['api'] + '.json'
65
+ end
66
+
67
+ end
68
+
69
+ mock_path = mobile_mock_folder + file_name
70
+ begin
71
+ tmp_file = '.mockFile'
72
+ File.open(tmp_file, "w+") do |file|
73
+ file.puts data
74
+ end
75
+ system "adb push #{tmp_file} #{mock_path} > /dev/null 2>&1"
76
+ rescue
77
+ raise Exception, "error:#{$!} at:#{$@}"
78
+ ensure
79
+ system "rm -rf #{tmp_file} > /dev/null 2>&1"
80
+ end
81
+ #
82
+ # push_file mock_path, data
83
+
84
+ end
85
+
86
+ # === 功能:
87
+ # 删除mock数据,只需要调用一次,建议在teardown中调用
88
+ # === 参数解释:
89
+ #
90
+ # === Example:
91
+ # Example #1:
92
+ #
93
+ #
94
+ def stop_mock()
95
+ system 'adb shell dumpsys activity top trip stop mtop_mock_response > /dev/null 2>&1'
96
+ system 'adb shell rm -rf /sdcard/AlitripMockData'
97
+ end
98
+
99
+ # === 功能:
100
+ # iPhone mock数据关键字,可多次调用,不会冲掉上次的mock
101
+ # === 参数解释:
102
+ # what 此处填string内容/此处填PC上数据文件的路径/Hash
103
+ # === Example:
104
+ # Example #1:
105
+ #
106
+ #
107
+ def istart_mock(what, fn=nil)
108
+ @mobile_mock_folder = '/tmp/mtopmock'
109
+ if what.class == String
110
+ begin
111
+ json_data = JSON.parse what.dup
112
+ data = what.to_s
113
+ fail 'api is missing' if json_data['api'].nil?
114
+ if fn
115
+ file_name = fn
116
+ else
117
+ file_name = json_data['api']
118
+ end
119
+
120
+ ipush_data @mobile_mock_folder, data, file_name
121
+ rescue
122
+ begin
123
+ if File.file? what.to_s
124
+ data = IO.read(what.to_s)
125
+ json_data = JSON.parse(data)
126
+ fail 'api is missing' if json_data['api'].nil?
127
+ if fn
128
+ file_name = fn
129
+ else
130
+ file_name = json_data['api']
131
+ end
132
+
133
+ ipush_data @mobile_mock_folder, data, file_name
134
+ else
135
+ fail 'content is illegal'
136
+ end
137
+ rescue
138
+ raise Exception, "error:#{$!} at:#{$@}"
139
+ end
140
+
141
+ end
142
+ elsif what.is_a? Hash
143
+ fail 'api is missing' if what['api'].nil?
144
+ data = what.to_json.to_s
145
+ if fn
146
+ file_name = fn
147
+ else
148
+ file_name = what['api']
149
+ end
150
+
151
+ ipush_data @mobile_mock_folder, data, file_name
152
+ end
153
+ end
154
+
155
+ # === 功能:
156
+ # iPhone 删除mock文件,停止mock数据关键字,只需调用一次,建议在teardown中调用
157
+ # === 参数解释:
158
+ #
159
+ # === Example:
160
+ # Example #1:
161
+ #
162
+ #
163
+ def istop_mock
164
+ @mobile_mock_folder = '/tmp/mtopmock'
165
+ iremove_file @mobile_mock_folder
166
+ end
167
+
168
+ end