Writing Python unit tests for HTTP Clients

I have a nagios / icinga HTTP monitor based on PyCurl: check_pycurl3.

Writing tests for this is difficult because:

  • It needs to make HTTP requests and get a consistent response (so can’t rely on random internet websites).
  • You cannot mock the HTTP requests as the modules for doing this rely on using more “standard” Python HTTP packages (like urllib or requests).
  • Just spawning Flask or similar won’t work as it goes into its request loop and won’t process any tests.

So with a little StackExchange googling, you can start Flask in a thread (remember to set daemon=True) like below:

flask = threading.Thread(target=lambda: self.app.run(host=self.host,
    port=self.port, debug=False, use_reloader=False),
    daemon=True)
flask.start()

You also need to give it some time to start up before tests commence, I’ve used the hacky approach of a 1 second sleep.

To see how I set up routes & inhibit flask startup messages, check the code!

dnf upgrade crashing on free oracle cloud vms running OEL8

There are 2 reasons for this: the memory on these VMs is small (668MB) & DNF is badly written and uses 100s of MBs. Secondly Oracle Linux includes a lot of repos.

1. install microdnf by wgetting it (as dnf is failing)

wget https://yum.oracle.com/repo/OracleLinux/OL8/baseos/latest/x86_64/getPackage/libpeas-1.22.0-6.el8.x86_64.rpm

wget https://yum.oracle.com/repo/OracleLinux/OL8/baseos/latest/x86_64/getPackage/microdnf-3.4.0-4.el8.x86_64.rpm

rpm -ivh *.rpm

2. Upgrade base repos

microdnf update –disablerepo=* –enablerepo=ol8_baseos_latest –enablerepo=ol8_appstream