File virtual service architecture

A tester or developer uses a web browser to access the console. The console manages the virtual service. The system under test (application under test) connects directly to the virtual service on different ports.

Here is an example of how that could look like for a scenario where the virtual service is replaying files.

Files architecture diagram Virtual service replaying files from a request directory to a response directory

Add/Edit mappings

Usage

First, go to Files in the top navigation bar and then click Add/Edit.

Fill in the Request/Response fields and click Save to configure a mapping.

After saving the mapping, it will appear in the list of mappings.

Clicking the edit button will allow you to edit an existing mapping.

Priority

The request priority can be set in order to set up a preference order for matching mappings.

The highest priority value is 1. If two or more mappings both match a request, the mapping with the higher priority will be used to provide the response. The default priority is 5.

This can be useful, if you want a "catch-all" mapping that returns a general response for most requests and specific mappings on top that return more specific responses.

Request file matchers

When Traffic Parrot notices a request files, it will try to simulate the system it is replacing by creating a response file in the specified directory. To decide what is the name and content of the response file, it will go through all the request to response mappings it has available to find the response file definition. For more details how request matching works, see Request matching.

There are several matchers available to match request files, depending on the attribute.

Request file name matchers
Matcher name Matcher Id Description
equal to equalTo Check that filename of the request file is equal to the one specified in the mapping
contains contains Check that the filename of the request file contains the sequence of characters specified in the mapping
matches regex matches Check that the filename of the request file matches the regexp specified in the mapping
does not match regexp doesNotMatch Check that the filename of the request file does not match the regexp specified in the mapping
Request file body (contents) matchers
Matcher name Matcher Id Description
any any Any received request file contents will match.
equal to equalTo Check that the received request file contents is equal to the request body specified in the mapping
contains contains Check that the received request file contains the sequence of characters specified in the mapping
matches regex matches Check that the received request file contents matches the regexp specified in the mapping
does not match regexp doesNotMatch Check that the received request file contents does not match the regexp specified in the mapping
equal to JSON equalToJson Check that the received request file contents is JSON and that it is equal to the request body JSON specified in the mapping
matches JSON matchesJson

Check that the received request file contents matches (allowing for special wildcard tokens) JSON specified in the mapping.

Tokens allowed:
  • {{ anyValue }} - matches any value
  • {{ anyNumber }} - matches any whole or decimal number
  • {{ anyElements }} - matches any number of sub-elements (child-nodes)
For example a "matches JSON" request body matcher:
{
  "name": "{{ anyValue }}",
  "lastName": "{{ anyValue }}",
  "age": "{{ anyNumber }}",
  "children": "{{ anyElements }}"
}
will match a request body:
{
  "name": "Bob",
  "lastName": "Smith",
  "age": 37,
  "children": [{"name": "sam"}, {"name": "mary"}]
}
matches JSONPath matchesJsonPath Check that the received request file contents is JSON and that it matches JSONPath specified in the mapping. For example, if we use the following expression as the request body matcher
$[?(@.xyz.size() == 2)]
it will match this request body:
{"xyz":[{"a":true}, {"b":false}]}
but will NOT match this one:
{"xyz":["a":true, "b":false, "c":true]}
equal to XML equalToXml Check that the received request file contents is XML and that it is equal to the request body XML specified in the mapping
matches XML matchesXml

Check that the received request file contents matches (allowing for special wildcard tokens) XML specified in the mapping.

Tokens allowed:
  • {{ anyValue }} - matches any value
  • {{ anyNumber }} - matches any whole or decimal number
  • <tp:AnyElements/> - matches any number of sub-elements (child-nodes)
For example a matches XML request body matcher:
<example>
  <name>{{ anyValue }}</name>
  <age>{{ anyNumber }}</age>
  <children><tp:AnyElements/></children>
</example>
will match a request body:
<example>
  <name>Sam</name>
  <age>29</age>
  <children><child name="bob"/></children>
</example>
matches XPath matchesXPath Check that the received request file contents is XML and that it matches XPath specified in the mapping. For example, if we use the following expression as the request body matcher
/xyz[count(abc) = 2]
it will match this request body:
<xyz><abc/><abc/></xyz>
but will NOT match this one:
<xyz><abc/></xyz>

Configuration

Define root directories

To record from or replay to file systems you will need to tell Traffic Parrot which root directories to use.

Those root directories are displayed in the dropdown menus on the record and replay panels, for example: Root directories dropdown screenshot

All directories that are configured when e.g. adding a mapping are relative to the selected root directory.

To define a new root directories that will be available in the dropdown in the record and replay panels:
  1. Open root-directories.json file located in the main Traffic Parrot directory, using your favourite text editor
  2. Add the new root directories (make sure the id field has a unique value!). An example content of the file, with 2 root directories defined:
    [
      {
        "id": "1",
        "name": "C Drive",
        "rootDirectory": "C:\\some\\root\\directory"
      },
      {
        "id": "2",
        "name": "Network Drive",
        "rootDirectory": "\\network\\share"
      }
    ]
  3. Note that the \ character must be escaped as \\
  4. Save the file
  5. Refresh the page in Traffic Parrot to reload the dropdown list.

In the current Traffic Parrot version you edit root directories directly in the root-directories.json file. In near future you will be able to do it via the Web UI as well.

Change the location of root-directories.json
If you would like to change the location of the root-directories.json file, change the value of property
trafficparrot.virtualservice.rootDirectoriesUrl=classpath:root-directories.json
to for example
trafficparrot.virtualservice.rootDirectoriesUrl=file:/home/john/git/project/root-directories.json
This can be useful if you would like to version control it with your application source code.

Proof of concept with on-premises installation at a large enterprise

See proof of concept in the user guide.

Dynamic responses and custom extensions