Re: Declarative HTTP Spec Test Suite

Willy Tarreau <w@1wt.eu> Mon, 27 May 2024 13:24 UTC

Return-Path: <ietf-http-wg-request+bounce-httpbisa-archive-bis2juki=ietf.org@listhub.w3.org>
X-Original-To: ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com
Delivered-To: ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 5153EC15107C for <ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com>; Mon, 27 May 2024 06:24:20 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -7.749
X-Spam-Level:
X-Spam-Status: No, score=-7.749 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.249, MAILING_LIST_MULTI=-1, RCVD_IN_DNSWL_HI=-5, RCVD_IN_ZEN_BLOCKED_OPENDNS=0.001, SPF_PASS=-0.001, URIBL_DBL_BLOCKED_OPENDNS=0.001, URIBL_ZEN_BLOCKED_OPENDNS=0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=w3.org header.b="P8sKuOzu"; dkim=pass (2048-bit key) header.d=w3.org header.b="g6HYpdry"
Received: from mail.ietf.org ([50.223.129.194]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id m3KKXJqVwlJU for <ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com>; Mon, 27 May 2024 06:24:16 -0700 (PDT)
Received: from mab.w3.org (mab.w3.org [IPv6:2600:1f18:7d7a:2700:d091:4b25:8566:8113]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 664E7C14F6EE for <httpbisa-archive-bis2Juki@ietf.org>; Mon, 27 May 2024 06:24:16 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=w3.org; s=s1; h=Subject:In-Reply-To:Content-Type:MIME-Version:References:Message-ID: Cc:To:From:Date:Reply-To; bh=SHqKuDd/LuV+JbpqUvOt9pjcm5ndU0jNUp1swQia6qc=; b= P8sKuOzuD8Crg4d9L+mOTmGWCzbTlcg4WrlzxcqvFykWkiz71TskZ2Kd3c1OY7gM3DvOSHx531lVD EYjDXl0XLs9PPJrEg/AZ7zIAopSfYADEM/PYQUmSObi3jlk3yZyff8gpr/RFKG99ojlBG/j/owV9o dpQe1DJR+Kvwlew7VmSNUTo45We/AJBYbkPU6/nC64d2AcsDgCmgqgUhfRnlerKgOuRIJSYEBlaoe yv3S/LbpR03ELxPuMot+adugCJzK9nwpeSHKun7sG7upMTC4j8zg8o6OwnJitFq5nI2hvj6MbURuo T4rGazNm2s07drSMybF+vJddf+r44FiuDA==;
Received: from lists by mab.w3.org with local (Exim 4.96) (envelope-from <ietf-http-wg-request@listhub.w3.org>) id 1sBaK2-00CGMV-2L for ietf-http-wg-dist@listhub.w3.org; Mon, 27 May 2024 13:23:30 +0000
Resent-Date: Mon, 27 May 2024 13:23:30 +0000
Resent-Message-Id: <E1sBaK2-00CGMV-2L@mab.w3.org>
Received: from ip-10-0-0-224.ec2.internal ([10.0.0.224] helo=puck.w3.org) by mab.w3.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from <w@1wt.eu>) id 1sBaK0-00CGLa-2u for ietf-http-wg@listhub.w3.internal; Mon, 27 May 2024 13:23:28 +0000
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=w3.org; s=s1; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject: Cc:To:From:Date:Reply-To; bh=SHqKuDd/LuV+JbpqUvOt9pjcm5ndU0jNUp1swQia6qc=; t=1716816208; x=1717680208; b=g6HYpdryj4dHCJGSouiCw75FTnkYSWqPdxdio9OyD40ssN6 rUBKrx+rRfruDhwQx9s2WkWzpq04tTqCeT+HiJVRDE0xoUf+4SuOkq7yFvTiI6HYkpov11H1zHF9r pN084DJq1sjS/778cp/LAFbbvR94JEqkp6w7RYODzIedWfx97W0G87qu94NTK6Fx3d1gxTUhz1lWU C01wdGcaHnVvImHtYK2Pah/ZqsroxGIoz9tJoSYPP4qVIqSXUI8bQ3t7+kk9g9qL5HvEE6tewm80n MgUy5DBc46tHrBvgnZramkfuUS6vaZD1y4gK41VxJ0j2VoFc1FNfYtj4hhfygeJQ==;
Received-SPF: pass (puck.w3.org: domain of 1wt.eu designates 163.172.96.212 as permitted sender) client-ip=163.172.96.212; envelope-from=w@1wt.eu; helo=1wt.eu;
Received: from ded1.1wt.eu ([163.172.96.212] helo=1wt.eu) by puck.w3.org with esmtp (Exim 4.96) (envelope-from <w@1wt.eu>) id 1sBaJy-001PJz-2o for ietf-http-wg@w3.org; Mon, 27 May 2024 13:23:28 +0000
Received: (from willy@localhost) by mail.home.local (8.17.1/8.17.1/Submit) id 44RDNDiP006723; Mon, 27 May 2024 15:23:13 +0200
Date: Mon, 27 May 2024 15:23:13 +0200
From: Willy Tarreau <w@1wt.eu>
To: Poul-Henning Kamp <phk@phk.freebsd.dk>
Cc: Mohammed Al Sahaf <mohammed@caffeinatedwonders.com>, "ietf-http-wg@w3.org" <ietf-http-wg@w3.org>
Message-ID: <ZlSJQawTqEzLYVvg@1wt.eu>
References: <tPxvQGS7_bxKqrFish00m9LtTT_JQfE0RU1bthEcxYNTZR_uzbkEWKNOTg9c5azoZSYuDWt9pLCiS7Kd4nIWK8DPN1sOtcgbDGx4L7BeeU4=@caffeinatedwonders.com> <202405271304.44RD4iQj027668@critter.freebsd.dk>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <202405271304.44RD4iQj027668@critter.freebsd.dk>
X-W3C-Hub-Spam-Status: No, score=-4.9
X-W3C-Hub-Spam-Report: BAYES_00=-1.9, DMARC_MISSING=0.001, RCVD_IN_ZEN_BLOCKED_OPENDNS=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01, URIBL_DBL_BLOCKED_OPENDNS=0.001, W3C_AA=-1, W3C_IRA=-1, W3C_WL=-1
X-W3C-Scan-Sig: puck.w3.org 1sBaJy-001PJz-2o d27a69029f967ae1ac25e662769cdfc4
X-Original-To: ietf-http-wg@w3.org
Subject: Re: Declarative HTTP Spec Test Suite
Archived-At: <https://www.w3.org/mid/ZlSJQawTqEzLYVvg@1wt.eu>
Resent-From: ietf-http-wg@w3.org
X-Mailing-List: <ietf-http-wg@w3.org> archive/latest/51970
X-Loop: ietf-http-wg@w3.org
Resent-Sender: ietf-http-wg-request@w3.org
Precedence: list
List-Id: <ietf-http-wg.w3.org>
List-Help: <https://www.w3.org/email/>
List-Post: <mailto:ietf-http-wg@w3.org>
List-Unsubscribe: <mailto:ietf-http-wg-request@w3.org?subject=unsubscribe>

On Mon, May 27, 2024 at 01:04:44PM +0000, Poul-Henning Kamp wrote:
> > This is a proposal that is triggered by some of my involvement with the Caddy
> > web server project. We (Caddy team) have been working towards developing a
> > declarative test suite for the Caddy server.
> > [...]
> > Prior Art:
> > [...]
> > Indeed some of the listed projects have not been updated for a while.
> 
> Mohammed,
> 
> I may be misunderstanding you, but using repository activity as a
> screen will make you miss stuff which Just Works(TM).
> 
> I will argue that VTest (https://github.com/vtest/VTest) is one
> such:  It chugs away, day in and day out, in both the Varnish Cache
> and HAproxy projects.
> 
> A specific reason for repository inactivity, which you might not
> have noticed, is that VTest is just the test program code and the
> test-cases do not live in the VTest respository, but in the "parent"
> projects which use VTest:
> 
> 	https://github.com/haproxy/haproxy/tree/master/reg-tests
> 
> and 
> 
> 	https://github.com/varnishcache/varnish-cache/tree/master/bin/varnishtest/tests
> 
> Full VTest documentation is under "Varnishtest" in the varnish project:
> 
> 	http://varnish-cache.org/docs/trunk/reference/index.html
> 
> I started writing VTest a dozen years ago for many of the same
> reasons you touch in your analysis, but one of my other reasons
> was that I wanted a good language to write test-cases in.
> 
> Here is a basic test from Varnish Cache, checking that chunked
> encoding works at all:
> 
> 	varnishtest "Check chunked encoding from backend works"
> 	
> 	server s1 {
>         	rxreq
>         	expect req.url == "/bar"
>         	send "HTTP/1.1 200 OK\r\n"
>         	send "Transfer-encoding: chunked\r\n"
>         	send "\r\n"
>         	send "00000004\r\n1234\r\n"
>         	send "00000000\r\n"
>         	send "\r\n"
> 	
>         	rxreq
>         	expect req.url == "/foo"
>         	send "HTTP/1.1 200 OK\r\n"
>         	send "Transfer-encoding: chunked\r\n"
>         	send "\r\n"
>         	send "00000004\r\n1234\r\n"
>         	chunked "1234"
>         	chunked ""
> 	} -start
> 	
> 	varnish v1 -vcl+backend {} -start
> 	
> 	client c1 {
>         	txreq -url "/bar"
>         	rxresp
>         	expect resp.status == 200
>         	expect resp.bodylen == "4"
>         	txreq -url "/foo"
>         	rxresp
>         	expect resp.status == 200
>         	expect resp.bodylen == "8"
> 	} -run
> 
> First, notice the lack of "boilerplate" code, getting a bog standard
> varnish instance is one line in the test-description and the VTest
> tool takes it from there.  There is another module in VTest which
> does the same for HAproxy with the "haproxy" command.
> 
> Second, notice how VTest allows you to work at different levels of
> the HTTP protocol from one "instruction" to the next: The "s1" server
> receives an entire request with "rxreq" but in this particular test-case
> it formulates the first response at the bytelevel, while the second
> response uses the "chunked" command which automatically generates the
> length.
> 
> As I read your long analysis, VTest is not a perfect fit for you,
> but I think it is more than half way there, and you are more than
> welcome to help us make it even better.

I generally agree with the points made here. Is it possible to do better?
Certainly, just like with any tool. But it's already fairly complete and
it does something that few tools achieve right now: synchronizing both
sides, which is extremely convenient when testing reverse proxies. You
can for example have an http/1 server and verify that the output h2
encoding out of your gateway matches what you expect. We (haproxy) do
use it routinely for various reasons ranging from regression testing to
spec test compliance (mostly detect breakage before our users), and since
it's fast (validates ~3600 expect rules from 200 tests in 8 seconds on my
laptop), we run it locally on every push and in the CI on ~20 platforms
for every push.

Another tool you might be interested in having a look at is h2spec. It's
h2-centric and tries to trigger edge cases from the implementation then 
verifies if the behavior matches the spec. It requires a server however,
but that's no big deal. It's very close to the spec so it can be seen as
a catalogue of the checks to run on the traffic.

Regards,
willy