# This test verifies that H2 anomalies counted as glitches are properly detected
# and fetched.

varnishtest "h2 glitches"
feature ignore_unknown_macro

# haproxy frontend
haproxy hap -conf {
    global
    .if feature(THREAD)
        thread-groups 1
    .endif

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

	listen fe1
		bind "fd@${fe1}" proto h2
		tcp-request session track-sc0 src
		http-request return status 200 hdr x-glitches %[fc_glitches] hdr x-glitch-cnt %[sc0_glitch_cnt] hdr x-glitch-rate %[sc0_glitch_rate]
		stick-table type ip size 10 store glitch_cnt,glitch_rate(1m)
} -start

# valid request: no glitch
client c1 -connect ${hap_fe1_sock} {
	txpri
	stream 0 {
		txsettings
		rxsettings
		txsettings -ack
		rxsettings
		expect settings.ack == true
	} -run

	stream 1 {
		txreq \
		  -method "GET" \
		  -scheme "http" \
		  -url "/"
		rxresp
		expect resp.status == 200
		expect resp.http.x-glitches == 0
	} -run

	stream 3 {
		txreq \
		  -method "GET" \
		  -scheme "http" \
		  -url "/"
		rxresp
		expect resp.status == 200
		expect resp.http.x-glitches == 0
	} -run
} -run

# invalid path: => req decoding error => glitch++
client c2-path -connect ${hap_fe1_sock} {
	txpri
	stream 0 {
		txsettings
		rxsettings
		txsettings -ack
		rxsettings
		expect settings.ack == true
	} -run

	stream 1 {
		txreq \
		  -method "GET" \
		  -scheme "http" \
		  -url "hello-world"
		rxrst
	} -run

	stream 3 {
		txreq \
		  -method "GET" \
		  -scheme "http" \
		  -url "/"
		rxresp
		expect resp.status == 200
		expect resp.http.x-glitches == 1
		expect resp.http.x-glitch-cnt == 1
		expect resp.http.x-glitch-rate == 1
	} -run
} -run

# invalid scheme: blocked at HTX layer, not counted
client c3-scheme -connect ${hap_fe1_sock} {
	txpri
	stream 0 {
		txsettings
		rxsettings
		txsettings -ack
		rxsettings
		expect settings.ack == true
	} -run

	stream 1 {
		txreq \
		  -method "GET" \
		  -scheme "http://localhost/?" \
		  -url "/"
		rxresp
		expect resp.status == 400
	} -run

	stream 3 {
		txreq \
		  -method "GET" \
		  -scheme "http" \
		  -url "/"
		rxresp
		expect resp.status == 200
		expect resp.http.x-glitches == 0
		expect resp.http.x-glitch-cnt == 1
		expect resp.http.x-glitch-rate == 1
	} -run
} -run
