super-test 1.0.9

Sign up to get free protection for your applications and to get access to all the features.
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,190 @@
1
+ #!/bin/bash
2
+ # space自动化的综合性帮助工具
3
+ #
4
+ # Author::liqiang01
5
+ # Date::2009-8-12
6
+
7
+
8
+ gen_space_case(){
9
+ #casename=`ruby -e "
10
+ #str=\"${1%_*}\"
11
+ #str.gsub!(/_/,\" \")
12
+ #str.gsub!(/\b\w/){$&.upcase}
13
+ #str.gsub!(/\s/,\"\")
14
+ #print str
15
+ #"`
16
+
17
+ filename=${1%.rb}".rb"
18
+ casename=${1%_*}
19
+ casename=`ruby -e "'$casename'.split('_').each{|s| print s.capitalize}"`
20
+ casename=${casename%.rb}
21
+
22
+ echo "#!/usr/bin/env ruby
23
+ # coding: utf-8
24
+ #
25
+ # Author::
26
+ # Date:: `date`
27
+
28
+ \$CASE_ROOT = \"#{File.dirname(__FILE__)}\"
29
+ require \"${gname2}_test\"
30
+
31
+
32
+ # ===== 全局配置参数
33
+ #TODO
34
+
35
+
36
+ # ===== case描述
37
+ #TODO
38
+ class $casename < ${gname1}Test # :nodoc:
39
+
40
+ # 测试点
41
+ #TODO
42
+ def test_${1%_*}
43
+ #TODO
44
+ end
45
+
46
+ end
47
+
48
+ " > $filename
49
+ vim $filename
50
+ }
51
+
52
+
53
+ gen_space_keyword(){
54
+ echo "#!/usr/bin/env ruby
55
+ # coding: utf-8
56
+ #
57
+ # Author::
58
+ # Date:: `date`
59
+
60
+
61
+ module ...ActionHelper
62
+
63
+ # === 功能:
64
+ # .
65
+ #
66
+ # === 参数解释:
67
+ # - .
68
+ # - .
69
+ # - .
70
+ #
71
+ # === Example:
72
+ # ...
73
+ #
74
+ # === 备注:
75
+ #
76
+ def ...(...)
77
+ ...
78
+ end
79
+ end
80
+
81
+ if __FILE__ == \$0
82
+ end
83
+
84
+ " > $1
85
+ vim $1
86
+ }
87
+
88
+
89
+ default(){
90
+ echo "KK
91
+
92
+ NAME
93
+ kk - 取名kk是因为输入起来很简单 : )
94
+
95
+ SYNOPSIS
96
+ kk [OPTION]... [FILE]...
97
+
98
+ DESCRIPTION
99
+ -c, --case
100
+ 后面跟着文件名将生成自动化case模板
101
+ case名称规范: {case含义备注字段}_{文本case的atp上的id}.rb (如: my_demo_125698.rb)
102
+ -h, --help
103
+ 帮助文档
104
+ -i, --interactive
105
+ 进入交互模式,在交互模式中你可以直接使用super-test的所有关键字
106
+ -k, --keyword
107
+ 后面跟着文件名将生成关键字定义模板
108
+
109
+
110
+ 其他信息:
111
+ 关键字获取网页:
112
+ http://db-testing-space007.db01.baidu.com:6666/super-test/rdoc/
113
+
114
+
115
+ case配置文件的读取:
116
+ 增加执行case前去require 同级目录下的 init_dir.rb
117
+ 对于case本身的配置建议放到case文件中
118
+
119
+
120
+ 部署相关:
121
+ 1. 为了定位ruby路径,需要:
122
+ RUBYLIB=/home/space/cvs/app-test/search/space/super-test/lib:/home/space/cvs/app-test/search/space/space-test/lib
123
+ export RUBYLIB
124
+ 2. ruby发布到每个机器上
125
+ super_test和space_test发布到每个机器上
126
+
127
+ AUTHOR
128
+ kk
129
+
130
+ SEE ALSO
131
+ http://com.baidu.com/twiki/bin/view/Test/NSTest_space_super_test
132
+
133
+ kk (spaceutils) 1.0.1
134
+
135
+
136
+ " | less
137
+ }
138
+
139
+
140
+ if echo $HOME | grep -q -E "space|ufriend";then
141
+ gname1="Space"
142
+ gname2="space"
143
+ else
144
+ gname1="Wise"
145
+ gname2="wise"
146
+ fi
147
+
148
+ super_irb="
149
+ require \"irb\"
150
+ require \"${gname2}_test\"
151
+
152
+ if File.exist?(\"init_dir.rb\")
153
+ require \"init_dir.rb\"
154
+ end
155
+ if __FILE__ == \$0
156
+ IRB.start(__FILE__)
157
+ else
158
+ # check -e option
159
+ if /^-e$/ =~ \$0
160
+ IRB.start(__FILE__)
161
+ else
162
+ IRB.setup(__FILE__)
163
+ end
164
+ end
165
+ "
166
+
167
+ if [ ${#@} -eq 0 ];then
168
+ default
169
+ fi
170
+ while getopts "chik" optname
171
+ do
172
+ case $optname in
173
+ "c")
174
+ eval _f='$'$OPTIND
175
+ gen_space_case $_f
176
+ exit 0;;
177
+ "h")
178
+ default
179
+ exit 0;;
180
+ "i")
181
+ ruby -e "$super_irb"
182
+ exit 0;;
183
+ "k")
184
+ eval _f='$'$OPTIND
185
+ gen_space_keyword $_f
186
+ exit 0;;
187
+ esac
188
+ done
189
+
190
+
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env ruby
2
+ # coding: utf-8
3
+ #
4
+ # Author:: liqiang01
5
+ # Date:: 2009-8-31 20:50:10
6
+
7
+ =begin
8
+
9
+ 使用atp调用supertest case的adapter
10
+ atp发起执行字段为:
11
+ rubyatp #{@this.id}
12
+
13
+ =end
14
+
15
+ def run_case line
16
+ casenames = Dir.glob("#{line}/**/*_#{ARGV[0]}.rb")
17
+ puts "Got case"
18
+ if ( casenames.length == 0 )
19
+ puts "Case Not found"
20
+ else
21
+ puts casenames
22
+ puts "Run case"
23
+ casenames.each{|casei|
24
+ puts "Runing: #{casei}"
25
+ system( "source ~/.bash_profile; ruby #{casei}" )
26
+ }
27
+ end
28
+ end
29
+
30
+ # get case path from env param RUBYLIB
31
+ dir = `source ~/.bash_profile; echo $RUBYLIB`.chop!
32
+ libs = dir.split(":")
33
+ libs.each{ |line|
34
+ if(! (line =~ /super-test/) )
35
+ line.gsub!(/lib/, "case")
36
+ run_case "#{line}/module"
37
+ run_case "#{line}/system"
38
+ end
39
+ }
40
+
41
+
42
+
@@ -0,0 +1,34 @@
1
+ #!/bin/bash
2
+ current_dir=`pwd`
3
+ current_home=$HOME
4
+ echo "Now donwload to $current_dir/tmp"
5
+ wget ftp://db-testing-space03.db01.baidu.com:/tmp/super-test/ -nH -r >/dev/null 2>&1
6
+ echo "Now cp to $current_home/autotest"
7
+ if [ -d $current_home/autotest ];then
8
+ echo "$current_home/autotest already exist"
9
+ echo "Are U sure to continue?[Y/N]"
10
+ read ans
11
+ if [ "$ans" = "Y" ];then
12
+ if [ -d $current_home/autotest/super-test ];then
13
+ echo "$current_home/autotest/super-test already exist"
14
+ echo "Now we exit. Bye"
15
+ exit
16
+ fi
17
+ mv $current_dir/tmp/super-test $current_home/autotest/
18
+ fi
19
+ if [ "$ans" = "N" ];then
20
+ echo "Bye"
21
+ exit
22
+ fi
23
+ else
24
+ echo "Now mkdir $current_home/autotest"
25
+ mkdir $current_home/autotest
26
+ mv $current_dir/tmp/super-test $current_home/autotest/
27
+ fi
28
+ rm -r $current_dir/tmp
29
+ echo "Now changing your .bash_profile"
30
+ grep -v -P "RUBYLIB" ~/.bash_profile > ~/.bashtmp
31
+ cp ~/.bashtmp ~/.bash_profile; rm ~/.bashtmp;
32
+ echo 'export RUBYLIB="$HOME/autotest/super-test/lib"' >> ~/.bash_profile
33
+ source ~/.bash_profile
34
+ echo "Now finish, have fun:)"
Binary file
@@ -0,0 +1,12 @@
1
+ struct nshead_t
2
+ {
3
+ unsigned short id;
4
+ unsigned short version;
5
+ unsigned int log_id;
6
+ char provider[16];
7
+ unsigned int magic_num;
8
+ unsigned int reserved;
9
+ unsigned int body_len;
10
+ };
11
+
12
+ nshead_t nshead;
@@ -0,0 +1,10 @@
1
+ #stub名称
2
+ stubs : s1, s2, s3
3
+ #stub端口
4
+ ports : 22222, 33333, 44444
5
+ #stub工作模式
6
+ actions : 0, 1, 2
7
+ #stub应该返回的nshead文件名
8
+ heads : /home/space/tools/app-test/search/space/module-test/case/test/stub_test/stub/1_s1.head, /home/space/tools/app-test/search/space/module-test/case/test/stub_test/stub/1_s2.head, /home/space/tools/app-test/search/space/module-test/case/test/stub_test/stub/1_s3.head
9
+ #stub应该返回的文件名
10
+ files : /home/space/tools/app-test/search/space/module-test/case/test/stub_test/stub/1_s1.stub, /home/space/tools/app-test/search/space/module-test/case/test/stub_test/stub/1_s2.stub, /home/space/tools/app-test/search/space/module-test/case/test/stub_test/stub/1_s3.stub
@@ -0,0 +1,376 @@
1
+ load bft.so
2
+ load cnnt.so
3
+ load mc_pack.so
4
+
5
+ #=============vars=============
6
+ set conf_path "server.conf"
7
+ set debug "1"
8
+ set wait_time 3000
9
+
10
+ #配置项的内存镜像数组
11
+ set stubs {}
12
+ set ports {}
13
+ set actions {}
14
+ set heads {}
15
+ set files {}
16
+
17
+ #当前处理的head hash
18
+ set head_arr(0) 0
19
+
20
+
21
+ #========helper methods========
22
+
23
+ proc log {info} {
24
+ global debug
25
+ if {$debug == 1} {
26
+ puts $info
27
+ }
28
+ }
29
+
30
+ # 判断传入参数是否是注视
31
+ proc is_cmt { line } {
32
+ if { [string compare [string index $line 0] "#"] == 0 } {
33
+ return 1
34
+ }
35
+
36
+ return 0
37
+ }
38
+
39
+
40
+ # 在如配置文件,初始化4个全局数组
41
+ proc load_conf {} {
42
+ global conf_path
43
+ global stubs
44
+ global ports
45
+ global actions
46
+ global heads
47
+ global files
48
+
49
+ log "\nloading conf..."
50
+ set conf [open $conf_path "r"]
51
+ while { [gets $conf line] != -1 } {
52
+ if { [is_cmt $line] == 0 } {
53
+ #log $line
54
+
55
+ set item [split $line :]
56
+ set key [string trim [lindex $item 0]]
57
+ set value [string trim [lindex $item 1]]
58
+
59
+ switch $key {
60
+ "stubs" { set stubs [split $value ","]
61
+
62
+ log "loading stubs..."
63
+ set i 0
64
+ foreach item $stubs {
65
+ lset stubs $i [string trim $item]
66
+ log [lindex $stubs $i]
67
+ incr i
68
+ }
69
+ }
70
+ "ports" { set ports [split $value ","]
71
+
72
+ log "loading ports..."
73
+ set i 0
74
+ foreach item $ports {
75
+ lset ports $i [string trim $item]
76
+ log [lindex $ports $i]
77
+ incr i
78
+ }
79
+
80
+ }
81
+ "actions" { set actions [split $value ","]
82
+
83
+ log "loading actions..."
84
+ set i 0
85
+ foreach item $actions {
86
+ lset actions $i [string trim $item]
87
+ log [lindex $actions $i]
88
+ incr i
89
+ }
90
+
91
+ }
92
+ "heads" { set heads [split $value ","]
93
+
94
+ log "loading heads..."
95
+ set i 0
96
+ foreach item $heads {
97
+ lset heads $i [string trim $item]
98
+ log [lindex $heads $i]
99
+ incr i
100
+ }
101
+ }
102
+ "files" { set files [split $value ","]
103
+
104
+ log "loading files..."
105
+ set i 0
106
+ foreach item $files {
107
+ lset files $i [string trim $item]
108
+ log [lindex $files $i]
109
+ incr i
110
+ }
111
+
112
+ }
113
+ }
114
+ }
115
+ }
116
+ }
117
+
118
+ # 加载当前nshead
119
+ # 成功加载:head变量被赋予head文件中的值; 加载失败: head变量的hash表被清空
120
+ proc load_head { head_path } {
121
+ global head_arr
122
+
123
+ #clear head array
124
+ array unset head_arr
125
+ set head_arr(0) 0
126
+
127
+ if { [file exists $head_path] == 0 } {
128
+ log "response mcpack file not exist and load head failed"
129
+ } else {
130
+ set hf [open $head_path "r"]
131
+ while { [gets $hf line] != -1 } {
132
+ if { [is_cmt $line] == 0 } {
133
+ set item [split $line :]
134
+ set key [string trim [lindex $item 0]]
135
+ set value [string trim [lindex $item 1]]
136
+
137
+ switch $key {
138
+ "id"
139
+ {
140
+ set head_arr("id") $value
141
+ log "loading id = $value"
142
+ log "loading id = $head_arr(\"id\")"
143
+ }
144
+ "version"
145
+ {
146
+ set head_arr("version") $value
147
+ log "loading version = $value"
148
+ log "loading version = $head_arr(\"version\")"
149
+ }
150
+ "log_id"
151
+ {
152
+ set head_arr("log_id") $value
153
+ log "loading log_id = $value"
154
+ log "loading log_id = $head_arr(\"log_id\")"
155
+ }
156
+ "provider"
157
+ {
158
+ set head_arr("provider") $value
159
+ log "loading provider = $value"
160
+ log "loading provider = $head_arr(\"provider\")"
161
+ }
162
+ "magic_num"
163
+ {
164
+ set head_arr("magic_num") $value
165
+ log "loading magic_num = $value"
166
+ log "loading magic_num = $head_arr(\"magic_num\")"
167
+ }
168
+ "reserved"
169
+ {
170
+ set head_arr("reserved") $value
171
+ log "loading reserved = $value"
172
+ log "loading reserved = $head_arr(\"reserved\")"
173
+ }
174
+ }
175
+ }
176
+ }
177
+ }
178
+
179
+ }
180
+
181
+ #启动所有桩
182
+ proc start_srvs {} {
183
+ global stubs
184
+
185
+ set idx 0
186
+ foreach stub $stubs {
187
+ start_svr $idx
188
+
189
+ incr idx
190
+ }
191
+ }
192
+
193
+ #启动一个桩
194
+ proc start_svr {idx} {
195
+ global stubs
196
+ global ports
197
+ global actions
198
+ global heads
199
+ global files
200
+
201
+ set stub [lindex $stubs $idx]
202
+ set port [lindex $ports $idx]
203
+ set action [lindex $actions $idx]
204
+ set head [lindex $heads $idx]
205
+ set file [lindex $files $idx]
206
+
207
+ log "\nstarting stub..."
208
+ log "stub=$stub, port=$port, action=$action, file=$file"
209
+
210
+ cnnt new $stub
211
+ cnnt config $stub "server;ip-local:0.0.0.0;port-local:$port;type-data:raw;"
212
+ cnnt onrecv $stub svrOnRecv -id -name
213
+ cnnt start $stub
214
+ log [cnnt list]
215
+ }
216
+
217
+ # 根据桩的名称获取其索引
218
+ # return:存在,返回索引值>=0 ; 不存在,返回-1
219
+ proc get_idx_by_name { stub_name } {
220
+ global stubs
221
+
222
+ set idx 0
223
+ foreach stub $stubs {
224
+ if { [string compare $stub_name $stub] == 0 } {
225
+ return $idx
226
+ }
227
+ incr idx
228
+ }
229
+
230
+ return -1
231
+ }
232
+
233
+ # 桩回调函数
234
+ proc svrOnRecv { data id name } {
235
+ global stubs
236
+ global actions
237
+
238
+ #重新加载配置!
239
+ load_conf
240
+
241
+ log "serve for $name..."
242
+ set idx [get_idx_by_name $name]
243
+ if { $idx < 0 } {
244
+ log "get index by name: $name failed"
245
+ exit
246
+ }
247
+
248
+ set action [lindex $actions $idx]
249
+
250
+ switch $action {
251
+ "0" { action0 $data, $id, $name $idx}
252
+ "1" { action1 $id, $name }
253
+ "2" { action2 $id, $name }
254
+ }
255
+
256
+ }
257
+
258
+ # 正常回调
259
+ proc action0 { data id name idx} {
260
+ global stubs
261
+ global ports
262
+ global actions
263
+ global heads
264
+ global files
265
+
266
+ global head_arr
267
+
268
+ log "\n============action0(name=$name)==============\n"
269
+
270
+ set res_head 0
271
+ set res_body 0
272
+ set res_buf 0
273
+
274
+ #create res_body and get body_len
275
+ #if file not exist, just return nshead
276
+ set mcpack 0
277
+ set has_body 0
278
+
279
+ if { [file exists [lindex $files $idx]] == 0 } {
280
+ set has_body 0
281
+ log "response mcpack file not exist and just return nshead"
282
+ } else {
283
+ set has_body 1
284
+ }
285
+
286
+ if { $has_body == 1 } {
287
+ set f [open [lindex $files $idx] "r"]
288
+ gets $f line
289
+ mc_pack text2pack $mcpack $line
290
+ set body_len [mc_pack size $mcpack]
291
+ mc_pack close $mcpack
292
+ close $f
293
+ set res_body [mc_pack export $mcpack]
294
+ log "body_len = $body_len"
295
+ }
296
+
297
+ #create res_head
298
+ set head [bft gen "nshead.bft"]
299
+ if { [file exists [lindex $heads $idx]] == 0 } {
300
+ bft set $head nshead.magic_num 4218459028
301
+ log "response nshead file not exist and just return default nshead"
302
+ } else {
303
+ log "response nshead exist"
304
+
305
+ load_head [lindex $heads $idx]
306
+ bft set $head nshead.id $head_arr("id")
307
+ bft set $head nshead.version $head_arr("version")
308
+ bft set $head nshead.log_id $head_arr("log_id")
309
+ bft set $head nshead.provider $head_arr("provider")
310
+ bft set $head nshead.magic_num $head_arr("magic_num")
311
+ bft set $head nshead.reserved $head_arr("reserved")
312
+ }
313
+
314
+ if { $has_body == 1 } {
315
+ bft set $head nshead.body_len $body_len
316
+ }
317
+ set res_head [bft export $head]
318
+
319
+ #create res_buf
320
+ if { $has_body == 1 } {
321
+ set res_buf $res_head$res_body
322
+ } else {
323
+ set res_buf $res_head
324
+ }
325
+
326
+ #send
327
+ log " ===>> server sending..."
328
+ cnnt send $name $res_buf -id $id
329
+
330
+ }
331
+
332
+ # 1 -- close connection after recv data, not to send data to client.
333
+ proc action1 { id name } {
334
+ log "\n============action1(name=$name)==============\n"
335
+ cnnt delete $name -id $id
336
+ }
337
+
338
+ # 2 -- connection timeout. just to wait a long while(3s).
339
+ proc action2 { id name } {
340
+ global wait_time
341
+
342
+ log "\n============action2(name=$name, wait=$wait_time)==============\n"
343
+ asyn_wait $wait_time
344
+ cnnt delete $name -id $id
345
+ }
346
+
347
+ proc asyn_wait { time } {
348
+ after $time [list set done ""]
349
+ vwait done
350
+ }
351
+
352
+ # 初始化检查
353
+ proc init {} {
354
+ log "\niniting..."
355
+ global conf_path
356
+
357
+ #conf
358
+ if { [file exists $conf_path] == 0 } {
359
+ log "conf file $conf_path not exists!"
360
+ exit
361
+ }
362
+
363
+ #nshead.bft
364
+ if { [file exists "nshead.bft"] == 0 } {
365
+ log "nshead template nshead.bft not exists!"
366
+ exit
367
+ }
368
+ }
369
+
370
+ #==============main============
371
+
372
+ init
373
+ load_conf
374
+ start_srvs
375
+
376
+ vwait forever