
varnishtest "Basic cache test"

feature ignore_unknown_macro

server s1 {
       rxreq
       txresp -nolen -hdr "Transfer-Encoding: chunked" \
            -hdr "Cache-Control: max-age=5"
       chunkedlen 15
       chunkedlen 15
       chunkedlen 15
       chunkedlen 0
} -start

server s2 {
       rxreq
       txresp -nolen -hdr "Transfer-Encoding: chunked" \
            -hdr "Cache-Control: max-age=5"
       chunkedlen 16
       chunkedlen 16
       chunkedlen 16
       chunkedlen 0
} -start

server s3 {
       rxreq
       txresp -nolen -hdr "Transfer-Encoding: chunked" \
            -hdr "Cache-Control: max-age=5"
       chunkedlen 17
       chunkedlen 17
       chunkedlen 17
       chunkedlen 0

       rxreq
       txresp -nolen -hdr "Transfer-Encoding: chunked" \
            -hdr "Cache-Control: max-age=5"
       chunkedlen 17
       chunkedlen 17
       chunkedlen 17
       chunkedlen 0
} -start

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

        # WT: limit false-positives causing "HTTP header incomplete" due to
        # idle server connections being randomly used and randomly expiring
        # under us.
        tune.idle-pool.shared off

    defaults
        mode http
        timeout connect "${HAPROXY_TEST_TIMEOUT-5s}"
        timeout client  "${HAPROXY_TEST_TIMEOUT-5s}"
        timeout server  "${HAPROXY_TEST_TIMEOUT-5s}"

    frontend fe
        bind "fd@${fe}"
        use_backend first_be if { path_beg /first }
        use_backend nocache_be if { path_beg /nocache }
        default_backend second_be

    backend first_be
        http-request cache-use first_cache
        server www ${s1_addr}:${s1_port}
        http-response cache-store first_cache
        http-response set-header X-Cache-Hit %[res.cache_hit]
        http-response set-header X-Cache-Name %[res.cache_name]

    backend second_be
        http-request cache-use second_cache
        server www ${s2_addr}:${s2_port}
        http-response cache-store second_cache
        http-response set-header X-Cache-Hit %[res.cache_hit]
        http-response set-header X-Cache-Name %[res.cache_name]

    backend nocache_be
        server www ${s3_addr}:${s3_port}
        http-response set-header X-Cache-Hit %[res.cache_hit]
        http-response set-header X-Cache-Name %[res.cache_name]

    cache first_cache
            total-max-size 3
            max-age 40
            max-object-size 3000

    cache second_cache
            total-max-size 3
            max-age 20
            max-object-size 3072
} -start


client c1 -connect ${h1_fe_sock} {
        txreq -url "/first"
        rxresp
        expect resp.status == 200
        expect resp.bodylen == 45
        expect resp.http.X-Cache-Hit == 0
        expect resp.http.X-Cache-Name == ""

        txreq -url "/second"
        rxresp
        expect resp.status == 200
        expect resp.bodylen == 48
        expect resp.http.X-Cache-Hit == 0
        expect resp.http.X-Cache-Name == ""

        txreq -url "/nocache"
        rxresp
        expect resp.status == 200
        expect resp.bodylen == 51
        expect resp.http.X-Cache-Hit == 0
        expect resp.http.X-Cache-Name == ""

        # Response should come form the cache now
        txreq -url "/nocache"
        rxresp
        expect resp.status == 200
        expect resp.bodylen == 51
        expect resp.http.X-Cache-Hit == 0
        expect resp.http.X-Cache-Name == ""

        txreq -url "/first"
        rxresp
        expect resp.status == 200
        expect resp.bodylen == 45
        expect resp.http.X-Cache-Hit == 1
        expect resp.http.X-Cache-Name == "first_cache"

        txreq -url "/second"
        rxresp
        expect resp.status == 200
        expect resp.bodylen == 48
        expect resp.http.X-Cache-Hit == 1
        expect resp.http.X-Cache-Name == "second_cache"
} -run
