mirror of https://github.com/redis/redis.git
				
				
				
			
		
			
				
	
	
		
			65 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Tcl
		
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Tcl
		
	
	
	
| # make sure the test infra won't use SELECT
 | |
| set old_singledb $::singledb
 | |
| set ::singledb 1
 | |
| 
 | |
| start_server {overrides {cluster-enabled yes} tags {external:skip cluster}} {
 | |
|     r 0 cluster addslotsrange 0 16383
 | |
|     wait_for_condition 50 100 {
 | |
|         [csi 0 cluster_state] eq "ok"
 | |
|     } else {
 | |
|         fail "Cluster never became 'ok'"
 | |
|     }
 | |
| 
 | |
|     test {Eval scripts with shebangs and functions default to no cross slots} {
 | |
|         # Test that scripts with shebang block cross slot operations
 | |
|         assert_error "ERR Script attempted to access keys that do not hash to the same slot*" {
 | |
|             r 0 eval {#!lua
 | |
|                 redis.call('set', 'foo', 'bar')
 | |
|                 redis.call('set', 'bar', 'foo')
 | |
|                 return 'OK'
 | |
|             } 0}
 | |
| 
 | |
|         # Test the functions by default block cross slot operations
 | |
|         r 0 function load REPLACE {#!lua name=crossslot
 | |
|             local function test_cross_slot(keys, args)
 | |
|                 redis.call('set', 'foo', 'bar')
 | |
|                 redis.call('set', 'bar', 'foo')
 | |
|                 return 'OK'
 | |
|             end
 | |
| 
 | |
|             redis.register_function('test_cross_slot', test_cross_slot)}
 | |
|         assert_error "ERR Script attempted to access keys that do not hash to the same slot*" {r FCALL test_cross_slot 0}
 | |
|     }
 | |
| 
 | |
|     test {Cross slot commands are allowed by default for eval scripts and with allow-cross-slot-keys flag} {
 | |
|         # Old style lua scripts are allowed to access cross slot operations
 | |
|         r 0 eval "redis.call('set', 'foo', 'bar'); redis.call('set', 'bar', 'foo')" 0
 | |
| 
 | |
|         # scripts with allow-cross-slot-keys flag are allowed
 | |
|         r 0 eval {#!lua flags=allow-cross-slot-keys
 | |
|             redis.call('set', 'foo', 'bar'); redis.call('set', 'bar', 'foo')
 | |
|         } 0
 | |
| 
 | |
|         # Functions with allow-cross-slot-keys flag are allowed
 | |
|         r 0 function load REPLACE {#!lua name=crossslot
 | |
|             local function test_cross_slot(keys, args)
 | |
|                 redis.call('set', 'foo', 'bar')
 | |
|                 redis.call('set', 'bar', 'foo')
 | |
|                 return 'OK'
 | |
|             end
 | |
| 
 | |
|             redis.register_function{function_name='test_cross_slot', callback=test_cross_slot, flags={ 'allow-cross-slot-keys' }}}
 | |
|         r FCALL test_cross_slot 0
 | |
|     }
 | |
|     
 | |
|     test {Cross slot commands are also blocked if they disagree with pre-declared keys} {
 | |
|         assert_error "ERR Script attempted to access keys that do not hash to the same slot*" {
 | |
|             r 0 eval {#!lua
 | |
|                 redis.call('set', 'foo', 'bar')
 | |
|                 return 'OK'
 | |
|             } 1 bar}
 | |
|     }
 | |
| }
 | |
| 
 | |
| set ::singledb $old_singledb
 |