Network Simulator

Network Simulator logo

Introduction

How does your application handle different network scenarios?

If your application calls out into the big world, you might want to know how it handles difference network scenarios.

How does it handle latency? What happens if the third-party service is down? How does it react to different HTTP status codes?

This application is designed to simulate various network conditions by acting as a proxy between clients and target services. It allows users to configure scenarios such as latency, bandwidth limitations, HTTP status codes, and responses. The application provides a user-friendly interface for configuring these scenarios.

It is useful for testing how applications behave under different network conditions, helping developers and testers to ensure robustness and reliability.

The idea is, that you only have to change the target URL of your application to point to this network simulator, and then configure the desired network conditions through the provided UI.

Use case

You have an application that relies on a third-party service. You want to test how your application behaves when the third-party service is slow, returns errors, or has limited bandwidth.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
third(Third-party service)
end
yourApp --> third
Loading

Network Simulator as proxy

By using this network simulation application as a proxy, you can simulate these conditions without modifying your application or the third-party service. You simply insert the network simulator as a proxy between your application and the third-party service.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
networkSim(Network Simulator)
third(Third-party service)
end
yourApp --> networkSim
networkSim --> third
style networkSim stroke-width:3px
Loading

How to use Network Simulator

Let's say you have an application that calls a third-party service at the URL: https://payment-gateway.com/. The payment gateway has an OpenAPI specification, where you have generated a client for it.

It has an operation to list accounts on: GET /v1/accounts.

You therefore have set a baseURL for you client to https://payment-gateway.com and the client can then call the operation with the full URL: https://payment-gateway.com/v1/accounts.

URL Structure for calling through Network Simulator

To use the Network Simulator, you first need to define a target system in the Network Simulator UI. You can name it payment-gateway and set the target URL to https://payment-gateway.com.

You must then change the baseURL of your client to point to the Network Simulator instead.

Assuming the Network Simulator is running locally on port 9898, you would set the baseURL to http://localhost:9898/forward/payment-gateway.

So, by setting your client's baseURL to http://localhost:9898/forward/payment-gateway, all requests to the payment gateway will now go through the Network Simulator. You can then configure different network and the operation GET /v1/accounts will be called as http://localhost:9898/forward/payment-gateway/v1/accounts.

The URL structure is as follows:

URL Structure

Configuring simulation scenarios

You may either configure simulation scenarios through the UI or by sending a POST request to the Network Simulator API.

Network Simulator UI

Building and Running

Prerequisites

  • Docker: Ensure you have Docker installed on your machine. You can download it from here.
  • PostgreSQL Database: The application requires a PostgreSQL database. You can either set up a local PostgreSQL instance or use a Docker container.

Running the Application

There are two main ways to run the application:

  1. Running from the command line
  2. Running with Docker Compose

The application supports using a PostgreSQL database or an in-memory H2 database.

The application is internally exposed on port 9898.

Running command line

docker run \
--name network-simulator-app \
-p 9898:9898 \
patrickfust/network-simulator:latest

Environment variables:

Variable NameDescriptionDefault Value
SPRING_PROFILES_ACTIVESpring profile to use (e.g., docker, local-postgres, h2)h2
JDBC_URLJDBC URL for PostgreSQL database connectionjdbc:postgresql://db:5432/network_simulator
JDBC_USERNAMEUsername for PostgreSQL database connectionnetwork_simulator_user
JDBC_PASSWORDPassword for PostgreSQL database connectionnetwork_simulator_password
DDL_AUTOHibernate DDL auto configuration (update, create, etc.)update
SHOW_SQLShow SQL statements in logs (true or false)false
CHUNK_SIZEChunk size for throttling simulation in bytes100
NETWORK_SIMULATOR_CONFIGURATIONJSON string for initial configuration of the network simulatornull

Example for local PostgreSQL

This is how you would run the application with a local PostgreSQL database and a chunk size of 1024 bytes:

docker run \
--name network-simulator-app \
-p 9898:9898 \
--env SPRING_PROFILES_ACTIVE=docker \
--env JDBC_URL=jdbc:postgresql://host.docker.internal:5532/network_simulator \
--env JDBC_USERNAME=network_simulator_user \
--env JDBC_PASSWORD=network_simulator_password \
--env CHUNK_SIZE=1024 \
patrickfust/network-simulator:latest

Running with Docker Compose

To run the application using Docker Compose, use the following command in the root directory of this project:

docker compose up

Building the Application

If you want to build the Docker image yourself, you can use the following command:

docker build -t patrickfust/network-simulator:latest .

Sequence diagrams

These are sequence diagrams illustrating the request and response flow with and without configured simulation scenarios. They are examples, and you can adapt them to your specific use cases.

Default behavior (no simulation)

If no scenarios are configured, the application simply forwards requests and responses between the client and the target service.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response
Loading

Configured simulation scenario with latency

When a simulation scenario is configured, the application applies the specified network conditions to the requests and responses. In this case, we illustrate a scenario with added latency.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator ->> Network Simulator: Apply latency simulation (just sleeping)
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response 
Loading

Configured simulation scenario with defined HTTP status code

In this case, we illustrate a scenario where we have specified a specific response code. You may also specify the response body if desired.

In this case, the target service is not called at all, but we simulate the response directly.

This could be useful for testing how your application handles different error codes from the third-party service, like 404 Not Found, 429 Too many requests or 500 Internal Server Error.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator-->>Your Application: Return response with defined HTTP status code (and response body) 
Loading

Features

Core Functionality

  • Network Simulation Proxy: The application acts as a proxy that can simulate various network conditions:
    • Latency simulation (delay in network responses)
    • Bandwidth limitations (throttling network speed)
    • Different HTTP status codes (200, 404, 500, etc.)
    • Packet loss simulation (random packet dropping) 1
  • User-Friendly Interface: Provides an intuitive dashboard to configure and manage simulation scenarios
  • Configuration Management: Support for saving and loading different scenario configurations 1
  • Backend Service: Handles actual simulation logic with RESTful APIs

Technical Specifications

Backend

  • Technology Stack: Java 25 with Spring Boot 4 framework
  • Database: PostgreSQL for storing scenario configurations and logs
  • APIs: RESTful services exposed for frontend interaction
  • Configuration Path: All configurations handled under path /api/
  • Proxy Behavior: Everything after the path /forward/{systemName} are proxied to target service with applied simulation scenarios

Read more about the backend and how it works here

Frontend

  • Technology: Angular 21
  • Communication: RESTful APIs for backend interaction
  • Dashboard: Provides user interface for scenario management

Read more about the frontend and how it works here

Bruno

If you haven't cloned the network-simulator git repository, you can do so by clicking the button below.

Fetch in Bruno

The Bruno collections are located in the bruno folder.

Generating Bruno collections

If you want to generate the Bruno collections yourself, you can do so from the OpenAPI specification.

  1. Install Bruno CLI
  2. Start by downloading the OpenAPI specification from http://localhost:9898/v3/api-docs and save it as network-simulator.json
  3. Run the following command to import the OpenAPI specification and generate the Bruno collection: bru import openapi --source network-simulator.json --output=bruno/network-simulator

Demo - Test Containers

You can use Test Containers to run integration tests using the network simulator application.

In the folder demo you can find a simple demo project that shows how to do use Network Simulator in your tests.

Footnotes

  1. Feature is planned but not yet implemented. 2

About

Proxy that can simulate different network scenarios

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Network Simulator

Network Simulator logo

Introduction

How does your application handle different network scenarios?

If your application calls out into the big world, you might want to know how it handles difference network scenarios.

How does it handle latency? What happens if the third-party service is down? How does it react to different HTTP status codes?

This application is designed to simulate various network conditions by acting as a proxy between clients and target services. It allows users to configure scenarios such as latency, bandwidth limitations, HTTP status codes, and responses. The application provides a user-friendly interface for configuring these scenarios.

It is useful for testing how applications behave under different network conditions, helping developers and testers to ensure robustness and reliability.

The idea is, that you only have to change the target URL of your application to point to this network simulator, and then configure the desired network conditions through the provided UI.

Use case

You have an application that relies on a third-party service. You want to test how your application behaves when the third-party service is slow, returns errors, or has limited bandwidth.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
third(Third-party service)
end
yourApp --> third
Loading

Network Simulator as proxy

By using this network simulation application as a proxy, you can simulate these conditions without modifying your application or the third-party service. You simply insert the network simulator as a proxy between your application and the third-party service.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
networkSim(Network Simulator)
third(Third-party service)
end
yourApp --> networkSim
networkSim --> third
style networkSim stroke-width:3px
Loading

How to use Network Simulator

Let's say you have an application that calls a third-party service at the URL: https://payment-gateway.com/. The payment gateway has an OpenAPI specification, where you have generated a client for it.

It has an operation to list accounts on: GET /v1/accounts.

You therefore have set a baseURL for you client to https://payment-gateway.com and the client can then call the operation with the full URL: https://payment-gateway.com/v1/accounts.

URL Structure for calling through Network Simulator

To use the Network Simulator, you first need to define a target system in the Network Simulator UI. You can name it payment-gateway and set the target URL to https://payment-gateway.com.

You must then change the baseURL of your client to point to the Network Simulator instead.

Assuming the Network Simulator is running locally on port 9898, you would set the baseURL to http://localhost:9898/forward/payment-gateway.

So, by setting your client's baseURL to http://localhost:9898/forward/payment-gateway, all requests to the payment gateway will now go through the Network Simulator. You can then configure different network and the operation GET /v1/accounts will be called as http://localhost:9898/forward/payment-gateway/v1/accounts.

The URL structure is as follows:

URL Structure

Configuring simulation scenarios

You may either configure simulation scenarios through the UI or by sending a POST request to the Network Simulator API.

Network Simulator UI

Building and Running

Prerequisites

  • Docker: Ensure you have Docker installed on your machine. You can download it from here.
  • PostgreSQL Database: The application requires a PostgreSQL database. You can either set up a local PostgreSQL instance or use a Docker container.

Running the Application

There are two main ways to run the application:

  1. Running from the command line
  2. Running with Docker Compose

The application supports using a PostgreSQL database or an in-memory H2 database.

The application is internally exposed on port 9898.

Running command line

docker run \
--name network-simulator-app \
-p 9898:9898 \
patrickfust/network-simulator:latest

Environment variables:

Variable NameDescriptionDefault Value
SPRING_PROFILES_ACTIVESpring profile to use (e.g., docker, local-postgres, h2)h2
JDBC_URLJDBC URL for PostgreSQL database connectionjdbc:postgresql://db:5432/network_simulator
JDBC_USERNAMEUsername for PostgreSQL database connectionnetwork_simulator_user
JDBC_PASSWORDPassword for PostgreSQL database connectionnetwork_simulator_password
DDL_AUTOHibernate DDL auto configuration (update, create, etc.)update
SHOW_SQLShow SQL statements in logs (true or false)false
CHUNK_SIZEChunk size for throttling simulation in bytes100
NETWORK_SIMULATOR_CONFIGURATIONJSON string for initial configuration of the network simulatornull

Example for local PostgreSQL

This is how you would run the application with a local PostgreSQL database and a chunk size of 1024 bytes:

docker run \
--name network-simulator-app \
-p 9898:9898 \
--env SPRING_PROFILES_ACTIVE=docker \
--env JDBC_URL=jdbc:postgresql://host.docker.internal:5532/network_simulator \
--env JDBC_USERNAME=network_simulator_user \
--env JDBC_PASSWORD=network_simulator_password \
--env CHUNK_SIZE=1024 \
patrickfust/network-simulator:latest

Running with Docker Compose

To run the application using Docker Compose, use the following command in the root directory of this project:

docker compose up

Building the Application

If you want to build the Docker image yourself, you can use the following command:

docker build -t patrickfust/network-simulator:latest .

Sequence diagrams

These are sequence diagrams illustrating the request and response flow with and without configured simulation scenarios. They are examples, and you can adapt them to your specific use cases.

Default behavior (no simulation)

If no scenarios are configured, the application simply forwards requests and responses between the client and the target service.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response
Loading

Configured simulation scenario with latency

When a simulation scenario is configured, the application applies the specified network conditions to the requests and responses. In this case, we illustrate a scenario with added latency.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator ->> Network Simulator: Apply latency simulation (just sleeping)
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response 
Loading

Configured simulation scenario with defined HTTP status code

In this case, we illustrate a scenario where we have specified a specific response code. You may also specify the response body if desired.

In this case, the target service is not called at all, but we simulate the response directly.

This could be useful for testing how your application handles different error codes from the third-party service, like 404 Not Found, 429 Too many requests or 500 Internal Server Error.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator-->>Your Application: Return response with defined HTTP status code (and response body) 
Loading

Features

Core Functionality

  • Network Simulation Proxy: The application acts as a proxy that can simulate various network conditions:
    • Latency simulation (delay in network responses)
    • Bandwidth limitations (throttling network speed)
    • Different HTTP status codes (200, 404, 500, etc.)
    • Packet loss simulation (random packet dropping) 1
  • User-Friendly Interface: Provides an intuitive dashboard to configure and manage simulation scenarios
  • Configuration Management: Support for saving and loading different scenario configurations 1
  • Backend Service: Handles actual simulation logic with RESTful APIs

Technical Specifications

Backend

  • Technology Stack: Java 25 with Spring Boot 4 framework
  • Database: PostgreSQL for storing scenario configurations and logs
  • APIs: RESTful services exposed for frontend interaction
  • Configuration Path: All configurations handled under path /api/
  • Proxy Behavior: Everything after the path /forward/{systemName} are proxied to target service with applied simulation scenarios

Read more about the backend and how it works here

Frontend

  • Technology: Angular 21
  • Communication: RESTful APIs for backend interaction
  • Dashboard: Provides user interface for scenario management

Read more about the frontend and how it works here

Bruno

If you haven't cloned the network-simulator git repository, you can do so by clicking the button below.

Fetch in Bruno

The Bruno collections are located in the bruno folder.

Generating Bruno collections

If you want to generate the Bruno collections yourself, you can do so from the OpenAPI specification.

  1. Install Bruno CLI
  2. Start by downloading the OpenAPI specification from http://localhost:9898/v3/api-docs and save it as network-simulator.json
  3. Run the following command to import the OpenAPI specification and generate the Bruno collection: bru import openapi --source network-simulator.json --output=bruno/network-simulator

Demo - Test Containers

You can use Test Containers to run integration tests using the network simulator application.

In the folder demo you can find a simple demo project that shows how to do use Network Simulator in your tests.

Footnotes

  1. Feature is planned but not yet implemented. 2

About

Proxy that can simulate different network scenarios

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Network Simulator

Network Simulator logo

Introduction

How does your application handle different network scenarios?

If your application calls out into the big world, you might want to know how it handles difference network scenarios.

How does it handle latency? What happens if the third-party service is down? How does it react to different HTTP status codes?

This application is designed to simulate various network conditions by acting as a proxy between clients and target services. It allows users to configure scenarios such as latency, bandwidth limitations, HTTP status codes, and responses. The application provides a user-friendly interface for configuring these scenarios.

It is useful for testing how applications behave under different network conditions, helping developers and testers to ensure robustness and reliability.

The idea is, that you only have to change the target URL of your application to point to this network simulator, and then configure the desired network conditions through the provided UI.

Use case

You have an application that relies on a third-party service. You want to test how your application behaves when the third-party service is slow, returns errors, or has limited bandwidth.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
third(Third-party service)
end
yourApp --> third
Loading

Network Simulator as proxy

By using this network simulation application as a proxy, you can simulate these conditions without modifying your application or the third-party service. You simply insert the network simulator as a proxy between your application and the third-party service.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
networkSim(Network Simulator)
third(Third-party service)
end
yourApp --> networkSim
networkSim --> third
style networkSim stroke-width:3px
Loading

How to use Network Simulator

Let's say you have an application that calls a third-party service at the URL: https://payment-gateway.com/. The payment gateway has an OpenAPI specification, where you have generated a client for it.

It has an operation to list accounts on: GET /v1/accounts.

You therefore have set a baseURL for you client to https://payment-gateway.com and the client can then call the operation with the full URL: https://payment-gateway.com/v1/accounts.

URL Structure for calling through Network Simulator

To use the Network Simulator, you first need to define a target system in the Network Simulator UI. You can name it payment-gateway and set the target URL to https://payment-gateway.com.

You must then change the baseURL of your client to point to the Network Simulator instead.

Assuming the Network Simulator is running locally on port 9898, you would set the baseURL to http://localhost:9898/forward/payment-gateway.

So, by setting your client's baseURL to http://localhost:9898/forward/payment-gateway, all requests to the payment gateway will now go through the Network Simulator. You can then configure different network and the operation GET /v1/accounts will be called as http://localhost:9898/forward/payment-gateway/v1/accounts.

The URL structure is as follows:

URL Structure

Configuring simulation scenarios

You may either configure simulation scenarios through the UI or by sending a POST request to the Network Simulator API.

Network Simulator UI

Building and Running

Prerequisites

  • Docker: Ensure you have Docker installed on your machine. You can download it from here.
  • PostgreSQL Database: The application requires a PostgreSQL database. You can either set up a local PostgreSQL instance or use a Docker container.

Running the Application

There are two main ways to run the application:

  1. Running from the command line
  2. Running with Docker Compose

The application supports using a PostgreSQL database or an in-memory H2 database.

The application is internally exposed on port 9898.

Running command line

docker run \
--name network-simulator-app \
-p 9898:9898 \
patrickfust/network-simulator:latest

Environment variables:

Variable NameDescriptionDefault Value
SPRING_PROFILES_ACTIVESpring profile to use (e.g., docker, local-postgres, h2)h2
JDBC_URLJDBC URL for PostgreSQL database connectionjdbc:postgresql://db:5432/network_simulator
JDBC_USERNAMEUsername for PostgreSQL database connectionnetwork_simulator_user
JDBC_PASSWORDPassword for PostgreSQL database connectionnetwork_simulator_password
DDL_AUTOHibernate DDL auto configuration (update, create, etc.)update
SHOW_SQLShow SQL statements in logs (true or false)false
CHUNK_SIZEChunk size for throttling simulation in bytes100
NETWORK_SIMULATOR_CONFIGURATIONJSON string for initial configuration of the network simulatornull

Example for local PostgreSQL

This is how you would run the application with a local PostgreSQL database and a chunk size of 1024 bytes:

docker run \
--name network-simulator-app \
-p 9898:9898 \
--env SPRING_PROFILES_ACTIVE=docker \
--env JDBC_URL=jdbc:postgresql://host.docker.internal:5532/network_simulator \
--env JDBC_USERNAME=network_simulator_user \
--env JDBC_PASSWORD=network_simulator_password \
--env CHUNK_SIZE=1024 \
patrickfust/network-simulator:latest

Running with Docker Compose

To run the application using Docker Compose, use the following command in the root directory of this project:

docker compose up

Building the Application

If you want to build the Docker image yourself, you can use the following command:

docker build -t patrickfust/network-simulator:latest .

Sequence diagrams

These are sequence diagrams illustrating the request and response flow with and without configured simulation scenarios. They are examples, and you can adapt them to your specific use cases.

Default behavior (no simulation)

If no scenarios are configured, the application simply forwards requests and responses between the client and the target service.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response
Loading

Configured simulation scenario with latency

When a simulation scenario is configured, the application applies the specified network conditions to the requests and responses. In this case, we illustrate a scenario with added latency.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator ->> Network Simulator: Apply latency simulation (just sleeping)
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response 
Loading

Configured simulation scenario with defined HTTP status code

In this case, we illustrate a scenario where we have specified a specific response code. You may also specify the response body if desired.

In this case, the target service is not called at all, but we simulate the response directly.

This could be useful for testing how your application handles different error codes from the third-party service, like 404 Not Found, 429 Too many requests or 500 Internal Server Error.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator-->>Your Application: Return response with defined HTTP status code (and response body) 
Loading

Features

Core Functionality

  • Network Simulation Proxy: The application acts as a proxy that can simulate various network conditions:
    • Latency simulation (delay in network responses)
    • Bandwidth limitations (throttling network speed)
    • Different HTTP status codes (200, 404, 500, etc.)
    • Packet loss simulation (random packet dropping) 1
  • User-Friendly Interface: Provides an intuitive dashboard to configure and manage simulation scenarios
  • Configuration Management: Support for saving and loading different scenario configurations 1
  • Backend Service: Handles actual simulation logic with RESTful APIs

Technical Specifications

Backend

  • Technology Stack: Java 25 with Spring Boot 4 framework
  • Database: PostgreSQL for storing scenario configurations and logs
  • APIs: RESTful services exposed for frontend interaction
  • Configuration Path: All configurations handled under path /api/
  • Proxy Behavior: Everything after the path /forward/{systemName} are proxied to target service with applied simulation scenarios

Read more about the backend and how it works here

Frontend

  • Technology: Angular 21
  • Communication: RESTful APIs for backend interaction
  • Dashboard: Provides user interface for scenario management

Read more about the frontend and how it works here

Bruno

If you haven't cloned the network-simulator git repository, you can do so by clicking the button below.

Fetch in Bruno

The Bruno collections are located in the bruno folder.

Generating Bruno collections

If you want to generate the Bruno collections yourself, you can do so from the OpenAPI specification.

  1. Install Bruno CLI
  2. Start by downloading the OpenAPI specification from http://localhost:9898/v3/api-docs and save it as network-simulator.json
  3. Run the following command to import the OpenAPI specification and generate the Bruno collection: bru import openapi --source network-simulator.json --output=bruno/network-simulator

Demo - Test Containers

You can use Test Containers to run integration tests using the network simulator application.

In the folder demo you can find a simple demo project that shows how to do use Network Simulator in your tests.

Footnotes

  1. Feature is planned but not yet implemented. 2

About

Proxy that can simulate different network scenarios

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Network Simulator

Network Simulator logo

Introduction

How does your application handle different network scenarios?

If your application calls out into the big world, you might want to know how it handles difference network scenarios.

How does it handle latency? What happens if the third-party service is down? How does it react to different HTTP status codes?

This application is designed to simulate various network conditions by acting as a proxy between clients and target services. It allows users to configure scenarios such as latency, bandwidth limitations, HTTP status codes, and responses. The application provides a user-friendly interface for configuring these scenarios.

It is useful for testing how applications behave under different network conditions, helping developers and testers to ensure robustness and reliability.

The idea is, that you only have to change the target URL of your application to point to this network simulator, and then configure the desired network conditions through the provided UI.

Use case

You have an application that relies on a third-party service. You want to test how your application behaves when the third-party service is slow, returns errors, or has limited bandwidth.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
third(Third-party service)
end
yourApp --> third
Loading

Network Simulator as proxy

By using this network simulation application as a proxy, you can simulate these conditions without modifying your application or the third-party service. You simply insert the network simulator as a proxy between your application and the third-party service.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
networkSim(Network Simulator)
third(Third-party service)
end
yourApp --> networkSim
networkSim --> third
style networkSim stroke-width:3px
Loading

How to use Network Simulator

Let's say you have an application that calls a third-party service at the URL: https://payment-gateway.com/. The payment gateway has an OpenAPI specification, where you have generated a client for it.

It has an operation to list accounts on: GET /v1/accounts.

You therefore have set a baseURL for you client to https://payment-gateway.com and the client can then call the operation with the full URL: https://payment-gateway.com/v1/accounts.

URL Structure for calling through Network Simulator

To use the Network Simulator, you first need to define a target system in the Network Simulator UI. You can name it payment-gateway and set the target URL to https://payment-gateway.com.

You must then change the baseURL of your client to point to the Network Simulator instead.

Assuming the Network Simulator is running locally on port 9898, you would set the baseURL to http://localhost:9898/forward/payment-gateway.

So, by setting your client's baseURL to http://localhost:9898/forward/payment-gateway, all requests to the payment gateway will now go through the Network Simulator. You can then configure different network and the operation GET /v1/accounts will be called as http://localhost:9898/forward/payment-gateway/v1/accounts.

The URL structure is as follows:

URL Structure

Configuring simulation scenarios

You may either configure simulation scenarios through the UI or by sending a POST request to the Network Simulator API.

Network Simulator UI

Building and Running

Prerequisites

  • Docker: Ensure you have Docker installed on your machine. You can download it from here.
  • PostgreSQL Database: The application requires a PostgreSQL database. You can either set up a local PostgreSQL instance or use a Docker container.

Running the Application

There are two main ways to run the application:

  1. Running from the command line
  2. Running with Docker Compose

The application supports using a PostgreSQL database or an in-memory H2 database.

The application is internally exposed on port 9898.

Running command line

docker run \
--name network-simulator-app \
-p 9898:9898 \
patrickfust/network-simulator:latest

Environment variables:

Variable NameDescriptionDefault Value
SPRING_PROFILES_ACTIVESpring profile to use (e.g., docker, local-postgres, h2)h2
JDBC_URLJDBC URL for PostgreSQL database connectionjdbc:postgresql://db:5432/network_simulator
JDBC_USERNAMEUsername for PostgreSQL database connectionnetwork_simulator_user
JDBC_PASSWORDPassword for PostgreSQL database connectionnetwork_simulator_password
DDL_AUTOHibernate DDL auto configuration (update, create, etc.)update
SHOW_SQLShow SQL statements in logs (true or false)false
CHUNK_SIZEChunk size for throttling simulation in bytes100
NETWORK_SIMULATOR_CONFIGURATIONJSON string for initial configuration of the network simulatornull

Example for local PostgreSQL

This is how you would run the application with a local PostgreSQL database and a chunk size of 1024 bytes:

docker run \
--name network-simulator-app \
-p 9898:9898 \
--env SPRING_PROFILES_ACTIVE=docker \
--env JDBC_URL=jdbc:postgresql://host.docker.internal:5532/network_simulator \
--env JDBC_USERNAME=network_simulator_user \
--env JDBC_PASSWORD=network_simulator_password \
--env CHUNK_SIZE=1024 \
patrickfust/network-simulator:latest

Running with Docker Compose

To run the application using Docker Compose, use the following command in the root directory of this project:

docker compose up

Building the Application

If you want to build the Docker image yourself, you can use the following command:

docker build -t patrickfust/network-simulator:latest .

Sequence diagrams

These are sequence diagrams illustrating the request and response flow with and without configured simulation scenarios. They are examples, and you can adapt them to your specific use cases.

Default behavior (no simulation)

If no scenarios are configured, the application simply forwards requests and responses between the client and the target service.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response
Loading

Configured simulation scenario with latency

When a simulation scenario is configured, the application applies the specified network conditions to the requests and responses. In this case, we illustrate a scenario with added latency.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator ->> Network Simulator: Apply latency simulation (just sleeping)
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response 
Loading

Configured simulation scenario with defined HTTP status code

In this case, we illustrate a scenario where we have specified a specific response code. You may also specify the response body if desired.

In this case, the target service is not called at all, but we simulate the response directly.

This could be useful for testing how your application handles different error codes from the third-party service, like 404 Not Found, 429 Too many requests or 500 Internal Server Error.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator-->>Your Application: Return response with defined HTTP status code (and response body) 
Loading

Features

Core Functionality

  • Network Simulation Proxy: The application acts as a proxy that can simulate various network conditions:
    • Latency simulation (delay in network responses)
    • Bandwidth limitations (throttling network speed)
    • Different HTTP status codes (200, 404, 500, etc.)
    • Packet loss simulation (random packet dropping) 1
  • User-Friendly Interface: Provides an intuitive dashboard to configure and manage simulation scenarios
  • Configuration Management: Support for saving and loading different scenario configurations 1
  • Backend Service: Handles actual simulation logic with RESTful APIs

Technical Specifications

Backend

  • Technology Stack: Java 25 with Spring Boot 4 framework
  • Database: PostgreSQL for storing scenario configurations and logs
  • APIs: RESTful services exposed for frontend interaction
  • Configuration Path: All configurations handled under path /api/
  • Proxy Behavior: Everything after the path /forward/{systemName} are proxied to target service with applied simulation scenarios

Read more about the backend and how it works here

Frontend

  • Technology: Angular 21
  • Communication: RESTful APIs for backend interaction
  • Dashboard: Provides user interface for scenario management

Read more about the frontend and how it works here

Bruno

If you haven't cloned the network-simulator git repository, you can do so by clicking the button below.

Fetch in Bruno

The Bruno collections are located in the bruno folder.

Generating Bruno collections

If you want to generate the Bruno collections yourself, you can do so from the OpenAPI specification.

  1. Install Bruno CLI
  2. Start by downloading the OpenAPI specification from http://localhost:9898/v3/api-docs and save it as network-simulator.json
  3. Run the following command to import the OpenAPI specification and generate the Bruno collection: bru import openapi --source network-simulator.json --output=bruno/network-simulator

Demo - Test Containers

You can use Test Containers to run integration tests using the network simulator application.

In the folder demo you can find a simple demo project that shows how to do use Network Simulator in your tests.

Footnotes

  1. Feature is planned but not yet implemented. 2

About

Proxy that can simulate different network scenarios

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Network Simulator

Network Simulator logo

Introduction

How does your application handle different network scenarios?

If your application calls out into the big world, you might want to know how it handles difference network scenarios.

How does it handle latency? What happens if the third-party service is down? How does it react to different HTTP status codes?

This application is designed to simulate various network conditions by acting as a proxy between clients and target services. It allows users to configure scenarios such as latency, bandwidth limitations, HTTP status codes, and responses. The application provides a user-friendly interface for configuring these scenarios.

It is useful for testing how applications behave under different network conditions, helping developers and testers to ensure robustness and reliability.

The idea is, that you only have to change the target URL of your application to point to this network simulator, and then configure the desired network conditions through the provided UI.

Use case

You have an application that relies on a third-party service. You want to test how your application behaves when the third-party service is slow, returns errors, or has limited bandwidth.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
third(Third-party service)
end
yourApp --> third
Loading

Network Simulator as proxy

By using this network simulation application as a proxy, you can simulate these conditions without modifying your application or the third-party service. You simply insert the network simulator as a proxy between your application and the third-party service.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
networkSim(Network Simulator)
third(Third-party service)
end
yourApp --> networkSim
networkSim --> third
style networkSim stroke-width:3px
Loading

How to use Network Simulator

Let's say you have an application that calls a third-party service at the URL: https://payment-gateway.com/. The payment gateway has an OpenAPI specification, where you have generated a client for it.

It has an operation to list accounts on: GET /v1/accounts.

You therefore have set a baseURL for you client to https://payment-gateway.com and the client can then call the operation with the full URL: https://payment-gateway.com/v1/accounts.

URL Structure for calling through Network Simulator

To use the Network Simulator, you first need to define a target system in the Network Simulator UI. You can name it payment-gateway and set the target URL to https://payment-gateway.com.

You must then change the baseURL of your client to point to the Network Simulator instead.

Assuming the Network Simulator is running locally on port 9898, you would set the baseURL to http://localhost:9898/forward/payment-gateway.

So, by setting your client's baseURL to http://localhost:9898/forward/payment-gateway, all requests to the payment gateway will now go through the Network Simulator. You can then configure different network and the operation GET /v1/accounts will be called as http://localhost:9898/forward/payment-gateway/v1/accounts.

The URL structure is as follows:

URL Structure

Configuring simulation scenarios

You may either configure simulation scenarios through the UI or by sending a POST request to the Network Simulator API.

Network Simulator UI

Building and Running

Prerequisites

  • Docker: Ensure you have Docker installed on your machine. You can download it from here.
  • PostgreSQL Database: The application requires a PostgreSQL database. You can either set up a local PostgreSQL instance or use a Docker container.

Running the Application

There are two main ways to run the application:

  1. Running from the command line
  2. Running with Docker Compose

The application supports using a PostgreSQL database or an in-memory H2 database.

The application is internally exposed on port 9898.

Running command line

docker run \
--name network-simulator-app \
-p 9898:9898 \
patrickfust/network-simulator:latest

Environment variables:

Variable NameDescriptionDefault Value
SPRING_PROFILES_ACTIVESpring profile to use (e.g., docker, local-postgres, h2)h2
JDBC_URLJDBC URL for PostgreSQL database connectionjdbc:postgresql://db:5432/network_simulator
JDBC_USERNAMEUsername for PostgreSQL database connectionnetwork_simulator_user
JDBC_PASSWORDPassword for PostgreSQL database connectionnetwork_simulator_password
DDL_AUTOHibernate DDL auto configuration (update, create, etc.)update
SHOW_SQLShow SQL statements in logs (true or false)false
CHUNK_SIZEChunk size for throttling simulation in bytes100
NETWORK_SIMULATOR_CONFIGURATIONJSON string for initial configuration of the network simulatornull

Example for local PostgreSQL

This is how you would run the application with a local PostgreSQL database and a chunk size of 1024 bytes:

docker run \
--name network-simulator-app \
-p 9898:9898 \
--env SPRING_PROFILES_ACTIVE=docker \
--env JDBC_URL=jdbc:postgresql://host.docker.internal:5532/network_simulator \
--env JDBC_USERNAME=network_simulator_user \
--env JDBC_PASSWORD=network_simulator_password \
--env CHUNK_SIZE=1024 \
patrickfust/network-simulator:latest

Running with Docker Compose

To run the application using Docker Compose, use the following command in the root directory of this project:

docker compose up

Building the Application

If you want to build the Docker image yourself, you can use the following command:

docker build -t patrickfust/network-simulator:latest .

Sequence diagrams

These are sequence diagrams illustrating the request and response flow with and without configured simulation scenarios. They are examples, and you can adapt them to your specific use cases.

Default behavior (no simulation)

If no scenarios are configured, the application simply forwards requests and responses between the client and the target service.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response
Loading

Configured simulation scenario with latency

When a simulation scenario is configured, the application applies the specified network conditions to the requests and responses. In this case, we illustrate a scenario with added latency.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator ->> Network Simulator: Apply latency simulation (just sleeping)
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response 
Loading

Configured simulation scenario with defined HTTP status code

In this case, we illustrate a scenario where we have specified a specific response code. You may also specify the response body if desired.

In this case, the target service is not called at all, but we simulate the response directly.

This could be useful for testing how your application handles different error codes from the third-party service, like 404 Not Found, 429 Too many requests or 500 Internal Server Error.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator-->>Your Application: Return response with defined HTTP status code (and response body) 
Loading

Features

Core Functionality

  • Network Simulation Proxy: The application acts as a proxy that can simulate various network conditions:
    • Latency simulation (delay in network responses)
    • Bandwidth limitations (throttling network speed)
    • Different HTTP status codes (200, 404, 500, etc.)
    • Packet loss simulation (random packet dropping) 1
  • User-Friendly Interface: Provides an intuitive dashboard to configure and manage simulation scenarios
  • Configuration Management: Support for saving and loading different scenario configurations 1
  • Backend Service: Handles actual simulation logic with RESTful APIs

Technical Specifications

Backend

  • Technology Stack: Java 25 with Spring Boot 4 framework
  • Database: PostgreSQL for storing scenario configurations and logs
  • APIs: RESTful services exposed for frontend interaction
  • Configuration Path: All configurations handled under path /api/
  • Proxy Behavior: Everything after the path /forward/{systemName} are proxied to target service with applied simulation scenarios

Read more about the backend and how it works here

Frontend

  • Technology: Angular 21
  • Communication: RESTful APIs for backend interaction
  • Dashboard: Provides user interface for scenario management

Read more about the frontend and how it works here

Bruno

If you haven't cloned the network-simulator git repository, you can do so by clicking the button below.

Fetch in Bruno

The Bruno collections are located in the bruno folder.

Generating Bruno collections

If you want to generate the Bruno collections yourself, you can do so from the OpenAPI specification.

  1. Install Bruno CLI
  2. Start by downloading the OpenAPI specification from http://localhost:9898/v3/api-docs and save it as network-simulator.json
  3. Run the following command to import the OpenAPI specification and generate the Bruno collection: bru import openapi --source network-simulator.json --output=bruno/network-simulator

Demo - Test Containers

You can use Test Containers to run integration tests using the network simulator application.

In the folder demo you can find a simple demo project that shows how to do use Network Simulator in your tests.

Footnotes

  1. Feature is planned but not yet implemented. 2

About

Proxy that can simulate different network scenarios

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Network Simulator

Network Simulator logo

Introduction

How does your application handle different network scenarios?

If your application calls out into the big world, you might want to know how it handles difference network scenarios.

How does it handle latency? What happens if the third-party service is down? How does it react to different HTTP status codes?

This application is designed to simulate various network conditions by acting as a proxy between clients and target services. It allows users to configure scenarios such as latency, bandwidth limitations, HTTP status codes, and responses. The application provides a user-friendly interface for configuring these scenarios.

It is useful for testing how applications behave under different network conditions, helping developers and testers to ensure robustness and reliability.

The idea is, that you only have to change the target URL of your application to point to this network simulator, and then configure the desired network conditions through the provided UI.

Use case

You have an application that relies on a third-party service. You want to test how your application behaves when the third-party service is slow, returns errors, or has limited bandwidth.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
third(Third-party service)
end
yourApp --> third
Loading

Network Simulator as proxy

By using this network simulation application as a proxy, you can simulate these conditions without modifying your application or the third-party service. You simply insert the network simulator as a proxy between your application and the third-party service.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
networkSim(Network Simulator)
third(Third-party service)
end
yourApp --> networkSim
networkSim --> third
style networkSim stroke-width:3px
Loading

How to use Network Simulator

Let's say you have an application that calls a third-party service at the URL: https://payment-gateway.com/. The payment gateway has an OpenAPI specification, where you have generated a client for it.

It has an operation to list accounts on: GET /v1/accounts.

You therefore have set a baseURL for you client to https://payment-gateway.com and the client can then call the operation with the full URL: https://payment-gateway.com/v1/accounts.

URL Structure for calling through Network Simulator

To use the Network Simulator, you first need to define a target system in the Network Simulator UI. You can name it payment-gateway and set the target URL to https://payment-gateway.com.

You must then change the baseURL of your client to point to the Network Simulator instead.

Assuming the Network Simulator is running locally on port 9898, you would set the baseURL to http://localhost:9898/forward/payment-gateway.

So, by setting your client's baseURL to http://localhost:9898/forward/payment-gateway, all requests to the payment gateway will now go through the Network Simulator. You can then configure different network and the operation GET /v1/accounts will be called as http://localhost:9898/forward/payment-gateway/v1/accounts.

The URL structure is as follows:

URL Structure

Configuring simulation scenarios

You may either configure simulation scenarios through the UI or by sending a POST request to the Network Simulator API.

Network Simulator UI

Building and Running

Prerequisites

  • Docker: Ensure you have Docker installed on your machine. You can download it from here.
  • PostgreSQL Database: The application requires a PostgreSQL database. You can either set up a local PostgreSQL instance or use a Docker container.

Running the Application

There are two main ways to run the application:

  1. Running from the command line
  2. Running with Docker Compose

The application supports using a PostgreSQL database or an in-memory H2 database.

The application is internally exposed on port 9898.

Running command line

docker run \
--name network-simulator-app \
-p 9898:9898 \
patrickfust/network-simulator:latest

Environment variables:

Variable NameDescriptionDefault Value
SPRING_PROFILES_ACTIVESpring profile to use (e.g., docker, local-postgres, h2)h2
JDBC_URLJDBC URL for PostgreSQL database connectionjdbc:postgresql://db:5432/network_simulator
JDBC_USERNAMEUsername for PostgreSQL database connectionnetwork_simulator_user
JDBC_PASSWORDPassword for PostgreSQL database connectionnetwork_simulator_password
DDL_AUTOHibernate DDL auto configuration (update, create, etc.)update
SHOW_SQLShow SQL statements in logs (true or false)false
CHUNK_SIZEChunk size for throttling simulation in bytes100
NETWORK_SIMULATOR_CONFIGURATIONJSON string for initial configuration of the network simulatornull

Example for local PostgreSQL

This is how you would run the application with a local PostgreSQL database and a chunk size of 1024 bytes:

docker run \
--name network-simulator-app \
-p 9898:9898 \
--env SPRING_PROFILES_ACTIVE=docker \
--env JDBC_URL=jdbc:postgresql://host.docker.internal:5532/network_simulator \
--env JDBC_USERNAME=network_simulator_user \
--env JDBC_PASSWORD=network_simulator_password \
--env CHUNK_SIZE=1024 \
patrickfust/network-simulator:latest

Running with Docker Compose

To run the application using Docker Compose, use the following command in the root directory of this project:

docker compose up

Building the Application

If you want to build the Docker image yourself, you can use the following command:

docker build -t patrickfust/network-simulator:latest .

Sequence diagrams

These are sequence diagrams illustrating the request and response flow with and without configured simulation scenarios. They are examples, and you can adapt them to your specific use cases.

Default behavior (no simulation)

If no scenarios are configured, the application simply forwards requests and responses between the client and the target service.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response
Loading

Configured simulation scenario with latency

When a simulation scenario is configured, the application applies the specified network conditions to the requests and responses. In this case, we illustrate a scenario with added latency.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator ->> Network Simulator: Apply latency simulation (just sleeping)
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response 
Loading

Configured simulation scenario with defined HTTP status code

In this case, we illustrate a scenario where we have specified a specific response code. You may also specify the response body if desired.

In this case, the target service is not called at all, but we simulate the response directly.

This could be useful for testing how your application handles different error codes from the third-party service, like 404 Not Found, 429 Too many requests or 500 Internal Server Error.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator-->>Your Application: Return response with defined HTTP status code (and response body) 
Loading

Features

Core Functionality

  • Network Simulation Proxy: The application acts as a proxy that can simulate various network conditions:
    • Latency simulation (delay in network responses)
    • Bandwidth limitations (throttling network speed)
    • Different HTTP status codes (200, 404, 500, etc.)
    • Packet loss simulation (random packet dropping) 1
  • User-Friendly Interface: Provides an intuitive dashboard to configure and manage simulation scenarios
  • Configuration Management: Support for saving and loading different scenario configurations 1
  • Backend Service: Handles actual simulation logic with RESTful APIs

Technical Specifications

Backend

  • Technology Stack: Java 25 with Spring Boot 4 framework
  • Database: PostgreSQL for storing scenario configurations and logs
  • APIs: RESTful services exposed for frontend interaction
  • Configuration Path: All configurations handled under path /api/
  • Proxy Behavior: Everything after the path /forward/{systemName} are proxied to target service with applied simulation scenarios

Read more about the backend and how it works here

Frontend

  • Technology: Angular 21
  • Communication: RESTful APIs for backend interaction
  • Dashboard: Provides user interface for scenario management

Read more about the frontend and how it works here

Bruno

If you haven't cloned the network-simulator git repository, you can do so by clicking the button below.

Fetch in Bruno

The Bruno collections are located in the bruno folder.

Generating Bruno collections

If you want to generate the Bruno collections yourself, you can do so from the OpenAPI specification.

  1. Install Bruno CLI
  2. Start by downloading the OpenAPI specification from http://localhost:9898/v3/api-docs and save it as network-simulator.json
  3. Run the following command to import the OpenAPI specification and generate the Bruno collection: bru import openapi --source network-simulator.json --output=bruno/network-simulator

Demo - Test Containers

You can use Test Containers to run integration tests using the network simulator application.

In the folder demo you can find a simple demo project that shows how to do use Network Simulator in your tests.

Footnotes

  1. Feature is planned but not yet implemented. 2

About

Proxy that can simulate different network scenarios

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Network Simulator

Network Simulator logo

Introduction

How does your application handle different network scenarios?

If your application calls out into the big world, you might want to know how it handles difference network scenarios.

How does it handle latency? What happens if the third-party service is down? How does it react to different HTTP status codes?

This application is designed to simulate various network conditions by acting as a proxy between clients and target services. It allows users to configure scenarios such as latency, bandwidth limitations, HTTP status codes, and responses. The application provides a user-friendly interface for configuring these scenarios.

It is useful for testing how applications behave under different network conditions, helping developers and testers to ensure robustness and reliability.

The idea is, that you only have to change the target URL of your application to point to this network simulator, and then configure the desired network conditions through the provided UI.

Use case

You have an application that relies on a third-party service. You want to test how your application behaves when the third-party service is slow, returns errors, or has limited bandwidth.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
third(Third-party service)
end
yourApp --> third
Loading

Network Simulator as proxy

By using this network simulation application as a proxy, you can simulate these conditions without modifying your application or the third-party service. You simply insert the network simulator as a proxy between your application and the third-party service.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
networkSim(Network Simulator)
third(Third-party service)
end
yourApp --> networkSim
networkSim --> third
style networkSim stroke-width:3px
Loading

How to use Network Simulator

Let's say you have an application that calls a third-party service at the URL: https://payment-gateway.com/. The payment gateway has an OpenAPI specification, where you have generated a client for it.

It has an operation to list accounts on: GET /v1/accounts.

You therefore have set a baseURL for you client to https://payment-gateway.com and the client can then call the operation with the full URL: https://payment-gateway.com/v1/accounts.

URL Structure for calling through Network Simulator

To use the Network Simulator, you first need to define a target system in the Network Simulator UI. You can name it payment-gateway and set the target URL to https://payment-gateway.com.

You must then change the baseURL of your client to point to the Network Simulator instead.

Assuming the Network Simulator is running locally on port 9898, you would set the baseURL to http://localhost:9898/forward/payment-gateway.

So, by setting your client's baseURL to http://localhost:9898/forward/payment-gateway, all requests to the payment gateway will now go through the Network Simulator. You can then configure different network and the operation GET /v1/accounts will be called as http://localhost:9898/forward/payment-gateway/v1/accounts.

The URL structure is as follows:

URL Structure

Configuring simulation scenarios

You may either configure simulation scenarios through the UI or by sending a POST request to the Network Simulator API.

Network Simulator UI

Building and Running

Prerequisites

  • Docker: Ensure you have Docker installed on your machine. You can download it from here.
  • PostgreSQL Database: The application requires a PostgreSQL database. You can either set up a local PostgreSQL instance or use a Docker container.

Running the Application

There are two main ways to run the application:

  1. Running from the command line
  2. Running with Docker Compose

The application supports using a PostgreSQL database or an in-memory H2 database.

The application is internally exposed on port 9898.

Running command line

docker run \
--name network-simulator-app \
-p 9898:9898 \
patrickfust/network-simulator:latest

Environment variables:

Variable NameDescriptionDefault Value
SPRING_PROFILES_ACTIVESpring profile to use (e.g., docker, local-postgres, h2)h2
JDBC_URLJDBC URL for PostgreSQL database connectionjdbc:postgresql://db:5432/network_simulator
JDBC_USERNAMEUsername for PostgreSQL database connectionnetwork_simulator_user
JDBC_PASSWORDPassword for PostgreSQL database connectionnetwork_simulator_password
DDL_AUTOHibernate DDL auto configuration (update, create, etc.)update
SHOW_SQLShow SQL statements in logs (true or false)false
CHUNK_SIZEChunk size for throttling simulation in bytes100
NETWORK_SIMULATOR_CONFIGURATIONJSON string for initial configuration of the network simulatornull

Example for local PostgreSQL

This is how you would run the application with a local PostgreSQL database and a chunk size of 1024 bytes:

docker run \
--name network-simulator-app \
-p 9898:9898 \
--env SPRING_PROFILES_ACTIVE=docker \
--env JDBC_URL=jdbc:postgresql://host.docker.internal:5532/network_simulator \
--env JDBC_USERNAME=network_simulator_user \
--env JDBC_PASSWORD=network_simulator_password \
--env CHUNK_SIZE=1024 \
patrickfust/network-simulator:latest

Running with Docker Compose

To run the application using Docker Compose, use the following command in the root directory of this project:

docker compose up

Building the Application

If you want to build the Docker image yourself, you can use the following command:

docker build -t patrickfust/network-simulator:latest .

Sequence diagrams

These are sequence diagrams illustrating the request and response flow with and without configured simulation scenarios. They are examples, and you can adapt them to your specific use cases.

Default behavior (no simulation)

If no scenarios are configured, the application simply forwards requests and responses between the client and the target service.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response
Loading

Configured simulation scenario with latency

When a simulation scenario is configured, the application applies the specified network conditions to the requests and responses. In this case, we illustrate a scenario with added latency.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator ->> Network Simulator: Apply latency simulation (just sleeping)
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response 
Loading

Configured simulation scenario with defined HTTP status code

In this case, we illustrate a scenario where we have specified a specific response code. You may also specify the response body if desired.

In this case, the target service is not called at all, but we simulate the response directly.

This could be useful for testing how your application handles different error codes from the third-party service, like 404 Not Found, 429 Too many requests or 500 Internal Server Error.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator-->>Your Application: Return response with defined HTTP status code (and response body) 
Loading

Features

Core Functionality

  • Network Simulation Proxy: The application acts as a proxy that can simulate various network conditions:
    • Latency simulation (delay in network responses)
    • Bandwidth limitations (throttling network speed)
    • Different HTTP status codes (200, 404, 500, etc.)
    • Packet loss simulation (random packet dropping) 1
  • User-Friendly Interface: Provides an intuitive dashboard to configure and manage simulation scenarios
  • Configuration Management: Support for saving and loading different scenario configurations 1
  • Backend Service: Handles actual simulation logic with RESTful APIs

Technical Specifications

Backend

  • Technology Stack: Java 25 with Spring Boot 4 framework
  • Database: PostgreSQL for storing scenario configurations and logs
  • APIs: RESTful services exposed for frontend interaction
  • Configuration Path: All configurations handled under path /api/
  • Proxy Behavior: Everything after the path /forward/{systemName} are proxied to target service with applied simulation scenarios

Read more about the backend and how it works here

Frontend

  • Technology: Angular 21
  • Communication: RESTful APIs for backend interaction
  • Dashboard: Provides user interface for scenario management

Read more about the frontend and how it works here

Bruno

If you haven't cloned the network-simulator git repository, you can do so by clicking the button below.

Fetch in Bruno

The Bruno collections are located in the bruno folder.

Generating Bruno collections

If you want to generate the Bruno collections yourself, you can do so from the OpenAPI specification.

  1. Install Bruno CLI
  2. Start by downloading the OpenAPI specification from http://localhost:9898/v3/api-docs and save it as network-simulator.json
  3. Run the following command to import the OpenAPI specification and generate the Bruno collection: bru import openapi --source network-simulator.json --output=bruno/network-simulator

Demo - Test Containers

You can use Test Containers to run integration tests using the network simulator application.

In the folder demo you can find a simple demo project that shows how to do use Network Simulator in your tests.

Footnotes

  1. Feature is planned but not yet implemented. 2

About

Proxy that can simulate different network scenarios

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Network Simulator

Network Simulator logo

Introduction

How does your application handle different network scenarios?

If your application calls out into the big world, you might want to know how it handles difference network scenarios.

How does it handle latency? What happens if the third-party service is down? How does it react to different HTTP status codes?

This application is designed to simulate various network conditions by acting as a proxy between clients and target services. It allows users to configure scenarios such as latency, bandwidth limitations, HTTP status codes, and responses. The application provides a user-friendly interface for configuring these scenarios.

It is useful for testing how applications behave under different network conditions, helping developers and testers to ensure robustness and reliability.

The idea is, that you only have to change the target URL of your application to point to this network simulator, and then configure the desired network conditions through the provided UI.

Use case

You have an application that relies on a third-party service. You want to test how your application behaves when the third-party service is slow, returns errors, or has limited bandwidth.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
third(Third-party service)
end
yourApp --> third
Loading

Network Simulator as proxy

By using this network simulation application as a proxy, you can simulate these conditions without modifying your application or the third-party service. You simply insert the network simulator as a proxy between your application and the third-party service.

flowchart LR
subgraph TopRow[ ]
direction LR
yourApp(Your application)
networkSim(Network Simulator)
third(Third-party service)
end
yourApp --> networkSim
networkSim --> third
style networkSim stroke-width:3px
Loading

How to use Network Simulator

Let's say you have an application that calls a third-party service at the URL: https://payment-gateway.com/. The payment gateway has an OpenAPI specification, where you have generated a client for it.

It has an operation to list accounts on: GET /v1/accounts.

You therefore have set a baseURL for you client to https://payment-gateway.com and the client can then call the operation with the full URL: https://payment-gateway.com/v1/accounts.

URL Structure for calling through Network Simulator

To use the Network Simulator, you first need to define a target system in the Network Simulator UI. You can name it payment-gateway and set the target URL to https://payment-gateway.com.

You must then change the baseURL of your client to point to the Network Simulator instead.

Assuming the Network Simulator is running locally on port 9898, you would set the baseURL to http://localhost:9898/forward/payment-gateway.

So, by setting your client's baseURL to http://localhost:9898/forward/payment-gateway, all requests to the payment gateway will now go through the Network Simulator. You can then configure different network and the operation GET /v1/accounts will be called as http://localhost:9898/forward/payment-gateway/v1/accounts.

The URL structure is as follows:

URL Structure

Configuring simulation scenarios

You may either configure simulation scenarios through the UI or by sending a POST request to the Network Simulator API.

Network Simulator UI

Building and Running

Prerequisites

  • Docker: Ensure you have Docker installed on your machine. You can download it from here.
  • PostgreSQL Database: The application requires a PostgreSQL database. You can either set up a local PostgreSQL instance or use a Docker container.

Running the Application

There are two main ways to run the application:

  1. Running from the command line
  2. Running with Docker Compose

The application supports using a PostgreSQL database or an in-memory H2 database.

The application is internally exposed on port 9898.

Running command line

docker run \
--name network-simulator-app \
-p 9898:9898 \
patrickfust/network-simulator:latest

Environment variables:

Variable NameDescriptionDefault Value
SPRING_PROFILES_ACTIVESpring profile to use (e.g., docker, local-postgres, h2)h2
JDBC_URLJDBC URL for PostgreSQL database connectionjdbc:postgresql://db:5432/network_simulator
JDBC_USERNAMEUsername for PostgreSQL database connectionnetwork_simulator_user
JDBC_PASSWORDPassword for PostgreSQL database connectionnetwork_simulator_password
DDL_AUTOHibernate DDL auto configuration (update, create, etc.)update
SHOW_SQLShow SQL statements in logs (true or false)false
CHUNK_SIZEChunk size for throttling simulation in bytes100
NETWORK_SIMULATOR_CONFIGURATIONJSON string for initial configuration of the network simulatornull

Example for local PostgreSQL

This is how you would run the application with a local PostgreSQL database and a chunk size of 1024 bytes:

docker run \
--name network-simulator-app \
-p 9898:9898 \
--env SPRING_PROFILES_ACTIVE=docker \
--env JDBC_URL=jdbc:postgresql://host.docker.internal:5532/network_simulator \
--env JDBC_USERNAME=network_simulator_user \
--env JDBC_PASSWORD=network_simulator_password \
--env CHUNK_SIZE=1024 \
patrickfust/network-simulator:latest

Running with Docker Compose

To run the application using Docker Compose, use the following command in the root directory of this project:

docker compose up

Building the Application

If you want to build the Docker image yourself, you can use the following command:

docker build -t patrickfust/network-simulator:latest .

Sequence diagrams

These are sequence diagrams illustrating the request and response flow with and without configured simulation scenarios. They are examples, and you can adapt them to your specific use cases.

Default behavior (no simulation)

If no scenarios are configured, the application simply forwards requests and responses between the client and the target service.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response
Loading

Configured simulation scenario with latency

When a simulation scenario is configured, the application applies the specified network conditions to the requests and responses. In this case, we illustrate a scenario with added latency.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator ->> Network Simulator: Apply latency simulation (just sleeping)
Network Simulator->>Third-party Service: Calls actual service
Third-party Service -->> Network Simulator: Response from service
Network Simulator-->>Your Application: Return response 
Loading

Configured simulation scenario with defined HTTP status code

In this case, we illustrate a scenario where we have specified a specific response code. You may also specify the response body if desired.

In this case, the target service is not called at all, but we simulate the response directly.

This could be useful for testing how your application handles different error codes from the third-party service, like 404 Not Found, 429 Too many requests or 500 Internal Server Error.

sequenceDiagram
participant Your Application
participant Network Simulator
participant Third-party Service
Your Application->>Network Simulator: Send requests to Network Simulator
Network Simulator-->>Your Application: Return response with defined HTTP status code (and response body) 
Loading

Features

Core Functionality

  • Network Simulation Proxy: The application acts as a proxy that can simulate various network conditions:
    • Latency simulation (delay in network responses)
    • Bandwidth limitations (throttling network speed)
    • Different HTTP status codes (200, 404, 500, etc.)
    • Packet loss simulation (random packet dropping) 1
  • User-Friendly Interface: Provides an intuitive dashboard to configure and manage simulation scenarios
  • Configuration Management: Support for saving and loading different scenario configurations 1
  • Backend Service: Handles actual simulation logic with RESTful APIs

Technical Specifications

Backend

  • Technology Stack: Java 25 with Spring Boot 4 framework
  • Database: PostgreSQL for storing scenario configurations and logs
  • APIs: RESTful services exposed for frontend interaction
  • Configuration Path: All configurations handled under path /api/
  • Proxy Behavior: Everything after the path /forward/{systemName} are proxied to target service with applied simulation scenarios

Read more about the backend and how it works here

Frontend

  • Technology: Angular 21
  • Communication: RESTful APIs for backend interaction
  • Dashboard: Provides user interface for scenario management

Read more about the frontend and how it works here

Bruno

If you haven't cloned the network-simulator git repository, you can do so by clicking the button below.

Fetch in Bruno

The Bruno collections are located in the bruno folder.

Generating Bruno collections

If you want to generate the Bruno collections yourself, you can do so from the OpenAPI specification.

  1. Install Bruno CLI
  2. Start by downloading the OpenAPI specification from http://localhost:9898/v3/api-docs and save it as network-simulator.json
  3. Run the following command to import the OpenAPI specification and generate the Bruno collection: bru import openapi --source network-simulator.json --output=bruno/network-simulator

Demo - Test Containers

You can use Test Containers to run integration tests using the network simulator application.

In the folder demo you can find a simple demo project that shows how to do use Network Simulator in your tests.

Footnotes

  1. Feature is planned but not yet implemented. 2

About

Proxy that can simulate different network scenarios

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages