Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

HOW TO WRITE A SHIM
===================

See document qpid-interop-test-devel-overview.txt for an overview of
Tests and Shims, and the relationship between them.

Introduction
============

Qpid Interop Test has a number of tests. Each test must call a pair of "shims"
or stand-alone test programs written in the language/API under test - one to
send test messages, and one to receive them.


Communicating with the shims
============================

Because the shims are sand-alone programs written in the test language, the
test program communicates with it by sending parameters to the shim on the
command-line, and receives information by receiving what the shim prints to
cout (and in the case of problems or errors, cerr).

The following parameters are sent to each shim:

1.   Broker address (ipaddr:port)
2.   Queue name
3.   Test keyword (this can mean different things depending on the test)
4.   JSON value list of test values to be sent (Sender) or number of test
     values to expect (Receiver)

The following are received from each shim on cout (each item on its own line):

Sender: Nothing

Receiver:
1. Test Keyword
2. JSON value list of received test values

Both sender and receiver should print any errors or exceptions to cerr, this
will automatically fail the test if present.

The test program will compare the values of the received JSNON list of test
values with that sent and pass the test if it matches. It is important for the
format of the JSON test value strings to be identical. All test values are sent
as strings, and must be sent as strings. For example, the sender may receive
the following JSON list of integer value strings to send:

["-0x80000000", "-0x1", "0x0", "0x7fffffff"]

and it is the job of the sender to convert these to appropriate integers before
sending. Similarly, the receiver must receive these integers and format them as
strings before printing them to cout as a JSON list.


Adding a shim (summary):
========================

To add a shim, it will be necessary to perform the following steps:

1. Add an empty shim framework (sends and receives no messages, but receives
   parameters from the command-line) to shims directory.
2. Add the shim to the build system so that it can be compiled (where
   necessary) and installed. Where necessary, compile the empty shim.
3. Add shim into to test program (so it can be found and included into its list
   of available shims. (See https://issues.apache.org/jira/browse/QPIDIT-58:
   Add auto-detection of shims which could change this.)
4. Modify the test data from the test program so that only a single simple test
   case is run.  (For example, in jms_messages_test, enable only the boolean
   values for the JMS_MESSAGE type.)
5. Check that the test program correctly finds the new shim and receives its
   command-line parameters.  The test will fail as no messages are being sent
   yet.  It would be useful to record the command-lines as received, so that
   while developing the test you can call the shim directly instead of through
   the test program. See note below on JSON on the command-line.
6. Write the guts of the shims. They must:
   a. Receive the command-line parameters;
   b. Connect to the broker at the specified address and queue name;
   c. It must interpret the test type and JSON string according to the test for
      which it is written and send the appropriate messages.  Note that the
      JSON string will contain only stringified test values, so the shim must
      convert these to the appropriate type before sending them as part of a
      message.
7. When the shims are working with all types / test data, then make sure it runs
   and passes correctly when run from the test program and when run against
   the other shims.
   
   
Adding a shim (detail):
=======================

This section contains the same steps as above, but with more detail. This
section will suppose that a new python shim named "test" will be added to the
amqp_types_test.

1. Add an empty shim framework
------------------------------
  a. Within the shims directory, add a "test" directory.
  b. Under this directory, add a new subdirectory "amqp_types_test".
  c. Under this directory, add Sender.py and Receiver.py  source files.
  d. Within each file, add a function to receive and print the command-line
     parameters it receives. For example:

    #!/usr/bin/env python
    
    import sys
    
    # --- main ---
    # Args: 1: Broker address (ip-addr:port)
    #       2: Queue name
    #       3: AMQP type
    #       4: Expected number of test values to receive
    print sys.argv
    
2. Add the shim to the build system
-----------------------------------
NOTE: The build and install systems are immature and will likely be changed in
the near future. See QPIDIT-54 and QPIDIT-57. The current arrangement, while
functional, is ugly and needs reforming.

At present, the top-level builder and installer is cmake. This is usually run
in two phases:
make
make install

The first (make) phase compiles the C++ shim only.
The second (make install) phase compiles all non-C++ code prior to calling the
Python installer (setup.py) to perform the actual installation of the artifacts.

a. Building:
   There are three possiblities:
   1. If your shim does not need compiling, skip this step.
   2. If your shim can use cmake directly, then add your shim direcory to the
      top-level CMakeLists.txt file as a subdirectory and supply your own local
      CMakeLists.txt file.
   3. If your shim uses a compiler unknown to cmake, then call it directly (or
      call a script which calls it) from within cmake using the execute_process
      command:
      
      # Compile Test Shim
      install(CODE "execute_process(COMMAND <command to compile your shim>
                                    WORKING_DIRECTORY <your working dir>)")

      which should invoke the compiler.

   NOTE: If your client is dependent on any way on Qpid Proton, then the
   variable PROTON_INSTALL_DIR points to the location where this is installed.

b. Installing:
   As the test control programs are all written in Python, the
   entire install is treated as a Python install with the shims being
   considered dependencies of the test control programs and placed in a "shims"
   subdirectory.  The install may be local or system-wide, depending on the
   value of CMAKE_INSTALL_PREFIX:
   
   CMAKE_INSTALL_PREFIX
   +-- lib
       +-- python2.7
           +-- site-packages
               +-- qpid_interop_test
                   +-- test-name-1.py
                   +-- test-name-2.py
                   ...
                   +-- shims
                       +-- client-1
                       |   +-- test-name-1.py
                       |   |   +-- Sender
                       |   |   +-- Receiver
                       |   +-- test-name-2.py
                       |   |   +-- Sender
                       |   |   +-- Receiver
                       |   ...
                       +-- client-2
                       ...

   It will be necessary to add your shim to the install scripts in setup.py so
   that they will be placed in the correct directory when installed. Where and
   how it is added to the setup.py depends on the type and nature of your
   shims.

   NOTE: Make sure your Sender and Receiver shims are executable when
   installed - this can be an issue for non-compiled scripts.  If this the
   case, you can add it as a last step in the CMakeLists.txt file as a call to
   chmod +x Sender Receiver:
   
   install(CODE "execute_process(COMMAND chmod +x Receiver Sender
                                 WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/lib/python2.7/site-packages/qpid_interop_test/shims/test/amqp_types_test/)")

3. Add shim into to test program
--------------------------------
This step involves modifying the test program to make it aware of your test
client. (NOTE: This will likely change soon, see QPIDIT-58).

There are two steps:

a. Add a shim class to represent your client metadata in the shims.py module.
   This is done by creating a new subclass of Shim to represent your client.
   The constructor receives only two parameters, the path to the sender and the
   path to the receiver:
   
    class TestShim(Shim):
        """Shim for test client"""
        NAME = 'Test'
        def __init__(self, sender_shim, receiver_shim):
            super(TestShim, self).__init__(sender_shim, receiver_shim)
            self.send_params = [self.sender_shim]
            self.receive_params = [self.receiver_shim]
   
b. Add an instance of this class to the SHIM_MAP in the test program for which
   you are writing your shim. Locate the SHIM_MAP declaration by a search. Then
   add an instance of the class you created in step a. above to the SHIM_MAP,
   using the shim NAME as the key:
   
   SHIM_MAP = { ... ,
               qpid_interop_test.shims.TestShim.NAME: \
               qpid_interop_test.shims.TestShim(<path to installed sender>,
                                                <path to installed receiver>)
              }
   
   Paths are relative to QPID_INTEROP_TEST_HOME, which points to
   CMAKE_INSTALL_PREFIX/lib/python2.7/site-packages/qpid_interop_test (see 2.b.
   above)

4. Modify the test data so that only a single simple test case is run
---------------------------------------------------------------------
We need to isolate a single test case with a simple set of values so we can
isolate the command-line parameters being sent to the shims.  If we don't do
this, then there can be an overwhelming amount of command-line activity, and it
will be difficult to see what is going on.  The test data is contained in a
large map at the top of the test file.

Using amqp_types_test as an example: 

class AmqpPrimitiveTypes(TestTypeMap):
    TYPE_MAP = { <loads of test data> }

Comment out (or temporarily cut) all the test types out except one:
    TYPE_MAP = { 'boolean': ['True', 'False'] }

The idea is that as you start to fill out the guts of your shim, you add the
different test types one-by-one until they are all present again.

5. Check that the shim install
------------------------------
This step checks that the test program can call the shim, and we isolate the
command-line parameters being sent to it. The test will fail (as the shims are
still empty and don't send or receive any messages yet). If all the previous
steps have been completed, then performing a make/make install will place your
(empty) shims into the shims directory as expected.

a. Uncomment a pair of debug prints in the shims.py module:

    class Sender(ShimWorkerThread):
        ...
        def run(self):
            try:
                #print '\n>>SNDR>>', self.arg_list # DEBUG - useful to see command-line sent to shim
                ...
    
    class Receiver(ShimWorkerThread):
        ...
        def run(self):
            try:
                #print '\n>>RCVR>>', self.arg_list # DEBUG - useful to see command-line sent to shim
                ...

   These will print out the command that will invoke the shims.
   
b. Start a broker.
c. Run the test:

   path/to/installed/location/of/amqp_types_test.py --include-shim Test

   where the include-shim parameter is the name you gave your client in step
   3.a. above. You should see something similar to the following:
   
   Test Broker: <broker name> v.<broker version> on <platform>

   test_boolean_Test->Test (__main__.BooleanTestCase) ... 
   >>RCVR>> ['/abs/path/to/installed/Receiver', 'localhost:5672',
             'jms.queue.qpid-interop.amqp_types_test.boolean.Test.Test',
             'boolean', '2']

   >>SNDR>> ['/abs/path/to/installed/Sender', 'localhost:5672',
             'jms.queue.qpid-interop.amqp_types_test.boolean.Test.Test',
             'boolean', '["True", "False"]']
   FAIL

   ...
   
d. Note the command-line parameters - these will be used to develop the
   shims moving forward by calling them directly from the command-line:
   
   $ /abs/path/to/installed/Sender localhost:5672 jms.queue.qpid-interop.amqp_types_test.boolean.Test.Test boolean '["True", "False"]'
   ['/abs/path/to/installed/Sender', 'localhost:5672', 'jms.queue.qpid-interop.amqp_types_test.boolean.Test.Test', 'boolean', '["True", "False"]']
   
   $ /abs/path/to/installed/Receiver localhost:5672 jms.queue.qpid-interop.amqp_types_test.boolean.Test.Test boolean 2
   ['/abs/path/to/installed/Receiver', 'localhost:5672', 'jms.queue.qpid-interop.amqp_types_test.boolean.Test.Test', 'boolean', '2']
   
   and, as expected, the shims simply return the command-line parameters they were sent.
   
6. Write the guts of the shims
------------------------------
Strategies for accomplishing this will vary, but in general:
a. Sender: Convert the JSON list in parameter 4 to a list of test value
   strings.
b. Write the Send and Receive shims to connect to the broker at the address
   contained in command-line parameter 1.
c. When the on_start callback is received, create a sender/receiver for the
   queue contained in command-line parameter 2.
d. Sender: When the on_sendable callback is received, iterate through the
   values of test value strings (see a. above) and convert then from a string
   into an appropriate type the AMQP type contained in command-line parameter
   3. Then send each one as a message body using the sender created in step c.
   above.
e. Receiver: Set up a counter to listen for the number of messages contained in
   the command-line parameter 4. When the on_message callback is received,
   interpret the message body as the AMQP type contained in command-line
   parameter 3. Convert this back to a string of the same format as used by the
   sender when sending the message, and add it to a list of received values.
f. Sender: When all messages are sent, exit without printing anything to cout.
g. Receiver: When all expected messages have been received and acknowledged,
   print the following 2 lines to cout:
   Line 1: The test type as contained in command-line parameter 3
   Line 2: A JSON list of test values received and formatted to strings. Make
   sure that the entire JSON list is printed on a single line.

For this stage of the development, it may be helpful to test by using the
command-line directly on each test shim.  A tool such as Wireshark is useful to
check that the messages are being sent on the wire to and from the broker.

Once this is complete for a single type (eg boolean in the examples above), the
the test will pass if run from the test program. You should see the same as
5.c. above, but with a PASS.

It may be helpful to develop each type one at a time in lock-step with both the
sender and receiver shim. For example, using amqp_types_test:
* Write sender and receiver for type boolean
* Once this passes, add type ubyte, ushort, etc. one at a time, checking that
  all previously added types still pass, until all types are included.
* Re-comment the print statements in the shims.py module if necessary to make
  the tests less noisy.

7. Test your shim against the other shims
-----------------------------------------
Once all types are handled in your shim and it passes the test running against
itself, test them against the other existing shims. This can be done by calling
the test program without the --include-shim parameter, or if you want to test
against one other shim at a time, use two --include-shim values. For example,
to test against only the C++ shim, use:

path/to/installed/location/of/amqp_types_test.py --include-shim Test --include-shim ProtonCpp

Note that the --exclude-shim paramer can be used to exclude a shim in the full
list of shims in SHIM_MAP from the tests, but that it is mutually exclusive to
the --include-shim parameter.


NOTES
=====

Queue names
-----------
Owing to a limitation that currently exists in some brokers, auto-created
queues MUST be prefixed with "jms.queue". All the tests currently use this
prefix even though the tests may not be JMS tests at all. (This is expected
to change at some point when this limitation is fixed)

Broker settings
---------------
* The tests rely upon the broker to automatically create queues that do not
  exist (or they must pre-exist), as the tests do not explicitly create
  them. If necessary, configure the broker for auto-queue-creation.
* IP4/IP6: Some clients use IP4 by default, others use IP6. The broker must be
  listening on both for these clients to interoperate.
* It is helpful to turn persistence off on the brokers. While developing shims
  the ability to quickly stop and restart a broker so that it is clean (or to
  quickly flush all queues of messages) is helpful.
  
  
