File: proxymut.lua

package info (click to toggle)
memcached 1.6.39-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,320 kB
  • sloc: ansic: 62,281; perl: 12,500; sh: 4,569; makefile: 468; python: 402; xml: 59
file content (148 lines) | stat: -rw-r--r-- 5,207 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
-- TODO: separate test file which pokes the mutator config failure modes
-- config arg would make that pretty easy.

function mcp_config_pools()
    local b1 = mcp.backend('b1', '127.0.0.1', 12173)
    return mcp.pool({b1})
end

function mcp_config_routes(p)
    local mgfg = mcp.funcgen_new()
    local mgfgh = mgfg:new_handle(p)
    local msfg = mcp.funcgen_new()
    local msfgh = msfg:new_handle(p)
    local mginth = mgfg:new_handle(mcp.internal_handler)
    local msinth = msfg:new_handle(mcp.internal_handler)

    -- TODO: basic ascii handlers as well
    -- so we can test rewriting requests between command types

    -- various mutators to test

    -- basic; no flags at all.
    local mut_mgreq = mcp.req_mutator_new(
        { t = "cmdset", cmd = "mg" },
        { t = "keyset", val = "override" }
    )

    local mut_mgreqcopy = mcp.req_mutator_new(
        { t = "cmdcopy", idx = 1 },
        { t = "keycopy", idx = 2 }
    )

    -- set a bunch of flags
    local mut_mgflagreq = mcp.req_mutator_new(
        { t = "cmdset", cmd = "mg" },
        { t = "keyset", val = "override" },
        { t = "flagset", flag = "s" },
        { t = "flagset", flag = "t" },
        { t = "flagset", flag = "O", val = "opaque" },
        { t = "flagset", flag = "N", val = 33 }
    )

    -- basic res: no flags.
    local mut_mgres = mcp.res_mutator_new(
        { t = "rescodeset", val = "HD" }
    )

    -- res with value.
    local mut_mgresval = mcp.res_mutator_new(
        { t = "rescodecopy", idx = 1 },
        { t = "valcopy", idx = 2 }
    )

    -- res with flags.
    local mut_mgresflag = mcp.res_mutator_new(
        { t = "rescodeset", val = "HD" },
        { t = "flagset", flag = "t", val = "37" },
        { t = "flagcopy", flag = "O", idx = 1 }
    )

    local mut_mgresflagall = mcp.res_mutator_new(
        { t = "rescodeset", val = "HD" },
        { t = "flagcopyall", idx = 1 }
    )

    -- error res.
    local mut_reserr = mcp.res_mutator_new(
        { t = "reserr", code = "server", msg = "teapot" }
    )

    mgfg:ready({
        n = "mgtest", u = 2, f = function(rctx)
            -- make blank request objects for handing to mutator

            -- these objects must be made per slot (rctx)
            -- they're made via the rctx so it can release memory inbetween
            -- requests.
            local nreq = rctx:request_new()
            local nres = rctx:response_new()

            return function(r)
                local key = r:key()
                -- test tree

                if key == "mgreq" then
                    local ret = mut_mgreq(nreq)
                    return rctx:enqueue_and_wait(nreq, mgfgh)
                elseif key == "mgflagreq" then
                    local ret = mut_mgflagreq(nreq)
                    return rctx:enqueue_and_wait(nreq, mgfgh)
                elseif key == "mgreqcopy" then
                    local ret = mut_mgreqcopy(nreq, "md", "differentkey")
                    return rctx:enqueue_and_wait(nreq, mgfgh)
                elseif key == "mgres" then
                    local ret = mut_mgres(nres)
                    return nres
                elseif key == "mgresval" then
                    local ret = mut_mgresval(nres, "VA", "example value\r\n")
                    return nres
                elseif key == "mgresflag" then
                    local res = rctx:enqueue_and_wait(r, mgfgh)
                    local ret = mut_mgresflag(nres, res)
                    return nres
                elseif key == "mgresflag2" then
                    local res = rctx:enqueue_and_wait(r, mgfgh)
                    local ret = mut_mgresflag(nres, "toast")
                    return nres
                elseif key == "mgresflag3" then
                    local res = rctx:enqueue_and_wait(r, mgfgh)
                    local ret = mut_mgresflag(nres, nil)
                    return nres
                elseif key == "mgresflag4" then
                    local res = rctx:enqueue_and_wait(r, mgfgh)
                    local ret = mut_mgresflag(nres, true)
                    return nres
                elseif key == "mgresflagall" then
                    local res = rctx:enqueue_and_wait(r, mgfgh)
                    local ret = mut_mgresflagall(nres, res)
                    return nres
                elseif key == "mgresflagallint" then
                    local res = rctx:enqueue_and_wait(r, mginth)
                    local ret = mut_mgresflagall(nres, res)
                    return nres
                elseif key == "mgresteapot" then
                    local res = mut_reserr(nres)
                    if nres:ok() or nres:hit() then
                        return "SERVER_ERROR NOT a teapot\r\n"
                    end
                    return nres
                end
            end
        end
    })

    msfg:ready({
        n = "mstest", u = 2, f = function(rctx)
            return function(r)
                local key = r:key()
                if key == "mgresflagallint" then
                    return rctx:enqueue_and_wait(r, msinth)
                end
            end
        end
    })

    mcp.attach(mcp.CMD_MG, mgfg)
    mcp.attach(mcp.CMD_MS, msfg)
end