Module: MCBasePatternHelper

Includes:
Check, Env, Network, Stub
Defined in:
lib/patterns/mc_base_pattern.rb

Overview

mc base pattern

Author

liqiang01

Data

2009-8-28

Instance Method Summary collapse

Methods included from Stub

#set_stub_action, #set_stub_file, #set_stub_head, #start_stub, #stop_stub

Methods included from Env

#bak_conf, #copy_conf, #get_conf, #get_thread_num, #is_process_running?, #kill_process, #modify_conf, #modify_conf_single, #recover_conf, #start_process

Methods included from Check

#_assert_log_match, #_assert_log_match_times, #_assert_no_log, #_assert_no_wflog, #_assert_wflog_match, #_assert_wflog_match_times, #assert_content, #assert_file_exist?, #assert_file_include_by_str, #assert_file_match, #assert_file_match_times, #assert_file_md5, #assert_file_not_same, #assert_file_same, #assert_file_same_by_str, #assert_head_value, #assert_include, #assert_log_match, #assert_log_match_times, #assert_no_log, #assert_process_not_running, #assert_process_running, #assert_process_threads

Methods included from DATA

#_init_file_, #file_exist?, #file_match?, #file_match_times, #file_size?, #get_all_pack, #get_mcpack_value, #include_file_str, #same_content_value, #same_file_contents, #same_file_md5, #same_file_str

Methods included from Log

#_monitor_log, #_monitor_wflog, #get_match_lines, #get_match_times, #get_match_value, #get_match_values, #has_new_log?, #monitor_log

Methods included from Network

#g_send, #nshead_send, #nshead_trans_send, #send_mcpack, #shead_send

Instance Method Details

#cm_transfer_pattern(ip = HOST, port = PORT) ⇒ Object

能保证发送的数据按照前缀的顺序发送



379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
# File 'lib/patterns/mc_base_pattern.rb', line 379

def cm_transfer_pattern(ip=HOST, port=PORT)
        # 清理cm transfer原来的数据
        ssh_cmd "rm -fr /home/space/phpcm/data/*; killall -9 phpcm;"
        ssh_cmd "rm -fr /home/space/phptrans/data/transid/*; killall -9 transfer;"
        sleep 2
        cmd_str = "cd #{MCSERVER_PATH}; rm log/foo.log; nohup ./mcserver_trans &"
        system "#{cmd_str}"
        datas = getpacks
        datas.each{ |packno|
                mc_send ip, port, nil, packno
                mc_assert_pack_include "#{packno}", "@#{packno}: expect pack is not equal to recv pack!"
        }
        sleep 1
  datas = getpacks ".trans"
        i=0
        open("#{MCSERVER_PATH}/log/foo.log", "r").each{ |line|
                if line=~/--------/ then next end
                puts "trans_rev=================>"
                puts line
                puts "==========================>"
                case_path = "#{$CASE_ROOT}/"
                file = open(case_path+"/data/#{datas[i]}.trans", "r")
                i=i+1
                line2 = file.gets
                file.close
                assert_include line2, line, "Transfer data not match"
        }
        system "killall -9 mcserver_trans"
end

#cm_transfer_pattern2(ip = HOST, port = PORT) ⇒ Object

能保证发送的数据按照前缀的顺序发送



430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
# File 'lib/patterns/mc_base_pattern.rb', line 430

def cm_transfer_pattern2(ip=HOST, port=PORT)
        # 清理cm transfer原来的数据
        cmd_str = "cd #{MCSERVER_PATH}; rm log/foo.log; nohup ./mcserver_trans &"
        system "#{cmd_str}"
        datas = getpacks
        datas.each{ |packno|
                mc_trans_send ip, port, nil, packno
                mc_assert_pack_include "#{packno}", "@#{packno}: expect pack is not equal to recv pack!"
        }
        sleep 1
 	datas = getpacks ".trans"
        i=0
        open("#{MCSERVER_PATH}/log/foo.log", "r").each{ |line|
                if line=~/--------/ then next end
                puts "trans_rev=================>"
                puts line
                puts "==========================>"
                case_path = "#{$CASE_ROOT}/"
                file = open(case_path+"/data/#{datas[i]}.trans", "r")
                i=i+1
                line2 = file.gets
                file.close
                assert_include line2, line, "Transfer data not match"
        }
        system "killall -9 mcserver_trans"
end

#cm_transfer_pattern_stopObject

功能

cm transfer模式的停止主要是停止mcserver的工作

参数

Example

def teardown

cm_transfer_pattern_stop

end



470
471
472
# File 'lib/patterns/mc_base_pattern.rb', line 470

def cm_transfer_pattern_stop
        system "killall -9 mcserver_trans"
end

#get_packs(pattern) ⇒ Object

功能

get the packs query by pattern

example

packs = get_packs



243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'lib/patterns/mc_base_pattern.rb', line 243

def get_packs pattern
	#data_path = "#{CASE_ROOT}#{$globals[:MODULE_NAME]}/#{$globals[:CASE_NAME]}/data/"
	data_path = "#{$CASE_ROOT}/data/"
	
	packs = []
	files = Dir.glob(File.join(data_path, pattern))
	files.each{|file|
		arr = file.split /\//
		entry = arr[arr.size-1]
		pack = entry[0, entry.size-5]
		packs << pack
	}
	
	return packs
end

#get_postfixes(module_name, case_name, packno) ⇒ Object

功能

get all the postfix of a specified packno

Example

data/1.expc, 1.expc.1, 1.expc.2
return array ["", ".1", ".2"]


266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
# File 'lib/patterns/mc_base_pattern.rb', line 266

def get_postfixes(module_name, case_name, packno)
	#data_path = "#{CASE_ROOT}#{module_name}/#{case_name}/data/"
	data_path = "#{$CASE_ROOT}/data/"
	$log.debug "get postfixes from #{data_path} where packno = #{packno}"
	
	#param check
	if !File.directory?(data_path) || !File.exist?(data_path) then
		$log.debug "bad data path=" + data_path
		return nil
	end
	
	postfixes = Array.new
	Dir.foreach(data_path) do |entry| 
		if entry.match("#{packno}.expc.*") then
			matches = entry.scan(/.*expc(.*)/)
			postfixes << matches[0][0]
		end
	end
	if postfixes.size == 0 then 
		return nil
		$log.warn "packno=#{packno} should have at least one expct data"
	end
	
	$log.debug "postfixes = #{postfixes} and size = #{postfixes.size}"
	return postfixes
end

#getpacks(suffix = ".send") ⇒ Object

功能

return all the pack numbers in the specified module and case

example

ar = getpacks



208
209
210
211
212
213
214
215
216
217
218
219
# File 'lib/patterns/mc_base_pattern.rb', line 208

def getpacks(suffix=".send")
	#data_path = "#{CASE_ROOT}#{$globals[:MODULE_NAME]}/#{$globals[:CASE_NAME]}/data/"
	# 保证返回的datai是数字类型的且已经排序
	data_path = "#{$CASE_ROOT}/data/"
	datai = []
	datas = get_all_pack data_path, suffix
	datas.each{ |item|
		datai.push(item.to_i)
	}
	$log.debug "Get packnos from " + data_path
	return datai.sort
end

#getpacks_all(suffix = ".send") ⇒ Object

功能

return all the pack in the specified module and case

example

ar = getpacks_all



225
226
227
228
229
230
231
232
233
234
235
236
237
# File 'lib/patterns/mc_base_pattern.rb', line 225

def getpacks_all(suffix=".send")
	#data_path = "#{CASE_ROOT}#{$globals[:MODULE_NAME]}/#{$globals[:CASE_NAME]}/data/"
	# 保证返回data目录下的所有待发送的数据文件 *.send
	data_path = "#{$CASE_ROOT}/data/"
	datai = []
	datas = get_all_pack data_path, suffix
	datas.each{ |item|
		datai.push(item)
	}
	$log.debug "Get packnos from " + data_path
	# 按照字母表进行排序
	return datai.sort
end

#mc_assert_head_value(key, expect_value, msg = "") ⇒ Object

功能

校验响应头中指定key的期望值是否正确

参数

  • key

  • expect_value

  • msg=“”

exmaple

mc_assert_head_value “name”, “new”



197
198
199
# File 'lib/patterns/mc_base_pattern.rb', line 197

def mc_assert_head_value key, expect_value, msg=""
	assert_head_value $globals[:RES_HEAD], key, expect_value, msg
end

#mc_assert_pack(prefix, msg = "") ⇒ Object

功能

校验两组prefix相同的.expc, .recv文件是否内容一致

参数

  • prefix

  • msg=“”

example

mc_assert_pack 1



152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/patterns/mc_base_pattern.rb', line 152

def mc_assert_pack prefix, msg=""
	module_name = $globals[:MODULE_NAME]
	case_name = $globals[:CASE_NAME]
	#case_path = "#{CASE_ROOT}#{module_name}/#{case_name}/"
	case_path = "#{$CASE_ROOT}/"
	
	postfixes = get_postfixes(module_name, case_name, prefix)
	if postfixes == nil
		flunk "get postfix from data dir fail, check the data dir and the .expc files"
	end
	postfixes.each{|postfix|
	  assert_file_same_by_str(case_path+"data/" + prefix + ".expc" + postfix, case_path+"tmp/" + prefix + ".recv" + postfix, msg)
	}
end

#mc_assert_pack_include(prefix, msg = "") ⇒ Object

功能

校验两组prefix相同的.expc, .recv文件是否内容包含

参数

  • prefix

  • msg=“”

example

mc_assert_pack_include 1



174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/patterns/mc_base_pattern.rb', line 174

def mc_assert_pack_include prefix, msg=""
	module_name = $globals[:MODULE_NAME]
	case_name = $globals[:CASE_NAME]
	#case_path = "#{CASE_ROOT}#{module_name}/#{case_name}/"
	case_path = "#{$CASE_ROOT}/"
	
	postfixes = get_postfixes(module_name, case_name, prefix)
	if postfixes == nil
		flunk "get postfix from data dir fail, check the data dir and the .expc files"
	end
	postfixes.each{|postfix|
	  assert_file_include_by_str(case_path+"data/" + prefix + ".expc" + postfix, case_path+"tmp/" + prefix + ".recv" + postfix, msg)
	}
end

#mc_base_all_patternObject

功能

mc_base模式的变种,将发送data目录下的所有数据文件

参数

Example

mc_base_all_pattern.each{ |packno| monitor_log IP, LOG_PATH, LOG mc_send IP, PORT, nil, packno 对于给通用tranfer模块发送,请使用: mc_trans_send IP, PORT, nil, packno mc_assert_pack “#packno”, “@#packno: expect pack is not equal to recv pack!” assert_log_match_times IP, LOG_PATH, LOG, [“NOTICE”], “users_getInfo”, 1 }

备注:能保证发送的数据按照前缀的顺序发送



344
345
346
347
348
349
350
351
352
353
354
355
356
# File 'lib/patterns/mc_base_pattern.rb', line 344

def mc_base_all_pattern()
	puts "+++++++++about to execute case #{Context.get 'CASE_NAME'}+++++++++"
       $log.info "+++++++++about to execute case #{Context.get 'CASE_NAME'}+++++++++"
	datas = getpacks_all

       if datas != nil && datas.length > 0 then
		return datas
       else
		return nil
	end
       puts "+++++++++end executing case #{Context.get 'CASE_NAME'}+++++++++"
       $log.info "+++++++++end executing case #{Context.get 'CASE_NAME'}+++++++++"
end

#mc_base_patternObject

功能

mc_base模式

参数

Example

mc_base_pattern.each{ |packno| monitor_log IP, LOG_PATH, LOG mc_send IP, PORT, nil, packno 对于给通用tranfer模块发送,请使用: mc_trans_send IP, PORT, nil, packno mc_assert_pack “#packno”, “@#packno: expect pack is not equal to recv pack!” assert_log_match_times IP, LOG_PATH, LOG, [“NOTICE”], “users_getInfo”, 1 }

备注:能保证发送的数据按照前缀的顺序发送



311
312
313
314
315
316
317
318
319
320
321
322
323
# File 'lib/patterns/mc_base_pattern.rb', line 311

def mc_base_pattern()
	puts "+++++++++about to execute case #{Context.get 'CASE_NAME'}+++++++++"
       $log.info "+++++++++about to execute case #{Context.get 'CASE_NAME'}+++++++++"
	datas = getpacks

       if datas != nil && datas.length > 0 then
		return datas
       else
		return nil
	end
       puts "+++++++++end executing case #{Context.get 'CASE_NAME'}+++++++++"
       $log.info "+++++++++end executing case #{Context.get 'CASE_NAME'}+++++++++"
end

#mc_send(ip, port, nshead_hash, packno, postfix = nil, delay = 0) ⇒ Object

功能

send_mcpack

参数

  • ip target ip

  • port target port

  • nshead_hash nshead hash, nil to use default value

  • module_name the testing module name

  • packno sending mcpack file number

  • postfix=nil the postfix of the data

  • delay=0 sending interval(s)

example

mc_send “127.0.0.1”, nil, 1



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/patterns/mc_base_pattern.rb', line 30

def mc_send ip, port, nshead_hash, packno, postfix=nil, delay=0
        $log.debug "sending mcpack #{packno}..."
        puts "\n##########sending mcpack #{packno}...##########"
      
        #case_path = "#{CASE_ROOT}#{$globals[:MODULE_NAME]}/#{$globals[:CASE_NAME]}/"
	    case_path = "#{$CASE_ROOT}/"
	    recv_path = ""
	    if postfix == nil
		    recv_path = "#{case_path}tmp/#{packno}.recv"
	    else
		    recv_path = "#{case_path}tmp/#{packno}_#{postfix}.recv"
	    end
        nshead_send(ip, port, nshead_hash, "#{case_path}data/#{packno}.send", recv_path, delay)
        
        #set :SEND,:RECV to $globals
        Context.set :SEND, "#{case_path}data/#{packno}.send"
        Context.set :RECV, "#{case_path}tmp/#{packno}.recv"

        $log.debug "send end..."

	    #copy res_nshead.data to module case's tmp dir
	    if File.exist? "#{MCSEND_PATH}res_nshead.data"
		    `cp #{MCSEND_PATH}res_nshead.data #{case_path}tmp/`
	    end

	    #set :RES_HEAD to $globalsdd
	    Context.set :RES_HEAD, "#{case_path}tmp/res_nshead.data"
end

#mc_stub_send(ip, port, nshead_hash, prefix, postfix = nil, delay = 0) ⇒ Object

  • prefix: …/$casedir/data/$prefix.send

  • postfix: tells which stub return what data, …/$casedir/stub/$prefix_$stubname_$postfix.stub; nil by default means the response data is $prefix_$stubname.stub

  • delay: sending interval

example

mc_stub_send ip, 3308, nil, 1



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/patterns/mc_base_pattern.rb', line 111

def mc_stub_send ip, port, nshead_hash, prefix, postfix=nil, delay=0
	$log.debug "sending mcpack #{prefix}, with stub data #{postfix}..."
	puts "sending mcpack #{prefix}, with stub data #{postfix}..."

	#case_path = "#{CASE_ROOT}#{$globals[:MODULE_NAME]}/#{$globals[:CASE_NAME]}/"
	case_path = "#{$CASE_ROOT}/"

	# modify stub's server.conf
	stubs = Context.get :STUBS
	heads = {}
	files = {}
	stubs.each{|stub|
		if postfix != nil
			heads[stub] = "#{case_path}stub/#{prefix}_#{stub}_#{postfix}.head"
			files[stub] = "#{case_path}stub/#{prefix}_#{stub}_#{postfix}.stub"
		else
			heads[stub] = "#{case_path}stub/#{prefix}_#{stub}.head"
			files[stub] = "#{case_path}stub/#{prefix}_#{stub}.stub"
		end
	}
	set_stub_head heads
	set_stub_file files
	sleep 1


	#send
	mc_send ip, port, nshead_hash, prefix, postfix
end

#mc_trans_send(ip, port, nshead_hash, packno, postfix = nil, delay = 0) ⇒ Object

功能

send_mcpack 为通用transfer定制

参数

  • ip target ip

  • port target port

  • nshead_hash nshead hash, nil to use default value

  • module_name the testing module name

  • packno sending mcpack file number

  • postfix=nil the postfix of the data

  • delay=0 sending interval(s)

example

mc_trans_send “127.0.0.1”, nil, 1



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/patterns/mc_base_pattern.rb', line 71

def mc_trans_send ip, port, nshead_hash, packno, postfix=nil, delay=0
        $log.debug "sending mcpack #{packno}..."
        puts "\n##########sending mcpack #{packno}...##########"
      
        #case_path = "#{CASE_ROOT}#{$globals[:MODULE_NAME]}/#{$globals[:CASE_NAME]}/"
	    case_path = "#{$CASE_ROOT}/"
	    recv_path = ""
	    if postfix == nil
		    recv_path = "#{case_path}tmp/#{packno}.recv"
	    else
		    recv_path = "#{case_path}tmp/#{packno}_#{postfix}.recv"
	    end
        nshead_trans_send(ip, port, nshead_hash, "#{case_path}data/#{packno}.send", recv_path, delay)
        
        #set :SEND,:RECV to $globals
        Context.set :SEND, "#{case_path}data/#{packno}.send"
        Context.set :RECV, "#{case_path}tmp/#{packno}.recv"

        $log.debug "send end..."

	    #copy res_nshead.data to module case's tmp dir
	    if File.exist? "#{MCSEND_PATH}res_nshead.data"
		    `cp #{MCSEND_PATH}res_nshead.data #{case_path}tmp/`
	    end

	    #set :RES_HEAD to $globalsdd
	    Context.set :RES_HEAD, "#{case_path}tmp/res_nshead.data"
end