Features and capabilities

Does Traffic Parrot accommodate SOAP requests?


Does Traffic Parrot run on a server?


We pride ourselves that you can run our software almost anywhere. It can be a server, laptop, docker or VM. The tool is very lightweight, so it can be run on existing hardware or VMs as well, no need to order new server VMs. You do need to install or use any thick-client software (workstation) on your laptops; you use a web browser instead.

Does Traffic Parrot support HTTP/2 (HTTP2)?

Not yet directly. Currently only via gRPC.

gRPC leverages HTTP/2 underneath and benefits from many of the efficiencies of HTTP/2. Traffic Parrot supports gRPC. Traffic Parrot does not support HTTP/2 directly yet, please reach out to us to have a look at the HTTP/2 beta version.

Can I simulate error messages?


We focus on providing a tool for in-depth exploratory testing. We simulate common error messages as well as very specialized ones like slow dripping connections that can take down your application (depending on your environment). As far as we know, no other tool can simulate some of the error scenarios we simulate.

Can I create conditional response behavior?


Do you have an example scenario you would like to test? It would help us understand better how to answer your question. Please, send the details to support@trafficparrot.com.

Can I do performance, load and soak testing?


Have a look at the performance guide.

Can Traffic Parrot virtualize more than one HTTP service at the same time?

Yes! Have a look at Virtualizing identical URLs.

How can I record only specific content types or file types?

Have a look at filtering recording.

Can the automated tests run on a schedule specified from within Traffic Parrot?

No, but we work with tools in your existing environment that schedule tests.

Traffic Parrot does not run tests. We integrate with open source solutions like Selenium, Cucumber, JMeter, Postman and similar that do that. They are usually run in Jenkins or Team City, which is the industry standard. Those tools would run on a schedule with no issues. We would need to know more about your environment to understand better what problem you are trying to solve when asking this question. Please, send the details to support@trafficparrot.com.

Where is the full list of things Traffic Parrot can do?

Have a look at the Features and capabilities.

Why is Traffic Parrot start-up time slow?

There are many components started by default by Traffic Parrot. This means it typically takes around 2-20 seconds depending on hardware specs for Traffic Parrot to start up. You can speed up the startup time by disabling some of them.

How can I speed up Traffic Parrot startup?

You can do that by disabling the GUI and gRPC warmup (see how to configure Traffic Parrot):

If you need additional startup time improvements please contact support.

Does Traffic Parrot have the ability to "parameterize" the commands? Such as if a request contains today's date, I could put in a parameter to insert today’s date in that place?

Have a look at the extensions.

Does Traffic Parrot have a repository of data that I can use to make the responses "smart"?

Have a look at the loading CSV file data.

What is your the roadmap for the future? Where do you intend to take the tool in the future?

We listen to our customers wherever possible. Where do you think we should go?

If you would like more details, please email us at support@trafficparrot.com.

How much of an approximation the virtual services/environments might be?

We provide many advanced service virtualization features. Have a look at the User guide and Extensions.

Just remember, the general rule is: keep them as simple as possible, whenever possible. For more details read Focus on keeping it simple.

Can I do Fircosoft service virtualization or create Fircosoft stubs, mocks or simulators?

Yes! Have a look at the example below. It is a sample Fircosoft mapping that will copy the request id from request bytes message to the response. Download the the byte message mapping, put them in trafficparrot-x-y-z/jms-mappings directory and follow the IBM MQ tutorial to learn how to replay IBM MQ JMS messages. Contact us for more details.

  "mappingId" : "bf6abc54-dac1-4aa3-af9e-6e551ed909eb",
  "request" : {
    "destination" : {
      "name" : "REQ.QL",
      "type" : "QUEUE"
    "bodyMatcher" : {
      "matches" : "\u0001.*            E2  AG        unit                              374653764dfhfgg                                                       AccountH                                                    app               WMQIN                                                                                                                                                                                                                           \\[FIRCOSOFT     X\\] FMT V1.0 GEN CoreEngine\r\n\\[UNIT          X\\] UB\r\n\\[BUSINESS      X\\] BUSINESS\r\n\\[APPLI         X\\] UB\r\n\\[UUMID         X\\] \r\n\\[ReqMsgId       \\] 3746523dhf362635\r\n\\[MsgType        \\] AccountHandler\r\n\\[CustCode       \\] 345553322\r\n\\[Firstname      \\] Bob\r\n\\[Surname        \\] Smith\r\n\\[MiddleName     \\] John\r\n\\[MaidenName     \\] Smith\r\n\\[Nationlity     \\] Polish\r\n\\[Address1       \\] \r\n\\[Address2       \\] \r\n\\[Address3       \\] \r\n\\[Address4       \\] \r\n\\[CFIncorpPr     \\] \r\n\\[CFOriginPr     \\] Poland\r\n\\[CFCtyznsip     \\] \r\n\\[CFResidnce     \\] Poland\r\n\\[DOB            \\] 1990-07-10\r\n\\[PasprtORID     \\] AP124567890\r\n\\[CustCodeEt     \\] \r\n\\[EmplyrName     \\] \r\n\\[EmplyrAdd1     \\] \r\n\\[EmplyrAdd2     \\] \r\n\\[EmplyrAdd3     \\] \r\n\\[EmplyrAdd4     \\] \r\n\\[EmplyrAdd5     \\] \r\n\\[RegistrdNm     \\] \r\n\\[TradeName      \\] \r\n\\[RegistrdNb     \\] \r\n\\[CFIncorpEt     \\] \r\n\\[CFOriginEt     \\] \r\n\\[CFRsidncEt     \\] .*"
    "bodyType" : "PRINTABLE_CHARACTERS",
    "jmsMessageType" : "javax.jms.BytesMessage"
  "response" : {
    "destination" : {
      "name" : "RSP.QL",
      "type" : "QUEUE"
    "jmsResponseTransformerClassName" : "NO_TRANSFORMER",
    "text" : "\u0001002ROOT                                                                                                                                                                                                                                                            {{regex request.body '.?([0-9A-Za-z]+Camel-[0-9]+).*'}}            E2  AG        unit                            app       001HITS                            Stop: 6, Nonblocking: 0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         Filter Engine                                                                                   DIN20161117140172-00000-2337                                    ",
    "bodyType" : "PRINTABLE_CHARACTERS",
    "jmsMessageType" : "javax.jms.BytesMessage"


Why does Traffic Parrot not start up?

Typically this happens when Java is not installed or detected properly. You can download Java here.

If this does not solve your issue, please contact us for support.

What are the key tasks required to install/set up/configure the tool?

Have a look at the User guide and the Quick start

What are the pre-requisites for using the tool – environment requirements etc.?

Have look at the Supported platforms and the Proof of concept guide

Where is the Maven plugin?

Please see Running from Maven for the recommended solution.


How strong technically do our consultants need to be to exploit the tool for testing?

We recently had a remote WebEx engagement with a Fortune 300 company where they had tools running tests on-site in 30 minutes.

One of our main differentiators to our competition is we make our tool as easy to use as possible requiring no to minimal amounts of training.

How do we run a POC (proof of concept project)?

Licensing and price

How does your licensing work?

What is the Remote Licence Server and the Local Licence Server?

Traffic Parrot licensing server allows to monitor the number of Traffic Parrot licenses your company will is using. It tracks when an instance was turned on and turned off. You can choose to run a Traffic Parrot license server onsite (a Local License Server) or choose to use the hosted Traffic Parrot license server (a Remote License Server). Our customers typically prefer the Remote License Server as it means they do not have to manage the licensing server themselves, and we do it for them. Please find more information on the Traffic Parrot licensing server documentation page.

What is your enterprise pricing?

Traffic Parrot is priced based on the number of floating licenses and features, protocols and technologies used. Please confirm your requirements by answering the following questions and we will provide budgetary pricing. To get more details, please email sales@trafficparrot.com


How do I enable client certificate authentication?

You need to add your private key to Traffic Parrot JKS, for example:

$ cd trafficparrot-x.y.z/certificates
$ keytool -importkeystore -srckeystore /path/authclient.jks -srcalias authclient -destkeystore trafficparrot-keystore-and-truststore.jks -destalias authclient
$ keytool -keypasswd -alias authclient -keystore trafficparrot-keystore-and-truststore.jks

How do I test a certificate before importing it to Traffic Parrot?

If running on Windows download and install OpenSSL. You will also need Java 8 JDK (JDK 7 keytool will not work).

You will need the server public key (to verify the server identity) and the client private key (to authenticate on the server). Then you can test the connection with OpenSSL.

Notice: if running on Windows you get messages like “unknown option ¡key” or similar, the copy and paste from this PDF might not have worked. Retype the commands instead of copying and pasting them.

Get server public key in PEM format
To download the certificate from the server by connecting to the https port you can do the following:
$ openssl s_client -servername localhost -connect localhost:3000 2>errors.txt | openssl x509 -text > server.pem

Get client private key in PEM format
If you want are starting with a JKS not a P12 file, convert your jks to p12:
$ keytool -importkeystore -srckeystore authclient_key.jks -destkeystore authclient_key.p12 -deststoretype pkcs12
Convert p12 to pem:
$ openssl pkcs12 -in authclient_key.p12 -out authclient.key.pem -nocerts -nodes
$ openssl pkcs12 -in authclient_key.p12 -out authclient.crt.pem -clcerts -nokeys

Test the connection
Connect to the server with the key, certificate and CA file:
$ openssl s_client -key authclient.key.pem -keyform PEM -cert authclient.crt.pem -certform PEM -CAfile server.pem -connect localhost:3000



Establishing connection to IBM®MQ

If you would like to connect Traffic Parrot to a MQ broker either via native MQ interfaces or JMS you will need to provide the MQ JARs. Have a look at how to do it for JMS and native MQ.

How do I record mappings based on correlation id?

Traffic Parrot now supports matching of requests and responses by correlation id for JMS and IBM®MQ.

Find out more here.

Where can I find release notes or the change log?

How is your tools different?

How is your tool different to CA Lisa, DevTest, WireMock, Hovefly, Charles Proxy, Parasoft, etc.? See the tools comparison.

What file editor should I use to edit files?

If you do not have a favourite editor we recommend using Notepad++ on Windows, Vim on Linux or Textmate on a Mac.

How do I define custom mappings?

If you would like to define custom mappings see how to use extensions.

Why do I have to edit the extensions properties every time?

Currently, whenever you add a new custom Java or Handlebars extension, you need to update trafficparrot.properties and specify the class name. We know this is inconvenient. We have a task on the roadmap to eliminate the need to define those properties, and search for extensions automatically.

I have an issue. How do I get help?

If you have any issues or suggestions email us at support@trafficparrot.com.

How do I run more than one instance in parallel/simultaneously?

Why do I get "Caused by: java.lang.ClassNotFoundException: com.ibm.msg.client.jms.JmsFactoryFactory"?

If you see the following error in the logs you need to put MQ libs on Traffic Parrot classpath.
2017-08-12 23:48:44 WARN  qtp1995250556-40 Error for /jmsManagement/start
java.lang.NoClassDefFoundError: com/ibm/msg/client/jms/JmsFactoryFactory
	at com.trafficparrot.jms.IbmMq75ConnectionFactory.create(IbmMq75ConnectionFactory.java:25)
	at com.trafficparrot.jms.ProducerConsumerFactory.createConsumer(ProducerConsumerFactory.java:46)
	at com.trafficparrot.jms.QueueTrafficRecordService.startMessageConsumerAndProducer(QueueTrafficRecordService.java:57)
	at com.trafficparrot.jms.QueueTrafficRecordService.start(QueueTrafficRecordService.java:44)
	at com.trafficparrot.jms.JmsQueueVirtualService.startRecordingServices(JmsQueueVirtualService.java:80)
	at com.trafficparrot.jms.JmsQueueVirtualService.startRecording(JmsQueueVirtualService.java:50)
	at com.trafficparrot.jms.JmsManagementServlet.queue(JmsManagementServlet.java:388)
	at com.trafficparrot.jms.JmsManagementServlet.start(JmsManagementServlet.java:297)
	at com.trafficparrot.jms.JmsManagementServlet.post(JmsManagementServlet.java:92)
	at com.trafficparrot.jms.JmsManagementServlet.doPost(JmsManagementServlet.java:74)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
	at org.eclipse.jetty.server.Server.handle(Server.java:499)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
	at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: com.ibm.msg.client.jms.JmsFactoryFactory
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 28 more

Why do I get "java.lang.IllegalStateException: Insufficient configured threads:"?

If you see the following error in the logs you need to increase the maximum number of threads in the HTTP Jetty thread pool by changing the property trafficparrot.gui.http.queuedThreadPool.maxThreads=300
javax.servlet.ServletException: java.lang.IllegalStateException: Insufficient configured threads: required=212 < max=200 for QueuedThreadPool[qtp318353283]@12f9af83{STARTED,8<=168<=200,i=0,r=20,q=0}[ReservedThreadExecutor@71b3bc45{s=0/20,p=0}]

Why do I get "/opt/trafficparrot/jre/bin/java: cannot execute binary file: Exec format error"?

If you see the following error when starting up, please check that the distribution zip file you are using matches the operating system you are using. Note that running Docker on Mac typically counts as using a Linux OS from Docker perspective.

Distribution zip file naming convention prefixes:
  • Linux: trafficparrot-linux-x64-jre
  • Mac: trafficparrot-mac-x64-jre
  • Windows: trafficparrot-windows-x64-jre
  • No JRE: trafficparrot-no-jre
/opt/trafficparrot/functions.sh: line 29: /opt/trafficparrot/jre/bin/java: cannot execute binary file: Exec format error
/opt/trafficparrot/functions.sh: line 29: /opt/trafficparrot/jre/bin/java: No error information

Why do I get "java.net.BindException: Address already in use: bind"?

"Address already in use" means Traffic Parrot could not start a server because the address it wanted to start it on is already in use by another process, either another traffic parrot instance or a different application.

Any computer/laptop/server can have many applications communicating over a TCP network connection. Traffic Parrot is one of them. They use hostnames and port numbers as addresses. This error tells us that the TCP ports traffic parrot tried to start using, are already in use.

If you see that error in the logs here a few things to consider:
  1. Are you running two traffic parrot instances simultaneously? If so, you need to use different port numbers for the second instance. All the port numbers need to be unique.
  2. If you are not running two traffic parrot instances simultaneously, somebody else might be doing that wihtout your knowledge, or you might have not stopped another traffic parrot instance. To check if an unknown traffic parrot instance is running please run
    • On Linux in a terminal jps -v | grep trafficparrot which will list all java processes that have "trafficparrot" in its name. Then you can shut them down one by one by running kill PID_NUMBER where PID_NUMBER is the number of the process from the previous command.
    • On Windows run a Command Prompt (cmd.exe) and execute jps -v | FIND "trafficparrot" which will list all java processes that have "trafficparrot" in its name. Then you can shut them down one by one by running Taskkill /PID PID_NUMBER /F where PID_NUMBER is the number of the process from the previous command.
  3. If there are no other traffic parrot instances running, it is possible the port numbers are used by other applications on your system. For example, in the error message below you can see main FAILED ServerConnector@2805805d{HTTP/1.1}{}: java.net.BindException: Address already in use That means traffic parrot tied to use port number 8080 but it is already in use by another process. To find out which process is using that port on Linux follow these instructions, and on Windows these instructions.

    The bottom line is, you have to make sure all the ports traffic parrot uses are free before starting it. For a list of all port numbers traffic parrot uses see the trafficparrot.properties file and look for "port".
2017-09-05 15:59:17 WARN  main FAILED ServerConnector@2805805d{HTTP/1.1}{}: java.net.BindException: Address already in use
java.net.BindException: Address already in use
	at sun.nio.ch.Net.bind0(Native Method)
	at sun.nio.ch.Net.bind(Net.java:463)
	at sun.nio.ch.Net.bind(Net.java:455)
	at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
	at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
	at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:321)
	at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
	at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
	at org.eclipse.jetty.server.Server.doStart(Server.java:366)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
	at com.trafficparrot.TrafficParrotCommunityServer.startGui(TrafficParrotCommunityServer.java:327)
	at com.trafficparrot.TrafficParrotCommunityServer.start(TrafficParrotCommunityServer.java:169)
	at com.trafficparrot.TrafficParrotCommunityServer.main(TrafficParrotCommunityServer.java:82)
	at com.trafficparrot.TrafficParrotCommunityServer.main(TrafficParrotCommunityServer.java:77)

How do I record a localhost port on the Docker host?

When performing a recording using a protocol like HTTP or gRPC, if you are running Traffic Parrot in a Docker container and have a service running on your localhost that you would like to record:
  • Use host.docker.internal instead of localhost
  • If you are using Docker Compose you will need
        - "host.docker.internal:host-gateway"
Without these steps you may see errors in the logs like:
  • java.net.UnknownHostException
  • java.net.ConnectException
  • UNAVAILABLE: Unable to resolve host host.docker.internal

How do I report an issue so that is resolved fast?

To help us fix your issue as fast as we can, we need to know as much as we can about it. Here are a few things you should provide when reporting an issue:
  1. The description of what happens and the error you see
  2. Traffic Parrot version number
  3. Attach all of these files to the email
    • all *.log files from the main traffic parrot directory
    • all *.log files located in trafficparrot-x.y.z/logs directory
    • all files from mappings, __files and jms-mappings directories (provided there is no sensitive data in them)