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 <e...@ewie.name> wrote: > > On 25/03/2023 18:01 CET Markus Pilman <mar...@pilman.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 >