Updated simulators for DFC

mr sim has a number of new test cases
Docker files/docker compose files added.
Minor adjustment to scripts.

Issue-ID: DCAEGEN2-1313

Change-Id: I0246a9d5c855cda4e7dea9830928cae98c5e1284
Signed-off-by: BjornMagnussonXA <bjorn.magnusson@est.tech>
diff --git a/test/mocks/datafilecollector-testharness/mr-sim/Dockerfile b/test/mocks/datafilecollector-testharness/mr-sim/Dockerfile
new file mode 100755
index 0000000..5341bb0
--- /dev/null
+++ b/test/mocks/datafilecollector-testharness/mr-sim/Dockerfile
@@ -0,0 +1,10 @@
+FROM python:3.6-alpine
+
+COPY . /app
+
+WORKDIR /app
+
+RUN pip install -r requirements.txt
+
+EXPOSE 2222
+
diff --git a/test/mocks/datafilecollector-testharness/mr-sim/README.md b/test/mocks/datafilecollector-testharness/mr-sim/README.md
index b04b9ec..5746345 100644
--- a/test/mocks/datafilecollector-testharness/mr-sim/README.md
+++ b/test/mocks/datafilecollector-testharness/mr-sim/README.md
@@ -1,3 +1,52 @@
+
+#Alternative to running python (as described below) on your machine, use the docker files.
+1. Build docker container with ```docker build -t mrsim:latest .```
+2. Run the container ```docker-compose up```
+The behavior can be changed by argument to the python script in the docker-compose.yml
+
+The simulator can be queried for statistics
+localhost:2222/ctr_requests   - return an integer of the number of get request to the event poll path
+localhost:2222/ctr_responses  - return an integer of the number of get responses to the event poll path
+localhost:2222/ctr_unique_files - returns an integer or the number of unique files. A unique file is the combination of node+file_sequence_number 
+
+
+##Common TC info
+File names for 1MB, 5MB and 50MB files
+Files in the format: <size-in-mb>MB_<sequence-number>.tar.gz    Ex. for 5MB file with sequence number 12:  5MB_12.tar.gz
+The sequence numbers are stepped so that all files have unique names
+Missing files (files that are not expected to be found in the ftp server. Format: MissingFile_<sequence-number>.tar.gz
+
+Limited event streams
+When the number of events are exhausted, empty replies are returned '[]'
+
+TC100 - One ME, SFTP, 1 1MB file, 1 event
+TC101 - One ME, SFTP, 1 5MB file, 1 event
+TC102 - One ME, SFTP, 1 50MB file, 1 event
+
+TC110 - One ME, SFTP, 1MB files, 1 file per event, 100 events, 1 event per poll.
+TC111 - One ME, SFTP, 1MB files, 100 files per event, 100 events, 1 event per poll.
+TC112 - One ME, SFTP, 5MB files, 100 files per event, 100 events, 1 event per poll.
+TC113 - One ME, SFTP, 1MB files, 100 files per event, 100 events. All events in one poll.
+
+
+TC120 - One ME, SFTP, 1MB files, 100 files per event, 100 events, 1 event per poll. 10% of replies each: no response, empty message, slow response, 404-error, malformed json
+TC121 - One ME, SFTP, 1MB files, 100 files per event, 100 events, 1 event per poll. 10% missing files
+TC122 - One ME, SFTP, 1MB files, 100 files per event, 100 events. 1 event per poll. All files with identical name. 
+
+Endless event streams
+TC1000 - One ME, SFTP, 1MB files, 100 files per event, endless number of events, 1 event per poll
+TC1001 - One ME, SFTP, 5MB files, 100 files per event, endless number of events, 1 event per poll
+
+
+TC510 - 5 ME, SFTP, 1MB files, 1 file per event, 100 events, 1 event per poll.
+
+
+TC200-TC202 same as TC100-TC102 but with FTPS
+TC210-TC213 same as TC110-TC113 but with FTPS
+TC2000-TC2001 same as TC1000-TC1001 but with FTPS
+TC610 same as TC510 but with FTPS
+
+
 ## Developer workflow
 
 1. ```sudo apt install python3-venv```
diff --git a/test/mocks/datafilecollector-testharness/mr-sim/docker-compose.yml b/test/mocks/datafilecollector-testharness/mr-sim/docker-compose.yml
new file mode 100644
index 0000000..7315e4b
--- /dev/null
+++ b/test/mocks/datafilecollector-testharness/mr-sim/docker-compose.yml
@@ -0,0 +1,10 @@
+version: '2'
+
+services:
+  mrsim:
+    image: mrsim:latest
+    ports:
+     - "2222:2222"
+    container_name: mrsim
+    command: python mr-sim.py --tc100
+# Change -tc100 to other tc number for desired behavior.
\ No newline at end of file
diff --git a/test/mocks/datafilecollector-testharness/mr-sim/mr-sim.py b/test/mocks/datafilecollector-testharness/mr-sim/mr-sim.py
index c37ae69..ef46535 100644
--- a/test/mocks/datafilecollector-testharness/mr-sim/mr-sim.py
+++ b/test/mocks/datafilecollector-testharness/mr-sim/mr-sim.py
@@ -8,73 +8,432 @@
 from flask import Flask
 app = Flask(__name__)
 
-DEFAULT_IP = "localhost"
+#Server info
+HOST_IP = "0.0.0.0"
+HOST_PORT = 2222
 
+#Test function to check server running
+@app.route('/',
+    methods=['GET'])
+def index():
+    return 'Hello world'
 
+#Returns number of polls
+@app.route('/ctr_requests',
+    methods=['GET'])
+def counter_requests():
+    global ctr_requests
+    return str(ctr_requests)
+
+#Returns number of replies
+@app.route('/ctr_responses',
+    methods=['GET'])
+def counter_responses():
+    global ctr_responses
+    return str(ctr_responses)
+
+#Returns number of unique files
+@app.route('/ctr_unique_files',
+    methods=['GET'])
+def counter_uniquefiles():
+    global fileMap
+    return str(len(fileMap))
+
+#Returns tc info
+@app.route('/tc_info',
+    methods=['GET'])
+def testcase_info():
+    global tc_num
+    return tc_num
+
+#Messages polling function
 @app.route(
     "/events/unauthenticated.VES_NOTIFICATION_OUTPUT/OpenDcae-c12/C12",
     methods=['GET'])
 def MR_reply():
-    global mr_counter
-    global mr_replies
+    global ctr_requests
+    global args
 
-    mr_counter = mr_counter + 1
-    print("MR receiver counter: " + str(mr_counter))
+    ctr_requests = ctr_requests + 1
+    print("MR: poll request#: " + str(ctr_requests))
 
-    if mr_replies[mr_counter].sleepMs != 0:
-        sleep(mr_replies[mr_counter].sleepMs / 1000.0)
-        print("Sleeping: " + str(mr_replies[mr_counter].sleepMs) + " ms")
+    if args.tc100:
+      return tc100("sftp")
+    elif args.tc101:
+      return tc101("sftp")
+    elif args.tc102:
+      return tc102("sftp")
 
-    if mr_replies[mr_counter].replytype == 0:
-        #print (str(mr_replies[mr_counter].jsonreply))
-        print("Regular reply")
-        response = app.response_class(
-            response=mr_replies[mr_counter].jsonreply,
-            status=200,
-            mimetype='application/json')
+    elif args.tc110:
+      return tc110("sftp")
+    elif args.tc111:
+      return tc111("sftp")
+    elif args.tc112:
+      return tc112("sftp")
+    elif args.tc113:
+      return tc113("sftp")
 
-        return response
+    elif args.tc120:
+      return tc120("sftp")
+    elif args.tc121:
+      return tc121("sftp")
+    elif args.tc122:
+      return tc122("sftp")
 
-    if mr_replies[mr_counter].replytype == 2:
+    elif args.tc1000:
+      return tc1000("sftp")
+    elif args.tc1001:
+      return tc1001("sftp")
 
-        print("error: 404")
-        response = app.response_class(
-            response="",
-            status=404,
-            mimetype='application/json')
-
-        return response
-
-    if mr_replies[mr_counter].replytype == 1:
-        print("do nothing, sink request")
-        return
+    elif args.tc510:
+      return tc510("sftp")      
 
 
-class Reply:
-    """An instance of the reply event, which can be configured to behave in a certain way
-    (delay, error code, reply body"""
+    elif args.tc200:
+      return tc200("ftps")
+    elif args.tc201:
+      return tc201("ftps")
+    elif args.tc202:
+      return tc202("ftps")
 
-    def to_json(self):
-        return self.jsonreply
+    elif args.tc210:
+      return tc210("ftps")
+    elif args.tc211:
+      return tc211("ftps")
+    elif args.tc212:
+      return tc212("ftps")
+    elif args.tc213:
+      return tc213("ftps")
 
-    def __init__(
-            self,
-            ip=DEFAULT_IP,
-            file="1MB.tar.gz",
-            sleepMs=0,
-            replyType=0,
-            port=1022,
-            type="ftps"):
-        self.sleepMs = sleepMs
-        self.ip = ip
-        self.file = file
-        self.port = port
-        self.replytype = replyType  # 0 for reply, 1 timeout, 2 deny
-        self.user = "onap"
-        self.passwd = "pano"
-        self.type = type
-        self.jsonreply = str.encode("""
-        [{
+    elif args.tc220:
+      return tc220("ftps")
+    elif args.tc221:
+      return tc221("ftps")
+    elif args.tc222:
+      return tc222("ftps")
+
+    elif args.tc2000:
+      return tc2000("ftps")
+    elif args.tc2001:
+      return tc2001("ftps")
+
+    elif args.tc610:
+      return tc510("ftps")     
+
+
+#### Test case functions
+
+
+def tc100(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 1):
+    return buildOkResponse("[]")
+
+  seqNr = (ctr_responses-1)
+  msg = getEventHead() + getEventName("1MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022) + getEventEnd()
+  fileMap[seqNr] = seqNr
+  return buildOkResponse("["+msg+"]")
+
+def tc101(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 1):
+    return buildOkResponse("[]")  
+ 
+  seqNr = (ctr_responses-1)
+  msg = getEventHead() + getEventName("5MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022) + getEventEnd()
+  fileMap[seqNr] = seqNr
+
+  return buildOkResponse("["+msg+"]")
+
+def tc102(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 1):
+    return buildOkResponse("[]")  
+
+  seqNr = (ctr_responses-1)
+  msg = getEventHead() + getEventName("50MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022) + getEventEnd()
+  fileMap[seqNr] = seqNr
+
+  return buildOkResponse("["+msg+"]")
+
+def tc110(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 100):
+    return buildOkResponse("[]")  
+  
+  seqNr = (ctr_responses-1)
+  msg = getEventHead() + getEventName("1MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022) + getEventEnd()
+  fileMap[seqNr] = seqNr
+
+  return buildOkResponse("["+msg+"]")
+
+def tc111(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 100):
+    return buildOkResponse("[]")  
+  
+  msg = getEventHead()
+
+  for i in range(100):
+    seqNr = i+(ctr_responses-1)
+    if i != 0: msg = msg + ","
+    msg = msg + getEventName("1MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022)
+    fileMap[seqNr] = seqNr
+
+  msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+def tc112(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 100):
+    return buildOkResponse("[]")  
+  
+  msg = getEventHead()
+
+  for i in range(100):
+    seqNr = i+(ctr_responses-1)
+    if i != 0: msg = msg + ","
+    msg = msg + getEventName("5MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022)
+    fileMap[seqNr] = seqNr
+
+  msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+def tc113(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 1):
+    return buildOkResponse("[]")  
+  
+  msg = ""
+
+  for evts in range(100):  # build 100 evts
+    if (evts > 0):
+      msg = msg + ","
+    msg = msg + getEventHead()
+    for i in range(100):   # build 100 files
+      seqNr = i+evts+100*(ctr_responses-1)
+      if i != 0: msg = msg + ","
+      msg = msg + getEventName("1MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022)
+      fileMap[seqNr] = seqNr
+
+    msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+
+def tc120(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 100):
+    return buildOkResponse("[]")  
+
+  if (ctr_responses % 10 == 2):
+    return  # Return nothing
+  
+  if (ctr_responses % 10 == 3):
+    return buildOkResponse("") # Return empty message
+
+  if (ctr_responses % 10 == 4):
+    return buildOkResponse(getEventHead()) # Return part of a json event
+
+  if (ctr_responses % 10 == 5):
+    return buildEmptyResponse(404) # Return empty message with status code
+
+  if (ctr_responses % 10 == 6):
+    sleep(60)
+
+  
+  msg = getEventHead()
+
+  for i in range(100):
+    seqNr = i+(ctr_responses-1)
+    if i != 0: msg = msg + ","
+    msg = msg + getEventName("1MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022)
+    fileMap[seqNr] = seqNr
+
+  msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+def tc121(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 100):
+    return buildOkResponse("[]")  
+  
+  msg = getEventHead()
+
+  for i in range(100):
+    seqNr = i+(ctr_responses-1)
+    if (seqNr%10 == 0):     # Every 10th file is "missing"
+      fn = "MissingFile_" + str(seqNr) + ".tar.gz"
+    else:
+      fn = "1MB_" + str(seqNr) + ".tar.gz"
+      fileMap[seqNr] = seqNr
+
+    if i != 0: msg = msg + ","
+    msg = msg + getEventName(fn,ftptype,"onap","pano","localhost",1022)
+    
+
+  msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+def tc122(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 100):
+    return buildOkResponse("[]")  
+  
+  msg = getEventHead()
+
+  for i in range(100):
+    fn = "1MB_0.tar.gz"  # All files identical names
+    if i != 0: msg = msg + ","
+    msg = msg + getEventName(fn,ftptype,"onap","pano","localhost",1022)
+
+  fileMap[0] = 0
+  msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+
+def tc1000(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  msg = getEventHead()
+
+  for i in range(100):
+    seqNr = i+(ctr_responses-1)
+    if i != 0: msg = msg + ","
+    msg = msg + getEventName("1MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022)
+    fileMap[seqNr] = seqNr
+
+  msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+def tc1001(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  msg = getEventHead()
+
+  for i in range(100):
+    seqNr = i+(ctr_responses-1)
+    if i != 0: msg = msg + ","
+    msg = msg + getEventName("5MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022)
+    fileMap[seqNr] = seqNr
+
+  msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+def tc510(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 5):
+    return buildOkResponse("[]")  
+
+  msg = ""
+
+  for evts in range(700):  # build events for 5 MEs
+    if (evts > 0):
+      msg = msg + ","
+    msg = msg + getEventHeadNodeName("PNF"+str(evts))
+    seqNr = (ctr_responses-1)
+    msg = msg + getEventName("1MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022)
+    seqNr = seqNr + evts*1000000 #Create unique id for this node and file
+    fileMap[seqNr] = seqNr
+    msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+#Mapping FTPS TCs
+def tc200(ftptype):
+  return tc100(ftptype)
+def tc201(ftptype):
+  return tc101(ftptype)
+def tc202(ftptype):
+  return tc102(ftptype)
+
+def tc210(ftptype):
+  return tc110(ftptype)
+def tc211(ftptype):
+  return tc111(ftptype)
+def tc212(ftptype):
+  return tc112(ftptype)
+def tc213(ftptype):
+  return tc113(ftptype)
+
+def tc220(ftptype):
+  return tc120(ftptype)
+def tc221(ftptype):
+  return tc121(ftptype)
+def tc222(ftptype):
+  return tc122(ftptype)
+
+def tc2000(ftptype):
+  return tc1000(ftptype)
+def tc2001(ftptype):
+  return tc1001(ftptype)
+
+#### Functions to build json messages and respones ####
+
+# Function to build fixed beginning of an event
+def getEventHead():
+  return getEventHeadNodeName("oteNB5309")
+
+def getEventHeadNodeName(nodename):
+  headStr = """
+        {
           "event": {
             "commonEventHeader": {
               "startEpochMicrosec": 8745745764578,
@@ -85,205 +444,267 @@
               },
               "priority": "Normal",
               "version": "4.0.1",
-              "reportingEntityName": "otenb5309",
+              "reportingEntityName": \"""" + nodename + """",
               "sequence": 0,
               "domain": "notification",
               "lastEpochMicrosec": 8745745764578,
               "eventName": "Noti_RnNode-Ericsson_FileReady",
               "vesEventListenerVersion": "7.0.1",
-              "sourceName": "oteNB5309"
+              "sourceName": \"""" + nodename + """"
             },
             "notificationFields": {
               "notificationFieldsVersion": "2.0",
               "changeType": "FileReady",
               "changeIdentifier": "PM_MEAS_FILES",
               "arrayOfNamedHashMap": [
-                {
-                  "name": \"""" +
-                                    self.file +
-                                    """",
+          """ 
+  return headStr
+
+# Function to build the variable part of an event
+def getEventName(fn,type,user,passwd,ip,port):
+    nameStr =        """{
+                  "name": \"""" + fn + """",
                   "hashMap": {
                     "fileFormatType": "org.3GPP.32.435#measCollec",
-                    "location": \"""" +
-                                    self.type +
-                                    """://""" +
-                                    self.user +
-                                    """:""" +
-                                    self.passwd +
-                                    """@""" +
-                                    self.ip +
-                                    """:""" +
-                                    str(self.port) +
-                                    """/""" +
-                                    self.file +
-                                    """",
+                    "location": \"""" + type + """://""" + user + """:""" + passwd + """@""" + ip + """:""" + str(port) + """/""" + fn + """",
                     "fileFormatVersion": "V10",
                     "compression": "gzip"
                   }
-                }
+                } """
+    return nameStr
+
+# Function to build fixed end of an event
+def getEventEnd():
+    endStr =  """
               ]
             }
           }
-        }]
-        """)
+        }
+        """
+    return endStr
 
+# Function to build an OK reponse from a message string
+def buildOkResponse(msg):
+  response = app.response_class(
+      response=str.encode(msg),
+      status=200,
+      mimetype='application/json')
+  return response
 
-def replyFactory(
-        ip=DEFAULT_IP,
-        file="1MB.tar.gz",
-        factoryport=1022,
-        count=1,
-        factorytype="ftps"):
-    aggregatedReply = ""
-    # first item does not require .
-    aggregatedReply = Reply(ip, file, port=factoryport).to_json()
-    for i in range(count - 1):
-        aggregatedReply = aggregatedReply + b", " + \
-            Reply(ip, file, port=factoryport, type=factorytype).to_json()
-    #print(b"aggregated reply: " + aggregatedReply)
-    return b"[" + aggregatedReply + b"]"
-
-
-def prepareMrRespArrSftp():
-    global mr_replies
-
-    for i in range(400):  # prepare 400 regular replies
-        mr_replies.append(
-            Reply(
-                port=1022,
-                ip="localhost",
-                type="sftp",
-                file="1MB.tar.gz"))
-    #mr_replies[0] is not used
-
-
-def prepareMrRespArrFtps():
-    global mr_replies
-
-    for i in range(400):
-        mr_replies.append(
-            Reply(
-                port=21,
-                ip="localhost",
-                type="ftps",
-                file="1MB.tar.gz"))
-
-
-def tc1():
-    prepareMrRespArrSftp()
-    # no mutation needed in this TC
-
-
-def tc2():
-    global mr_replies
-
-    for i in range(7):
-        mr_replies.append(
-            Reply(
-                port=1022,
-                ip="localhost",
-                type="sftp",
-                file="1MB.tar.gz"))
-
-    # inserting and empty reply message
-    mr_replies[1].jsonreply = b""
-    mr_replies[2].jsonreply = b""
-
-    # inserting a 404 error and delay
-    mr_replies[3].replytype = 2
-    mr_replies[3].sleepMs = 2000
-
-    # inserting and empty reply message
-    mr_replies[4].jsonreply = b""
-
-    # sink the message
-    mr_replies[5].replytype = 1
-
-    # reply with one proper file finally
-    mr_replies[6] = Reply(
-        port=1022,
-        ip="localhost",
-        type="sftp",
-        file="1MB.tar.gz")
-
-
-def tc3():
-    prepareMrRespArrFtps()
-
-
-def tc4():
-    global mr_replies
-
-    for i in range(7):
-        mr_replies.append(
-            Reply(
-                port=21,
-                ip="localhost",
-                type="ftps",
-                file="1MB.tar.gz"))
-
-    # inserting and empty reply message
-    mr_replies[1].jsonreply = b""
-    mr_replies[2].jsonreply = b""
-
-    # inserting a 404 error and delay
-    mr_replies[3].replytype = 2
-    mr_replies[3].sleepMs = 2000
-
-    # inserting and empty reply message
-    mr_replies[4].jsonreply = b""
-
-    # sink the message
-    mr_replies[5].replytype = 1
-
-    # reply with one proper file finally
-    mr_replies[6] = Reply(
-        port=21,
-        ip="localhost",
-        type="fftp",
-        file="1MB.tar.gz")
+# Function to build an empty message with status
+def buildEmptyResponse(status_code):
+  response = app.response_class(
+      response=str.encode(""),
+      status=status_code,
+      mimetype='application/json')
+  return response
 
 
 if __name__ == "__main__":
-    mr_replies = []
-    mr_counter = 0  # counting hits reaching MR instance
-    DR_block_single_req = 0
+  
+    #Counters
+    ctr_responses = 0
+    ctr_requests = 0
+    ctr_unique_files = 0
+
+    #Keeps all reponded file names
+    fileMap = {}
+
+    tc_num = "Not set"
+    tc_help = "Not set"
 
     parser = argparse.ArgumentParser()
+
+#SFTP TCs with single ME 
     parser.add_argument(
-        '--tc1',
+        '--tc100',
         action='store_true',
-        help='TC1: reply all queries with 1-1 files using SFTP')
+        help='TC100 - One ME, SFTP, 1 1MB file, 1 event')
     parser.add_argument(
-        '--tc2',
+        '--tc101',
         action='store_true',
-        help='TC2: Reply according to error scenarios, then return 1 file finally for SFTP ---NOTE: updated keys required')
+        help='TC101 - One ME, SFTP, 1 5MB file, 1 event')
     parser.add_argument(
-        '--tc3',
+        '--tc102',
         action='store_true',
-        help='TC3: reply all queries with 1-1 files using FTPS')
+        help='TC102 - One ME, SFTP, 1 50MB file, 1 event')
+
     parser.add_argument(
-        '--tc4',
+        '--tc110',
         action='store_true',
-        help='TC4: Reply according to error scenarios, then return 1 file finally for FTPS ---NOTE: updated keys required')
+        help='TC110 - One ME, SFTP, 1MB files, 1 file per event, 100 events, 1 event per poll.')
+    parser.add_argument(
+        '--tc111',
+        action='store_true',
+        help='TC111 - One ME, SFTP, 1MB files, 100 files per event, 100 events, 1 event per poll.')
+    parser.add_argument(
+        '--tc112',
+        action='store_true',
+        help='TC112 - One ME, SFTP, 5MB files, 100 files per event, 100 events, 1 event per poll.')
+    parser.add_argument(
+        '--tc113',
+        action='store_true',
+        help='TC113 - One ME, SFTP, 1MB files, 100 files per event, 100 events. All events in one poll.')
+
+    parser.add_argument(
+        '--tc120',
+        action='store_true',
+        help='TC120 - One ME, SFTP, 1MB files, 100 files per event, 100 events, 1 event per poll. 10% of replies each: no response, empty message, slow response, 404-error, malformed json')
+    parser.add_argument(
+        '--tc121',
+        action='store_true',
+        help='TC121 - One ME, SFTP, 1MB files, 100 files per event, 100 events, 1 event per poll. 10% missing files')
+    parser.add_argument(
+        '--tc122',
+        action='store_true',
+        help='TC122 - One ME, SFTP, 1MB files, 100 files per event, 100 events. 1 event per poll. All files with identical name. ')
+
+    parser.add_argument(
+        '--tc1000',
+        action='store_true',
+        help='TC1000 - One ME, SFTP, 1MB files, 100 files per event, endless number of events, 1 event per poll')
+    parser.add_argument(
+        '--tc1001',
+        action='store_true',
+        help='TC1001 - One ME, SFTP, 5MB files, 100 files per event, endless number of events, 1 event per poll')
+
+# SFTP TCs with multiple MEs
+    parser.add_argument(
+        '--tc510',
+        action='store_true',
+        help='TC510 - 5 MEs, SFTP, 1MB files, 1 file per event, 100 events, 1 event per poll.')
+
+
+
+# FTPS TCs with single ME
+    parser.add_argument(
+        '--tc200',
+        action='store_true',
+        help='TC200 - One ME, FTPS, 1 1MB file, 1 event')
+    parser.add_argument(
+        '--tc201',
+        action='store_true',
+        help='TC201 - One ME, FTPS, 1 5MB file, 1 event')
+    parser.add_argument(
+        '--tc202',
+        action='store_true',
+        help='TC202 - One ME, FTPS, 1 50MB file, 1 event')
+
+    parser.add_argument(
+        '--tc210',
+        action='store_true',
+        help='TC210 - One ME, FTPS, 1MB files, 1 file per event, 100 events, 1 event per poll.')
+    parser.add_argument(
+        '--tc211',
+        action='store_true',
+        help='TC211 - One ME, FTPS, 1MB files, 100 files per event, 100 events, 1 event per poll.')
+    parser.add_argument(
+        '--tc212',
+        action='store_true',
+        help='TC212 - One ME, FTPS, 5MB files, 100 files per event, 100 events, 1 event per poll.')
+    parser.add_argument(
+        '--tc213',
+        action='store_true',
+        help='TC213 - One ME, FTPS, 1MB files, 100 files per event, 100 events. All events in one poll.')
+
+    parser.add_argument(
+        '--tc220',
+        action='store_true',
+        help='TC220 - One ME, FTPS, 1MB files, 100 files per event, 100 events, 1 event per poll. 10% of replies each: no response, empty message, slow response, 404-error, malformed json')
+    parser.add_argument(
+        '--tc221',
+        action='store_true',
+        help='TC221 - One ME, FTPS, 1MB files, 100 files per event, 100 events, 1 event per poll. 10% missing files')
+    parser.add_argument(
+        '--tc222',
+        action='store_true',
+        help='TC222 - One ME, FTPS, 1MB files, 100 files per event, 100 events. 1 event per poll. All files with identical name. ')
+
+    parser.add_argument(
+        '--tc2000',
+        action='store_true',
+        help='TC2000 - One ME, FTPS, 1MB files, 100 files per event, endless number of events, 1 event per poll')
+    parser.add_argument(
+        '--tc2001',
+        action='store_true',
+        help='TC2001 - One ME, FTPS, 5MB files, 100 files per event, endless number of events, 1 event per poll')    
+
+    parser.add_argument(
+        '--tc610',
+        action='store_true',
+        help='TC510 - 5 MEs, FTPS, 1MB files, 1 file per event, 100 events, 1 event per poll.')
 
     args = parser.parse_args()
 
-    if args.tc1:
-        print("TC: #1")
-        tc1()
-    elif args.tc2:
-        print("TC: #2")
-        tc2()
-    elif args.tc3:
-        print("TC: #3")
-        tc3()
-    elif args.tc4:
-        print("TC: #4")
-        tc4()
+    
+
+    if args.tc100:
+        tc_num = "TC# 100"
+    elif args.tc101:
+        tc_num = "TC# 101"
+    elif args.tc102:
+        tc_num = "TC# 102"
+
+    elif args.tc110:
+        tc_num = "TC# 110"
+    elif args.tc111:
+        tc_num = "TC# 111"
+    elif args.tc112:
+        tc_num = "TC# 112"
+    elif args.tc113:
+        tc_num = "TC# 113"
+
+    elif args.tc120:
+        tc_num = "TC# 120"
+    elif args.tc121:
+        tc_num = "TC# 121"
+    elif args.tc122:
+        tc_num = "TC# 122"
+
+    elif args.tc1000:
+        tc_num = "TC# 1000"
+    elif args.tc1001:
+        tc_num = "TC# 1001"
+
+    elif args.tc510:
+        tc_num = "TC# 510"
+
+    elif args.tc200:
+        tc_num = "TC# 200"
+    elif args.tc201:
+        tc_num = "TC# 201"
+    elif args.tc202:
+        tc_num = "TC# 202"
+
+    elif args.tc210:
+        tc_num = "TC# 210"
+    elif args.tc211:
+        tc_num = "TC# 211"
+    elif args.tc212:
+        tc_num = "TC# 212"
+    elif args.tc213:
+        tc_num = "TC# 213"
+
+    elif args.tc220:
+        tc_num = "TC# 220"
+    elif args.tc221:
+        tc_num = "TC# 221"
+    elif args.tc222:
+        tc_num = "TC# 222"
+
+    elif args.tc2000:
+        tc_num = "TC# 2000"
+    elif args.tc2001:
+        tc_num = "TC# 2001"
+
+    elif args.tc610:
+        tc_num = "TC# 610"
 
     else:
         print("No TC was defined")
         print("use --help for usage info")
         sys.exit()
-    app.run(port=2222)
+
+    print(tc_num)
+ 
+    app.run(port=HOST_PORT, host=HOST_IP)