Re: Binding Postgres to port 0 for testing

From: Markus Pilman <markus(at)pilman(dot)ch>
To: Erik Wienhold <ewie(at)ewie(dot)name>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Binding Postgres to port 0 for testing
Date: 2023-03-25 19:10:38
Message-ID: CALavoow=fvELBK8UP11XvgvoJoMk1JEqNSoVRDQGr27-6-0GEw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Thanks for the suggestions. I didn't know about pg_virtualenv, that's
interesting. Though it seems to achieve something similar as to
containerize the test (potentially in a more platform independent way).
Though it seems pg_virtualenv is mostly doing what my test driver is
currently doing. Trying out the ports is obviously possible, but it seems a
bit hacky to me (though if there's no better way I don't think that's a
good show-stopper).

But I am still wondering: Is there a reason PostgreSQL doesn't allow me to
bind against port 0? I understand that in a production environment this is
almost never the thing you want to do, but I wouldn't consider this option
very dangerous.

Best Markus

On Sat, Mar 25, 2023 at 12:10 PM Erik Wienhold <ewie(at)ewie(dot)name> wrote:

> > On 25/03/2023 18:01 CET Markus Pilman <markus(at)pilman(dot)ch> wrote:
> >
> > I am building a simple integration test framework for an application
> that I
> > am building. For this project I am planning to use PostgreSQL.
> >
> > For testing purposes I'd like to always start with an empty database,
> > populate data, and, if the test was successful, delete everything. These
> > tests are single process tests.
> >
> > I'd like to run many processes in parallel and have one postgres server
> > process running for each. I realize that I could use one and use multiple
> > databases but I don't want to do this for a variety of reasons (one being
> > that I also want to test the control plane logic, the application is
> > multi-tenant and uses a database per tenant, having separate databases
> > simplifies debugging etc).
> >
> > Now the problem is that I need to find a TCP port for each running
> postgres
> > instance. There's multiple ways to do this, but by far the easiest one I
> > know is to bind to port 0. So my plan was to start postgres with "-p 0"
> and
> > then parse stdout to figure out which port it actually uses. But that
> > doesn't seem to work:
> >
> > >postgres -D data/ -p 0
> > 2023-03-25 16:39:54.271 GMT [13924] FATAL: 0 is outside the valid range
> for parameter "port" (1 .. 65535)
> >
> > What would be the recommended way of addressing my issue?
>
> I would try to start Postgres with every port number in a for loop starting
> with port number 1024. The first one that works is your port number. And
> you
> may not even have to parse stdout if you can pass that port number to your
> tests.
>
> Maybe you can also use pg_virtualenv[0] from Debian's postgresql-common.
> It
> tries every port number starting from 5432.
>
> [0]
> https://manpages.debian.org/testing/postgresql-common/pg_virtualenv.1.en.html
>
> --
> Erik
>

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Erik Wienhold 2023-03-25 21:09:02 Re: Binding Postgres to port 0 for testing
Previous Message Erik Wienhold 2023-03-25 18:10:19 Re: Binding Postgres to port 0 for testing