From 3d7706a73d6132789d33c404439afdabd21d2030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Cobucci?= Date: Thu, 21 Apr 2022 17:46:06 +0200 Subject: [PATCH] Provide way to simulate network issues for tests This introduces a proxy that simulates different network issues and a client to manage it. That is handy to be able to test for issues that can only be reproduced in specific scenarios/environments. The management API provided here is slimmed down to only reproduce peer resets but can be further extended if/when necessary. More information: https://github.com/shopify/toxiproxy --- docker-compose.yml | 12 +++ .../ToxiproxyManagement.php | 75 +++++++++++++++++++ test_files/toxiproxy/toxiproxy.json | 20 +++++ 3 files changed, 107 insertions(+) create mode 100644 src/AdapterTestUtilities/ToxiproxyManagement.php create mode 100644 test_files/toxiproxy/toxiproxy.json diff --git a/docker-compose.yml b/docker-compose.yml index 4e1b723b1..3ab6b7729 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -44,3 +44,15 @@ services: - "2122:21" - "30000-30009:30000-30009" command: "/run.sh -l puredb:/etc/pure-ftpd/pureftpd.pdb -E -j -P localhost" + toxiproxy: + container_name: toxiproxy + restart: unless-stopped + image: ghcr.io/shopify/toxiproxy + command: "-host 0.0.0.0 -config /opt/toxiproxy/config.json" + volumes: + - ./test_files/toxiproxy/toxiproxy.json:/opt/toxiproxy/config.json:ro + ports: + - "8474:8474" # HTTP API + - "8222:8222" # SFTP + - "8121:8121" # FTP + - "8122:8122" # FTPD diff --git a/src/AdapterTestUtilities/ToxiproxyManagement.php b/src/AdapterTestUtilities/ToxiproxyManagement.php new file mode 100644 index 000000000..47a4b1721 --- /dev/null +++ b/src/AdapterTestUtilities/ToxiproxyManagement.php @@ -0,0 +1,75 @@ +apiClient = $apiClient; + } + + public static function forServer(string $apiUri = 'http://localhost:8474'): self + { + return new self( + new Client( + [ + 'base_uri' => $apiUri, + 'base_url' => $apiUri, // Compatibility with older versions of Guzzle + ] + ) + ); + } + + public function removeAllToxics(): void + { + $this->apiClient->post('/reset'); + } + + /** + * Simulates a peer reset on the client->server direction. + * + * @param RegisteredProxies $proxyName + */ + public function resetPeerOnRequest( + string $proxyName, + int $timeoutInMilliseconds + ): void { + $configuration = [ + 'type' => 'reset_peer', + 'stream' => 'upstream', + 'attributes' => ['timeout' => $timeoutInMilliseconds], + ]; + + $this->addToxic($proxyName, $configuration); + } + + /** + * Registers a network toxic for the given proxy. + * + * @param RegisteredProxies $proxyName + * @param Toxic $configuration + */ + private function addToxic(string $proxyName, array $configuration): void + { + $this->apiClient->post('/proxies/' . $proxyName . '/toxics', ['json' => $configuration]); + } +} diff --git a/test_files/toxiproxy/toxiproxy.json b/test_files/toxiproxy/toxiproxy.json new file mode 100644 index 000000000..9396fb838 --- /dev/null +++ b/test_files/toxiproxy/toxiproxy.json @@ -0,0 +1,20 @@ +[ + { + "name": "sftp", + "listen": "[::]:8222", + "upstream": "sftp:22", + "enabled": true + }, + { + "name": "ftp", + "listen": "[::]:8121", + "upstream": "ftp:21", + "enabled": true + }, + { + "name": "ftpd", + "listen": "[::]:8122", + "upstream": "ftpd:21", + "enabled": true + } +]