varnishtest "cook sample fetch Test"

feature ignore_unknown_macro

# TEST - 1
# Cookie from request
server s1 {
    rxreq
    txresp
} -start

haproxy h1 -conf {
    global
    .if feature(THREAD)
        thread-groups 1
    .endif

    defaults
	timeout client 30s
	timeout server 30s
	timeout connect 30s
        mode http

    frontend fe
        bind "fd@${fe}"
        http-request set-var(txn.count) req.cook_cnt()
        http-request set-var(txn.val) req.cook_val()
        http-request set-var(txn.val_cook2) req.cook_val(cook2)
        http-request set-var(txn.cook_names) req.cook_names
        http-response set-header count %[var(txn.count)]
        http-response set-header val %[var(txn.val)]
        http-response set-header val_cook2 %[var(txn.val_cook2)]
        http-response set-header cook_names %[var(txn.cook_names)]

        default_backend be

    backend be
        server srv1 ${s1_addr}:${s1_port}
} -start

client c1 -connect ${h1_fe_sock} {
    txreq -url "/" \
        -hdr "cookie: cook1=0; cook2=123; cook3=22"
    rxresp
    expect resp.status == 200
    expect resp.http.count == "3"
    expect resp.http.val == "0"
    expect resp.http.val_cook2 == "123"
    expect resp.http.cook_names == "cook1,cook2,cook3"
} -run

# TEST - 2
# Set-Cookie from response
server s2 {
    rxreq
    txresp -hdr "Set-Cookie: cook1=0; cook2=123; cook3=22"
} -start

haproxy h2 -conf {
    global
    .if feature(THREAD)
        thread-groups 1
    .endif

    defaults
	timeout client 30s
	timeout server 30s
	timeout connect 30s
        mode http

    frontend fe
        bind "fd@${fe}"
        http-response set-var(txn.cook_names) res.cook_names
        http-response set-header cook_names %[var(txn.cook_names)]

        default_backend be

    backend be
        server srv2 ${s2_addr}:${s2_port}
} -start

client c2 -connect ${h2_fe_sock} {
    txreq -url "/"
    rxresp
    expect resp.status == 200
    expect resp.http.cook_names == "cook1"
} -run

# TEST - 3
# Multiple Cookie headers from request
server s3 {
    rxreq
    txresp
} -start

haproxy h3 -conf {
    global
    .if feature(THREAD)
        thread-groups 1
    .endif

    defaults
	timeout client 30s
	timeout server 30s
	timeout connect 30s
        mode http

    frontend fe
        bind "fd@${fe}"
        http-request set-var(txn.cook_names) req.cook_names
        http-response set-header cook_names %[var(txn.cook_names)]

        default_backend be

    backend be
        server srv3 ${s3_addr}:${s3_port}
} -start

client c3 -connect ${h3_fe_sock} {
    txreq -url "/" \
        -hdr "cookie: cook1=0; cook2=123; cook3=22" \
        -hdr "cookie: cook4=1; cook5=2; cook6=3"
    rxresp
    expect resp.status == 200
    expect resp.http.cook_names == "cook1,cook2,cook3,cook4,cook5,cook6"
} -run

# TEST - 4
# Multiple Set-Cookie headers from response
server s4 {
    rxreq
    txresp -hdr "Set-Cookie: cook1=0; cook2=123; cook3=22" \
           -hdr "Set-Cookie: cook4=1; cook5=2; cook6=3"
} -start

haproxy h4 -conf {
    global
    .if feature(THREAD)
        thread-groups 1
    .endif

    defaults
	timeout client 30s
	timeout server 30s
	timeout connect 30s
        mode http

    frontend fe
        bind "fd@${fe}"
        http-response set-var(txn.cook_names) res.cook_names
        http-response set-header cook_names %[var(txn.cook_names)]

        default_backend be

    backend be
        server srv4 ${s4_addr}:${s4_port}
} -start

client c4 -connect ${h4_fe_sock} {
    txreq -url "/"
    rxresp
    expect resp.status == 200
    expect resp.http.cook_names == "cook1,cook4"
} -run
