| 
									
										
										
										
											2019-10-24 16:41:25 +08:00
										 |  |  | set testmodule [file normalize tests/modules/hooks.so] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | tags "modules" { | 
					
						
							| 
									
										
										
										
											2019-11-19 20:53:39 +08:00
										 |  |  |     start_server [list overrides [list loadmodule "$testmodule" appendonly yes]] { | 
					
						
							| 
									
										
										
										
											2019-10-29 23:59:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-24 16:41:25 +08:00
										 |  |  |         test {Test clients connection / disconnection hooks} { | 
					
						
							|  |  |  |             for {set j 0} {$j < 2} {incr j} { | 
					
						
							|  |  |  |                 set rd1 [redis_deferring_client] | 
					
						
							|  |  |  |                 $rd1 close | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-10-29 23:59:09 +08:00
										 |  |  |             assert {[r hooks.event_count client-connected] > 1} | 
					
						
							|  |  |  |             assert {[r hooks.event_count client-disconnected] > 1} | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test {Test module cron hook} { | 
					
						
							|  |  |  |             after 100 | 
					
						
							|  |  |  |             assert {[r hooks.event_count cron-loop] > 0} | 
					
						
							|  |  |  |             set hz [r hooks.event_last cron-loop] | 
					
						
							|  |  |  |             assert_equal $hz 10 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test {Test module loaded / unloaded hooks} { | 
					
						
							|  |  |  |             set othermodule [file normalize tests/modules/infotest.so] | 
					
						
							|  |  |  |             r module load $othermodule | 
					
						
							|  |  |  |             r module unload infotest | 
					
						
							|  |  |  |             assert_equal [r hooks.event_last module-loaded] "infotest" | 
					
						
							|  |  |  |             assert_equal [r hooks.event_last module-unloaded] "infotest" | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test {Test module aofrw hook} { | 
					
						
							|  |  |  |             r debug populate 1000 foo 10000 ;# 10mb worth of data
 | 
					
						
							|  |  |  |             r config set rdbcompression no ;# rdb progress is only checked once in 2mb
 | 
					
						
							|  |  |  |             r BGREWRITEAOF | 
					
						
							|  |  |  |             waitForBgrewriteaof r | 
					
						
							|  |  |  |             assert_equal [string match {*module-event-persistence-aof-start*} [exec tail -20 < [srv 0 stdout]]] 1 | 
					
						
							|  |  |  |             assert_equal [string match {*module-event-persistence-end*} [exec tail -20 < [srv 0 stdout]]] 1 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test {Test module aof load and rdb/aof progress hooks} { | 
					
						
							|  |  |  |             # create some aof tail (progress is checked only once in 1000 commands)
 | 
					
						
							|  |  |  |             for {set j 0} {$j < 4000} {incr j} { | 
					
						
							|  |  |  |                 r set "bar$j" x | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             # set some configs that will cause many loading progress events during aof loading
 | 
					
						
							| 
									
										
										
										
											2019-11-19 20:53:39 +08:00
										 |  |  |             r config set key-load-delay 500 | 
					
						
							| 
									
										
										
										
											2019-10-29 23:59:09 +08:00
										 |  |  |             r config set dynamic-hz no | 
					
						
							|  |  |  |             r config set hz 500 | 
					
						
							|  |  |  |             r DEBUG LOADAOF | 
					
						
							|  |  |  |             assert_equal [r hooks.event_last loading-aof-start] 0 | 
					
						
							|  |  |  |             assert_equal [r hooks.event_last loading-end] 0 | 
					
						
							|  |  |  |             assert {[r hooks.event_count loading-rdb-start] == 0} | 
					
						
							| 
									
										
										
										
											2019-11-19 20:53:39 +08:00
										 |  |  |             assert_lessthan 2 [r hooks.event_count loading-progress-rdb] ;# comes from the preamble section
 | 
					
						
							|  |  |  |             assert_lessthan 2 [r hooks.event_count loading-progress-aof] | 
					
						
							|  |  |  |             if {$::verbose} { | 
					
						
							|  |  |  |                 puts "rdb progress events [r hooks.event_count loading-progress-rdb]" | 
					
						
							|  |  |  |                 puts "aof progress events [r hooks.event_count loading-progress-aof]" | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-10-29 23:59:09 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |         # undo configs before next test
 | 
					
						
							|  |  |  |         r config set dynamic-hz yes | 
					
						
							|  |  |  |         r config set key-load-delay 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test {Test module rdb save hook} { | 
					
						
							|  |  |  |             # debug reload does: save, flush, load:
 | 
					
						
							|  |  |  |             assert {[r hooks.event_count persistence-syncrdb-start] == 0} | 
					
						
							|  |  |  |             assert {[r hooks.event_count loading-rdb-start] == 0} | 
					
						
							|  |  |  |             r debug reload | 
					
						
							|  |  |  |             assert {[r hooks.event_count persistence-syncrdb-start] == 1} | 
					
						
							|  |  |  |             assert {[r hooks.event_count loading-rdb-start] == 1} | 
					
						
							| 
									
										
										
										
											2019-10-24 16:41:25 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-24 16:51:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         test {Test flushdb hooks} { | 
					
						
							|  |  |  |             r flushdb | 
					
						
							| 
									
										
										
										
											2019-10-29 23:59:09 +08:00
										 |  |  |             assert_equal [r hooks.event_last flush-start] 9 | 
					
						
							|  |  |  |             assert_equal [r hooks.event_last flush-end] 9 | 
					
						
							|  |  |  |             r flushall | 
					
						
							|  |  |  |             assert_equal [r hooks.event_last flush-start] -1 | 
					
						
							|  |  |  |             assert_equal [r hooks.event_last flush-end] -1 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # replication related tests
 | 
					
						
							|  |  |  |         set master [srv 0 client] | 
					
						
							|  |  |  |         set master_host [srv 0 host] | 
					
						
							|  |  |  |         set master_port [srv 0 port] | 
					
						
							|  |  |  |         start_server {} { | 
					
						
							|  |  |  |             r module load $testmodule | 
					
						
							|  |  |  |             set replica [srv 0 client] | 
					
						
							|  |  |  |             set replica_host [srv 0 host] | 
					
						
							|  |  |  |             set replica_port [srv 0 port] | 
					
						
							|  |  |  |             $replica replicaof $master_host $master_port | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             wait_for_condition 50 100 { | 
					
						
							|  |  |  |                 [string match {*master_link_status:up*} [r info replication]] | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 fail "Can't turn the instance into a replica" | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             test {Test master link up hook} { | 
					
						
							|  |  |  |                 assert_equal [r hooks.event_count masterlink-up] 1 | 
					
						
							|  |  |  |                 assert_equal [r hooks.event_count masterlink-down] 0 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             test {Test role-replica hook} { | 
					
						
							|  |  |  |                 assert_equal [r hooks.event_count role-replica] 1 | 
					
						
							|  |  |  |                 assert_equal [r hooks.event_count role-master] 0 | 
					
						
							|  |  |  |                 assert_equal [r hooks.event_last role-replica] [s 0 master_host] | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             test {Test replica-online hook} { | 
					
						
							|  |  |  |                 assert_equal [r -1 hooks.event_count replica-online] 1 | 
					
						
							|  |  |  |                 assert_equal [r -1 hooks.event_count replica-offline] 0 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             test {Test master link down hook} { | 
					
						
							|  |  |  |                 r client kill type master | 
					
						
							|  |  |  |                 assert_equal [r hooks.event_count masterlink-down] 1 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $replica replicaof no one | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             test {Test role-master hook} { | 
					
						
							|  |  |  |                 assert_equal [r hooks.event_count role-replica] 1 | 
					
						
							|  |  |  |                 assert_equal [r hooks.event_count role-master] 1 | 
					
						
							|  |  |  |                 assert_equal [r hooks.event_last role-master] {} | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             test {Test replica-offline hook} { | 
					
						
							|  |  |  |                 assert_equal [r -1 hooks.event_count replica-online] 1 | 
					
						
							|  |  |  |                 assert_equal [r -1 hooks.event_count replica-offline] 1 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             # get the replica stdout, to be used by the next test
 | 
					
						
							|  |  |  |             set replica_stdout [srv 0 stdout] | 
					
						
							| 
									
										
										
										
											2019-10-24 16:51:03 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-29 23:59:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # look into the log file of the server that just exited
 | 
					
						
							|  |  |  |         test {Test shutdown hook} { | 
					
						
							|  |  |  |             assert_equal [string match {*module-event-shutdown*} [exec tail -5 < $replica_stdout]] 1 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-24 16:41:25 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } |