Testing Your Service With Poorly Remote Services

ToxiProxy allows you to create a controllable proxy between your app and a remote service when you want to test network reliability and related effects.

It can be downloaded in command line executable form that, when run, will start up a web service on port 8474. You can configure it using a REST client (eg Postman or cURL).

Say you want to configure a proxy for a remote service running on somewhere.else.com:2000. You can proxy it to localhost:3000 by POSTing this:

{
  "name":"badendpoint",
  "listen":"localhost:3000",
  "upstream":"somewhere.else.com:2000"
}

to http://localhost:8474/proxies

You can then GET, and update via a POST, this proxy at http://localhost:8474/proxies/badendpoint

By default the proxy will be enabled. You can change this, or anything else about it, by POSTing to that URL:

{
  "name":"badendpoint",
  "listen":"localhost:3000",
  "upstream":"somewhere.else.com:2000",
  "enabled": false
}

In this example above the proxy has been disabled - which can be used to simply test network disconnections.

Once you have a proxy you can add "toxics" to it, which simulate a variety of faults. The currently configured toxics for your proxy can be seen by making a GET request to:

http://localhost:8474/proxies/yourproxyname/toxics

To add a toxic simply post a toxic definition to the same endpoint. This example sets a timeout of 0 to the upstream proxy, which means hang forever when making the request:

{
  "type": "timeout",
  "stream": "upstream",
  "attributes": {
      "timeout": 0
  }
}

Take a look at the toxics section of the main docs to see what can be set - these include latency, jitter, bandwidth limits or custom ones.

All of this can be performed programmatically too if you want to incorporate this into your testing framework.