File: test_basic.py

package info (click to toggle)
nutcracker 0.5.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 3,192 kB
  • sloc: ansic: 15,221; sh: 5,284; python: 1,230; php: 300; makefile: 130
file content (148 lines) | stat: -rw-r--r-- 3,895 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
58
59
60
61
62
63
64
65
66
67
68
69
70
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
99
100
101
102
103
104
105
106
107
108
109
110
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
139
140
141
142
143
144
145
146
147
148
#!/usr/bin/env python
#coding: utf-8

from nose.tools import nottest
from .common import *

def test_setget():
    r = getconn()

    rst = r.set('k', 'v')
    assert_equal(True, rst)
    assert_equal(b'v', r.get('k'))

def test_msetnx():
    r = getconn()

    # https://redis.io/commands/msetnx
    # MSETNX is not supported because the keys can get sent to different backends, which is not supported.
    normalized_kv = {str(key, encoding='utf-8'): val for key, val in default_kv.items()}
    assert_fail('Socket closed|Connection closed', r.msetnx, normalized_kv)

def test_null_key():
    r = getconn()
    rst = r.set('', 'v')
    assert_equal(b'v', r.get(''))

    rst = r.set('', '')
    assert_equal(b'', r.get(''))

    kv = {'' : 'val', 'k': 'v'}
    ret = r.mset(kv)
    assert_equal(b'val', r.get(''))

def test_ping_quit():
    r = getconn()
    assert(r.ping() == True)

    #get set
    rst = r.set('k', 'v')
    assert_equal(b'v', r.get('k'))

    assert_fail('Socket closed|Connection closed', r.execute_command, 'QUIT')

def test_slow_req_lua():
    r = getconn()
    pipe = r.pipeline(transaction=False)
    pipe.eval("local x=0;for i = 1,300000000,1 do x = x+ i; end; return x", 1, 'tmp')
    assert_fail('timed out', pipe.execute)

def test_fast_req_lua():
    r = getconn()
    pipe = r.pipeline(transaction=False)
    pipe.eval("local x=0;for i = 1,100,1 do x = x+ i; end; return x", 1, 'tmp')
    assert_equal([5050], pipe.execute())

# Disabled because this uses a lot of memory and would sometimes complete before the timeout.
@nottest
def disabled_test_slow_req():
    r = getconn()

    kv = {'mkkk-%s' % i : 'mvvv-%s' % i for i in range(500000)}

    pipe = r.pipeline(transaction=False)
    pipe.set('key-1', 'v1')
    pipe.get('key-1')
    pipe.hmset('xxx', kv)
    pipe.get('key-2')
    pipe.get('key-3')

    assert_fail('timed out', pipe.execute)

def test_signal():
    #init
    nc.cleanlog()
    time.sleep(.1)
    nc.signal('HUP')

    nc.signal('HUP')
    nc.signal('TTIN')
    nc.signal('TTOU')
    nc.signal('SEGV')

    time.sleep(.3)
    log = open(nc.logfile(), 'r').read()

    assert(strstr(log, 'HUP'))
    assert(strstr(log, 'TTIN'))
    assert(strstr(log, 'TTOU'))
    assert(strstr(log, 'SEGV'))

    #recover
    nc.start()

def test_nc_stats():
    nc.stop() #reset counters
    nc.start()
    r = getconn()
    kv = {'kkk-%s' % i :'vvv-%s' % i for i in range(10)}
    for k, v in list(kv.items()):
        r.set(k, v)
        r.get(k)

    def get_stat(name):
        time.sleep(1)
        stat = nc._info_dict()
        #pprint(stat)
        if name in ['client_connections', 'client_eof', 'client_err', \
                    'forward_error', 'fragments', 'server_ejects']:
            return stat[CLUSTER_NAME][name]

        #sum num of each server
        ret = 0
        for k, v in list(stat[CLUSTER_NAME].items()):
            if type(v) == dict:
                ret += v[name]
        return ret

    assert(get_stat('requests') == 20)
    assert(get_stat('responses') == 20)

    ##### mget
    keys = list(kv.keys())
    r.mget(keys)

    #for version<=0.3.0
    #assert(get_stat('requests') == 30)
    #assert(get_stat('responses') == 30)

    #for mget-improve
    assert(get_stat('requests') == 22)
    assert(get_stat('responses') == 22)

def test_issue_323():
    # do on redis
    r = all_redis[0]
    c = redis.Redis(r.host(), r.port())
    assert_equal([1, b'OK'], c.eval("return {1, redis.call('set', 'x', '1')}", 1, 'tmp'))

    # do on twemproxy
    c = getconn()
    assert_equal([1, b'OK'], c.eval("return {1, redis.call('set', 'x', '1')}", 1, 'tmp'))

    # Test processing deeply nested multibulk responses
    assert_equal([[[[[[[[[[[[[[[[[[[[b'value']]]]]]]]]]]]]]]]]]], b'other'], c.eval("return {{{{{{{{{{{{{{{{{{{{'value'}}}}}}}}}}}}}}}}}}}, 'other'}", 1, 'tmp'))

def setup_and_wait():
    time.sleep(60*60)