Testing Your Service With Poorly Remote Services

· wordCount · 2 minute read

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.