messages.py 66.9 KB
Newer Older
1 2 3
# -*- coding: utf-8 -*-

"""
4 5 6 7

About the library:
-----------------

8 9 10 11 12 13 14 15 16
This module provides the API message formats used in F-Interop.

The idea is to be able to have an
- organized and centralized way of dealing with the big amount of messages formats used in the platform;
- to be able to import (or just copy/paste) these messages formats from any component in the F-Interop platform,
- re-use this also for the integration testing;
- to have version control the messages e.g. messages_testcase_start API v1 and API v2;
- to have a direct way of exporting this as doc.

17 18 19 20 21 22 23 24

F-Interop conventions:
---------------------
- if event is a service request then the routing key (r_key) is control.someFunctionality.service
- a reply to a service will be on topic/r_key : control.someFunctionality.service.reply
- reply.correlation_id = request.correlation_id


25 26
Usage:
------
27
>>> from messages import * # doctest: +SKIP
Federico Sismondi's avatar
Federico Sismondi committed
28
>>> m = MsgTestCaseSkip(testcase_id = 'some_testcase_id')
29
>>> m
30
MsgTestCaseSkip(_api_version = 1.0.1, _type = testcoordination.testcase.skip, description = Skip testcase, node = someNode, testcase_id = some_testcase_id, )
31 32
>>> m.routing_key
'control.testcoordination'
33 34
>>> m.message_id # doctest: +SKIP
'802012eb-24e3-45c4-9dcc-dc293c584f63'
35
>>> m.testcase_id
Federico Sismondi's avatar
Federico Sismondi committed
36
'some_testcase_id'
37

38
# also we can modify some of the fields (rewrite the default ones)
Federico Sismondi's avatar
Federico Sismondi committed
39
>>> m = MsgTestCaseSkip(testcase_id = 'TD_COAP_CORE_03')
40
>>> m
41
MsgTestCaseSkip(_api_version = 1.0.1, _type = testcoordination.testcase.skip, description = Skip testcase, node = someNode, testcase_id = TD_COAP_CORE_03, )
42
>>> m.testcase_id
Federico Sismondi's avatar
Federico Sismondi committed
43
'TD_COAP_CORE_03'
44

45 46
# and even export the message in json format (for example for sending the message though the amqp event bus)
>>> m.to_json()
47
'{"_api_version": "1.0.1", "_type": "testcoordination.testcase.skip", "description": "Skip testcase", "node": "someNode", "testcase_id": "TD_COAP_CORE_03"}'
Federico Sismondi's avatar
Federico Sismondi committed
48

49
# We can use the Message class to import json into Message objects:
Federico Sismondi's avatar
Federico Sismondi committed
50 51
>>> m=MsgTestSuiteStart()
>>> m.to_json()
52
'{"_api_version": "1.0.1", "_type": "testcoordination.testsuite.start", "description": "Event test suite START"}'
Federico Sismondi's avatar
Federico Sismondi committed
53 54 55
>>> json_message = m.to_json()
>>> obj=Message.from_json(json_message)
>>> type(obj)
56
<class 'messages.MsgTestSuiteStart'>
57

58
# We can use the library for generating error responses:
59 60 61 62 63 64
# the request:
>>> m = MsgSniffingStart()
>>>
# the error reply (note that we pass the message of the request to build the reply):
>>> err = MsgErrorReply(m)
>>> err
65
MsgErrorReply(_api_version = 1.0.1, _type = sniffing.start, error_code = Some error code TBD, error_message = Some error message TBD, ok = False, )
66 67 68 69 70 71 72 73 74
>>> m.reply_to
'control.sniffing.service.reply'
>>> err.routing_key
'control.sniffing.service.reply'

>>> m.correlation_id # doctest: +SKIP
'360b0f67-4455-43e3-a00f-eca91f2e84da'
>>> err.correlation_id # doctest: +SKIP
'360b0f67-4455-43e3-a00f-eca91f2e84da'
Federico Sismondi's avatar
Federico Sismondi committed
75

76 77 78
"""

from collections import OrderedDict
79
import time
80 81 82
import json
import uuid

83
API_VERSION = '1.0.1'
84

85 86 87 88 89 90 91 92 93 94

# TODO use metaclasses instead?
class NonCompliantMessageFormatError(Exception):
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return repr(self.value)


Federico Sismondi's avatar
Federico Sismondi committed
95
class Message(object):
96
    def __init__(self, **kwargs):
97 98 99
        global API_VERSION

        # hard copy the message template
100
        self._msg_data = {k: v for k, v in self._msg_data_template.items()}
101

102 103
        # init properties
        self._properties = dict(
104 105 106
            content_type="application/json",
            message_id=str(uuid.uuid4()),
            timestamp=int(time.time())
107 108
        )

109
        try:
110 111 112
            if self.routing_key.endswith(".service"):
                self._properties["reply_to"] = "%s.%s" % (self.routing_key, "reply")
                self._properties["correlation_id"] = self._properties["message_id"]
113
        except AttributeError:
114
            pass
115

116
        # rewrite default data fields with the passed args
117 118 119
        self._msg_data.update(kwargs)

        # add API's version
120
        if "_api_version" not in self._msg_data:
121
            self._msg_data["_api_version"] = API_VERSION
122 123 124 125 126

        # add values as objects attributes
        for key in self._msg_data:
            setattr(self, key, self._msg_data[key])

127 128 129 130
        # add props as objects attributes
        for key in self._properties:
            setattr(self, key, self._properties[key])

131 132
    def to_dict(self):
        resp = {}
133 134
        # let's use sorted so API returns items inside always in the same order
        for field in sorted(self._msg_data.keys()):
135
            resp[field] = getattr(self, field)
136

137
        return OrderedDict(sorted(resp.items(), key=lambda t: t[0]))  # sorted by key
138 139 140 141

    def to_json(self):
        return json.dumps(self.to_dict())

142
    def get_properties(self):
143 144 145 146
        resp = OrderedDict()
        for field in self._properties:
            resp[field] = getattr(self, field)
        return resp
147

148
    def __str__(self):
149 150 151 152 153 154 155
        s = " - " * 20 + "\n"
        s += "Message routing key: %s" % self.routing_key
        s += "\n -  -  - \n"
        s += "Message properties: %s" % json.dumps(self.get_properties(), indent=4, )
        s += "\n -  -  - \n"
        s += "Message body: %s" % json.dumps(self.to_dict(), indent=4, )
        s += "\n" + " - " * 20
156
        return s
157

158 159 160 161 162
    def update_properties(self, **kwargs):
        for key, value in kwargs.items():
            if key in self._properties:
                setattr(self, key, value)

163 164
    @classmethod
    def from_json(cls, body):
165 166 167 168 169 170 171 172 173 174
        """
        :param body: json string or string encoded as utf-8
        :return:  Message object generated from the body
        :raises NonCompliantMessageFormatError: If the message cannot be build from the provided json
        """

        if type(body) is str:
            message_dict = json.loads(body)
        # Note: pika re-encodes json.dumps strings as utf-8 for some reason, the following line undoes this
        elif type(body) is bytes:
175
            message_dict = json.loads(body.decode("utf-8"))
176
        else:
177
            raise NonCompliantMessageFormatError("Not a Json")
178

179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
        # check fist if it's a response
        if "ok" in message_dict:
            # cannot build a complete reply message just from the json representation
            return

        return cls.from_dict(message_dict)

    @classmethod
    def from_dict(cls, message_dict):
        """
        :param body: dict
        :return:  Message object generated from the body
        :raises NonCompliantMessageFormatError: If the message cannot be build from the provided json
        """
        assert type(message_dict) is dict

195
        # check fist if it's a response
196
        if "ok" in message_dict:
197
            # cannot build a complete reply message just from the json representation
198
            return
199

200
        message_type = message_dict["_type"]
201

202 203 204
        if message_type in message_types_dict:
            return message_types_dict[message_type](**message_dict)
        else:
205 206
            raise NonCompliantMessageFormatError("Cannot load json message: %s" % str(message_dict))

207
    def __repr__(self):
208
        ret = "%s(" % self.__class__.__name__
209
        for key, value in self.to_dict().items():
210 211
            ret += "%s = %s, " % (key, value)
        ret += ")"
212 213
        return ret

214

215 216 217 218 219
class MsgReply(Message):
    """
    Auxiliary class which creates replies messages with fields based on the request.
    Routing key, corr_id and _type are generated based on the request message
    """
220

221 222 223 224 225 226 227
    def __init__(self, request_message, **kwargs):
        assert request_message

        self.routing_key = request_message.routing_key + ".reply"

        # if not data template, then let's build one for a reply
        # (possible when creating a MsgReply directly and not by using subclass)
228
        if not hasattr(self, "_msg_data_template"):
229
            self._msg_data_template = {
230
                "_type": request_message._type,
231
                "ok": True,
232 233
            }

234
        super(MsgReply, self).__init__(**kwargs)
235

236
        # overwrite correlation id template and attribute
237
        self._properties["correlation_id"] = request_message.correlation_id
238 239 240 241 242
        self.correlation_id = request_message.correlation_id


class MsgErrorReply(MsgReply):
    """
243
    see section "F-Interop conventions" on top
244
    """
245

246 247
    def __init__(self, request_message, **kwargs):
        assert request_message
248
        # msg_data_template doesnt include _type cause this class is generic, we can only get this at init from request
249
        # so, let's copy the _type from request and let the MsgReply handle the rest of the fields
250
        self._msg_data_template["_type"] = request_message._type
251
        super(MsgErrorReply, self).__init__(request_message, **kwargs)
252 253

    _msg_data_template = {
254
        "ok": False,
255
        "error_message": "Some error message TBD",
256
        "error_code": "Some error code TBD"
257 258
    }

Federico Sismondi's avatar
Federico Sismondi committed
259

260 261 262 263 264 265 266 267
# # # # # # CORE API # # # # #

class MsgOrchestratorVersionReq(Message):
    routing_key = "control.orchestrator.service"

    _msg_data_template = {
        "_type": "ochestrator.version.request"
    }
268

Federico Sismondi's avatar
Federico Sismondi committed
269

270
# # # # # # AGENT MESSAGES # # # # # #
Federico Sismondi's avatar
Federico Sismondi committed
271 272 273

class MsgAgentTunStart(Message):
    """
274
    Requirements: Testing Tool MAY implement (if IP tun needed)
Federico Sismondi's avatar
Federico Sismondi committed
275

276
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
277

278
    Pub/Sub: Testing Tool -> Agent
Federico Sismondi's avatar
Federico Sismondi committed
279

280
    Description: Message for triggering start IP tun interface in OS where the agent is running
Federico Sismondi's avatar
Federico Sismondi committed
281
    """
282
    routing_key = "control.tun.toAgent.agent_TT"
Federico Sismondi's avatar
Federico Sismondi committed
283 284

    _msg_data_template = {
285 286 287 288
        "_type": "tun.start",
        "name": "agent_TT",
        "ipv6_prefix": "bbbb",
        "ipv6_host": ":3",
289
        "ipv6_no_forwarding": False,
290 291 292
        "ipv4_host": None,
        "ipv4_network": None,
        "ipv4_netmask": None,
Federico Sismondi's avatar
Federico Sismondi committed
293 294 295
    }


296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
class MsgAgentSerialStarted(Message):
    """
    Description: Message for indicating that agent serial interface has been started

    Type: Event

    Pub/Sub: Testing Tool -> Agent

    Description: TBD
    """
    routing_key = "control.serial.from.tbd"

    _msg_data_template = {
        "_type": "serial.started",
        "name": "tbd",
        "port": "tbd",
        "boudrate": "tbd",
    }


Federico Sismondi's avatar
Federico Sismondi committed
316 317
class MsgAgentTunStarted(Message):
    """
318
    Description: Message for indicating that agent tun has been started
Federico Sismondi's avatar
Federico Sismondi committed
319

320
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
321

322
    Pub/Sub: Agent -> Testing Tool
Federico Sismondi's avatar
Federico Sismondi committed
323

324
    Description: TBD
Federico Sismondi's avatar
Federico Sismondi committed
325
    """
326
    routing_key = "control.tun.from.tbd"
Federico Sismondi's avatar
Federico Sismondi committed
327 328

    _msg_data_template = {
329 330 331 332 333 334 335
        "_type": "tun.started",
        "name": "agent_TT",
        "ipv6_prefix": "bbbb",
        "ipv6_host": ":3",
        "ipv4_host": None,
        "ipv4_network": None,
        "ipv4_netmask": None,
336
        "ipv6_no_forwarding": False,
Federico Sismondi's avatar
Federico Sismondi committed
337 338
    }

339

340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
class MsgPacketInjectRaw(Message):
    """
    Description: Message to be captured by the agent an push into the correct embedded interface (e.g. tun, serial, etc..)

    Type: Event

    Pub/Sub: Testing Tool -> Agent

    Description: TBD
    """
    routing_key = None  # depends on the agent_id and the agent interface being used, re-write after creation

    _msg_data_template = {
        "_type": "packet.to_inject.raw",
        "timestamp": "1488586183.45",
        "interface_name": "tun0",
        "data": [96, 0, 0, 0, 0, 36, 0, 1, 254, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 255, 2, 0, 0, 0, 0, 0, 0,
                 0, 0, 0, 0, 0, 0, 0, 22, 58, 0, 5, 2, 0, 0, 1, 0, 143, 0, 112, 7, 0, 0, 0, 1, 4, 0, 0, 0, 255, 2, 0, 0,
                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]}


361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379
class MsgPacketSniffedRaw(Message):
    """
    Description: Message captured by the agent in one of its embedded interfaces (e.g. tun, serial, etc..)

    Type: Event

    Pub/Sub: Agent -> Testing Tool

    Description: TBD
    """
    routing_key = None  # depends on the agent_id and the agent interface being used, re-write after creation

    _msg_data_template = {
        "_type": "packet.sniffed.raw",
        "timestamp": "1488586183.45",
        "interface_name": "tun0",
        "data": [96, 0, 0, 0, 0, 36, 0, 1, 254, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 255, 2, 0, 0, 0, 0, 0, 0,
                 0, 0, 0, 0, 0, 0, 0, 22, 58, 0, 5, 2, 0, 0, 1, 0, 143, 0, 112, 7, 0, 0, 0, 1, 4, 0, 0, 0, 255, 2, 0, 0,
                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]}
380

381 382

# # # # # # SESSION MESSAGES # # # # # #
383

384
class MsgTestingToolTerminate(Message):
385
    """
386
    Requirements: TT MUST listen to event, and handle a gracefully termination of all it's processes
Federico Sismondi's avatar
Federico Sismondi committed
387

388
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
389

390
    Pub/Sub: GUI, (or Orchestrator) -> Testing Tool
Federico Sismondi's avatar
Federico Sismondi committed
391

392
    Description: Testing tool should stop all it's processes gracefully.
393
    """
394
    routing_key = "control.session"
395 396

    _msg_data_template = {
397
        "_type": "testingtool.terminate",
398
        "description": "Event TERMINATE testing tool execution"
399 400 401 402 403
    }


class MsgTestingToolReady(Message):
    """
404
    Requirements: TT MUST publish event as soon as TT is up and listening on the event bus
Federico Sismondi's avatar
Federico Sismondi committed
405

406
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
407

408
    Pub/Sub: Testing Tool -> GUI
Federico Sismondi's avatar
Federico Sismondi committed
409

410
    Description: Used to indicate to the GUI that testing is ready to start the test suite
411
    """
412
    routing_key = "control.session"
413 414

    _msg_data_template = {
415 416
        "_type": "testingtool.ready",
        "description": "Event Testing tool READY to start test suite."
417 418 419 420 421
    }


class MsgTestingToolComponentReady(Message):
    """
422
    Requirements: Testing Tool SHOULD implement (other components should not subscribe to event)
Federico Sismondi's avatar
Federico Sismondi committed
423

424
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
425

426
    Pub/Sub: Any Testing tool's component -> Test Coordinator
Federico Sismondi's avatar
Federico Sismondi committed
427

428
    Description: Once a testing tool's component is ready, it should publish a compoennt ready message
429
    """
430
    routing_key = "control.session"
431 432

    _msg_data_template = {
433
        "_type": "testingtool.component.ready",
434
        "component": "SomeComponent",
435
        "description": "Component READY to start test suite."
436 437 438
    }


439 440 441 442 443 444 445 446 447 448
class MsgSessionChat(Message):
    """
    Requirements: GUI should implement

    Type: Event

    Pub/Sub: UI 1 (2) -> UI 2 (1)

    Description: Generic descriptor of chat messages
    """
449
    routing_key = "control.session"
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472

    _msg_data_template = {
        "_type": "chat",
        "user_name": "Ringo",
        "iut_node": "tbd",
        "description": "I've got blisters on my fingers!"
    }


class MsgSessionLog(Message):
    """
    Requirements: Testing Tool SHOULD implement

    Type: Event

    Pub/Sub: Any Testing tool's component -> user/devs interfaces

    Description: Generic descriptor of log messages
    """
    routing_key = "log.warning.the_drummer"

    _msg_data_template = {
        "_type": "log",
Federico Sismondi's avatar
Federico Sismondi committed
473
        "component": "misc",
474
        "message": "I've got blisters on my fingers!"
475 476 477
    }


478 479
class MsgSessionConfiguration(Message):
    """
480
    Requirements: TT MUST listen to event, and configure accordingly
481 482 483 484 485

    Type: Event

    Pub/Sub: Orchestrator -> Testing Tool

486
    Description: TT MUST listen to this message and configure the testsuite correspondingly
487 488
    """
    routing_key = "control.session"
489

490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507
    _msg_data_template = {
        "_type": "session.configuration",
        "session_id": "666",
        "configuration": {
            'testsuite.testcases': [
                'someTestCaseId1',
                'someTestCaseId2'
            ]
        },
        "testing_tools": "f-interop/someTestToolId",
        "users": [
            "u1",
            "f-interop"
        ],
    }


# TODO deprecate this in favor of the generic MsgSessionConfiguration
508
class MsgInteropSessionConfiguration(Message):
509
    """
510
    Requirements: TT MUST listen to event
Federico Sismondi's avatar
Federico Sismondi committed
511

512
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
513

514
    Pub/Sub: Orchestrator -> Testing Tool
Federico Sismondi's avatar
Federico Sismondi committed
515

516
    Description: TT MUST listen to this message and configure the testsuite correspondingly
517
    """
518
    routing_key = "control.session"
519 520

    _msg_data_template = {
521 522
        "_type": "session.interop.configuration",
        "session_id": "TBD",
523 524 525 526 527 528 529 530
        "configuration":
            {
                'testsuite.testcases': [
                    'http://doc.f-interop.eu/tests/TD_COAP_CORE_01',
                    'http://doc.f-interop.eu/tests/TD_COAP'
                ]
            },

531
        "testing_tools": "f-interop/interoperability-coap",
532
        "users": [
533 534 535
            "u1",
            "f-interop"
        ],
536
        "tests": [
537
            {
Federico Sismondi's avatar
Federico Sismondi committed
538
                "testcase_ref": "http://doc.f-interop.eu/tests/TD_COAP_CORE_01",
539
                "settings": {}
540 541
            },
            {
Federico Sismondi's avatar
Federico Sismondi committed
542
                "testcase_ref": "http://doc.f-interop.eu/tests/TD_COAP_CORE_02",
543 544 545
                "settings": {}
            },
            {
Federico Sismondi's avatar
Federico Sismondi committed
546
                "testcase_ref": "http://doc.f-interop.eu/tests/TD_COAP_CORE_03",
547
                "settings": {}
548 549 550 551 552
            }
        ]
    }


553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572
class MsgAgentConfigured(Message):
    """
    Requirements: Testing Tool SHOULD publish event

    Type: Event

    Pub/Sub: Testing Tool -> GUI

    Description: The goal is to notify GUI when agents are ready to start the session
    """

    routing_key = "control.session"

    _msg_data_template = {
        "_type": "agent.configured",
        "description": "Event agent successfully CONFIGURED",
        'name': 'agent_TT'
    }


573 574
class MsgTestingToolConfigured(Message):
    """
575
    Requirements: TT MUST publish event once session.configuration message has been processed.
Federico Sismondi's avatar
Federico Sismondi committed
576

577
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
578

579
    Pub/Sub: Testing Tool -> Orchestrator, GUI
Federico Sismondi's avatar
Federico Sismondi committed
580

581
    Description: The goal is to notify orchestrator and other components that the testing tool has been configured
582 583 584 585 586
    """

    routing_key = "control.session"

    _msg_data_template = {
587 588 589
        "_type": "testingtool.configured",
        "description": "Event Testing tool CONFIGURED",
        "session_id": "TBD",
590 591 592
        "testing_tools": "f-interop/interoperability-coap",
    }

593

594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614
class MsgSessionCreated(Message):
    """
    Requirements: Session Orchestrator MUST publish message on common-services channel (on every session creation)

    Type: Event

    Pub/Sub: SO -> viz tools

    Description: The goal is to notify viz tools about new sessions
    """

    routing_key = "control.session.created"

    _msg_data_template = {
        "_type": "session.created",
        "description": "A new session has been created",
        "session_id": "TBD",
        "testing_tools": "TBD",
    }


615 616
class MsgTestingToolComponentShutdown(Message):
    """
617
    Requirements: Testing Tool SHOULD implement (other components should not subscribe to event)
Federico Sismondi's avatar
Federico Sismondi committed
618

619
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
620

621
    Pub/Sub: Any Testing tool's component -> Test Coordinator
Federico Sismondi's avatar
Federico Sismondi committed
622

623 624
    Description: tbd
    """
625 626 627
    routing_key = "control.session"

    _msg_data_template = {
628
        "_type": "testingtool.component.shutdown",
629
        "component": "SomeComponent",
630
        "description": "Event Component SHUTDOWN. Bye!"
631 632
    }

633
    # # # # # # TEST COORDINATION MESSAGES # # # # # #
634

635 636 637

class MsgTestSuiteStart(Message):
    """
638
    Requirements: TT MUST listen to event and start the test suite right after reception. MsgTestSuiteStarted
Federico Sismondi's avatar
Federico Sismondi committed
639

640
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
641

642
    Pub/Sub: GUI -> Testing Tool
Federico Sismondi's avatar
Federico Sismondi committed
643

644
    Description: tbd
645 646
    """

647
    # TODO change to control.testsuite
648
    routing_key = "control.testcoordination"
649 650

    _msg_data_template = {
651
        "_type": "testcoordination.testsuite.start",
652
        "description": "Event test suite START"
653 654
    }

655

Federico Sismondi's avatar
Federico Sismondi committed
656 657 658 659 660 661 662 663 664 665 666
class MsgTestSuiteStarted(Message):
    """
    Requirements: Testing Tool SHOULD publish to event

    Type: Event

    Pub/Sub: Testing Tool -> GUI

    Description: tbd
    """

667
    # TODO change to control.testsuite
Federico Sismondi's avatar
Federico Sismondi committed
668 669 670 671 672 673
    routing_key = "control.testcoordination"

    _msg_data_template = {
        "_type": "testcoordination.testsuite.started",
        "description": "Event test suite STARTED"
    }
674

675

676 677
class MsgTestSuiteFinish(Message):
    """
678
    Requirements: TT MUST listen to event
Federico Sismondi's avatar
Federico Sismondi committed
679

680
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
681

682
    Pub/Sub: GUI -> Testing Tool
Federico Sismondi's avatar
Federico Sismondi committed
683

684
    Description: tbd
685 686
    """

687
    # TODO change to control.testsuite
688 689 690
    routing_key = "control.testcoordination"

    _msg_data_template = {
691
        "_type": "testcoordination.testsuite.finish",
692
        "description": "Event test suite FINISH"
693 694
    }

695

696 697
class MsgTestCaseReady(Message):
    """
698
    Requirements: TT MUST publish event
Federico Sismondi's avatar
Federico Sismondi committed
699

700
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
701

Federico Sismondi's avatar
Federico Sismondi committed
702
    Pub/Sub: Testing Tool -> GUI
Federico Sismondi's avatar
Federico Sismondi committed
703

704 705 706
    Description:
        - Used to indicate to the GUI (or automated-iut) which is the next test case to be executed.
        - This message is normally followed by a MsgTestCaseStart (from GUI-> Testing Tool)
707 708
    """

709
    # TODO change to control.testsuite
710
    routing_key = "control.testcoordination"
711 712

    _msg_data_template = {
713
        "_type": "testcoordination.testcase.ready",
Federico Sismondi's avatar
Federico Sismondi committed
714 715 716
        "description": "Next test case to be executed is TD_COAP_CORE_01",
        "testcase_id": "TD_COAP_CORE_01",
        "testcase_ref": "http://doc.f-interop.eu/tests/TD_COAP_CORE_01",
717 718
        "objective": "Perform GET transaction(CON mode)",
        "state": None
719 720 721
    }


722 723
class MsgTestCaseStart(Message):
    """
724
    Requirements: TT MUST listen to event
Federico Sismondi's avatar
Federico Sismondi committed
725

726
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
727

728
    Pub/Sub: GUI -> Testing Tool
Federico Sismondi's avatar
Federico Sismondi committed
729

730 731
    Description:
        - Message used for indicating the testing tool to start the test case (the one previously selected)
732 733
        - if testcase_id is Null then testing tool starts previously announced testcase in message
        "testcoordination.testcase.ready",
734
    """
735
    # TODO change to control.testsuite
736
    routing_key = "control.testcoordination"
737 738

    _msg_data_template = {
739
        "_type": "testcoordination.testcase.start",
740 741
        "description": "Event test case START",
        "testcase_id": "TBD",
742 743
    }

Federico Sismondi's avatar
Federico Sismondi committed
744

745 746 747 748 749 750 751 752 753 754 755
class MsgTestCaseStarted(Message):
    """
    Requirements: Testing Tool SHOULD publish event

    Type: Event

    Pub/Sub: Testing Tool -> GUI

    Description:
        - Message used for indicating that testcase has started
    """
756
    # TODO change to control.testsuite
757 758 759 760 761 762 763
    routing_key = "control.testcoordination"

    _msg_data_template = {
        "_type": "testcoordination.testcase.started",
        "description": "Event test case STARTED",
        "testcase_id": "TBD",
    }
764

Federico Sismondi's avatar
Federico Sismondi committed
765

766 767
# TODO MsgTestCaseNotes, see https://portal.etsi.org/cti/downloads/TestSpecifications/6LoWPAN_Plugtests_TestDescriptions_1.0.pdf

768

769 770
class MsgTestCaseConfiguration(Message):
    """
771
    Requirements: Testing Tool MAY publish event (if needed for executing the test case)
772 773 774 775 776 777
    Type: Event
    Pub/Sub: Testing Tool -> GUI & automated-iut
    Description:
        - Message used to indicate GUI and/or automated-iut which configuration to use.
        - IMPORTANT: deprecate this message in favor of MsgConfigurationExecute and MsgConfigurationExecuted
    """
778 779

    # TODO change to control.testsuite
780 781 782
    routing_key = "control.testcoordination"
    _msg_data_template = {
        "_type": "testcoordination.testcase.configuration",
Federico Sismondi's avatar
Federico Sismondi committed
783
        "configuration_id": "COAP_CFG_01",
784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813
        "node": "coap_server",
        "testcase_id": "TBD",
        "testcase_ref": "TBD",
        "description":
            ["CoAP servers running service at [bbbb::2]:5683",
             "CoAP servers are requested to offer the following resources",
             ["/test", "Default test resource", "Should not exceed 64bytes"],
             ["/seg1/seg2/seg3", "Long path ressource", "Should not exceed 64bytes"],
             ["/query", "Ressource accepting query parameters", "Should not exceed 64bytes"],
             ["/separate",
              "Ressource which cannot be served immediately and which cannot be "
              "acknowledged in a piggy-backed way",
              "Should not exceed 64bytes"],
             ["/large", "Large resource (>1024 bytes)", "shall not exceed 2048bytes"],
             ["/large_update",
              "Large resource that can be updated using PUT method (>1024 bytes)",
              "shall not exceed 2048bytes"],
             ["/large_create",
              "Large resource that can be  created using POST method (>1024 bytes)",
              "shall not exceed 2048bytes"],
             ["/obs", "Observable resource which changes every 5 seconds",
              "shall not exceed 2048bytes"],
             ["/.well-known/core", "CoRE Link Format", "may require usage of Block options"]
             ]
    }


class MsgConfigurationExecute(Message):
    """
    Requirements: Testing Tool MAY publish event (if needed for executing the test case)
Federico Sismondi's avatar
Federico Sismondi committed
814

815
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
816

817
    Pub/Sub: Testing Tool -> GUI & automated-iut
Federico Sismondi's avatar
Federico Sismondi committed
818

819 820
    Description:
        - Message used to indicate GUI and/or automated-iut which configuration to use.
821
    """
822 823

    # TODO change to control.testsuite
824 825 826
    routing_key = "control.testcoordination"

    _msg_data_template = {
827
        "_type": "testcoordination.configuration.execute",
Federico Sismondi's avatar
Federico Sismondi committed
828
        "configuration_id": "COAP_CFG_01",
829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852
        "node": "coap_server",
        "testcase_id": "TBD",
        "testcase_ref": "TBD",
        "description":
            ["CoAP servers running service at [bbbb::2]:5683",
             "CoAP servers are requested to offer the following resources",
             ["/test", "Default test resource", "Should not exceed 64bytes"],
             ["/seg1/seg2/seg3", "Long path ressource", "Should not exceed 64bytes"],
             ["/query", "Ressource accepting query parameters", "Should not exceed 64bytes"],
             ["/separate",
              "Ressource which cannot be served immediately and which cannot be "
              "acknowledged in a piggy-backed way",
              "Should not exceed 64bytes"],
             ["/large", "Large resource (>1024 bytes)", "shall not exceed 2048bytes"],
             ["/large_update",
              "Large resource that can be updated using PUT method (>1024 bytes)",
              "shall not exceed 2048bytes"],
             ["/large_create",
              "Large resource that can be  created using POST method (>1024 bytes)",
              "shall not exceed 2048bytes"],
             ["/obs", "Observable resource which changes every 5 seconds",
              "shall not exceed 2048bytes"],
             ["/.well-known/core", "CoRE Link Format", "may require usage of Block options"]
             ]
853 854 855
    }


856 857 858 859 860 861 862 863 864 865
class MsgConfigurationExecuted(Message):
    """
    Requirements: Testing Tool SHOULD listen to event

    Type: Event

    Pub/Sub: GUI (automated-IUT) -> Testing Tool

    Description:
        - Message used for indicating that the IUT has been configured as requested
866
        - pixit must be included in this message (pixit = Protocol Implementaiton eXtra Information for Testing)
867
    """
868 869

    # TODO change to control.testsuite
870 871 872 873 874
    routing_key = "control.testcoordination"

    _msg_data_template = {
        "_type": "testcoordination.configuration.executed",
        "description": "Event IUT has been configured",
875
        "node": "coap_server",
Federico Sismondi's avatar
Federico Sismondi committed
876
        "ipv6_address": "tbd"  # example of pixit
877 878 879
    }


880 881
class MsgTestCaseStop(Message):
    """
882
    Requirements: TT MUST listen to event
Federico Sismondi's avatar
Federico Sismondi committed
883

884
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
885

886
    Pub/Sub: GUI & automated-iut -> Testing Tool
Federico Sismondi's avatar
Federico Sismondi committed
887

888 889
    Description:
        - Message used for indicating the testing tool to stop the test case (the one running).
890 891
    """

892
    # TODO change to control.testsuite
893
    routing_key = "control.testcoordination"
894 895

    _msg_data_template = {
896
        "_type": "testcoordination.testcase.stop",
897
        "description": "Event test case STOP"
898 899 900 901 902
    }


class MsgTestCaseRestart(Message):
    """
903
    Requirements: TT MUST listen to event
Federico Sismondi's avatar
Federico Sismondi committed
904

905
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
906

907
    Pub/Sub: GUI -> Testing Tool
Federico Sismondi's avatar
Federico Sismondi committed
908

909
    Description: Restart the running test cases.
910 911
    """

912
    # TODO change to control.testsuite
913
    routing_key = "control.testcoordination"
914 915

    _msg_data_template = {
916
        "_type": "testcoordination.testcase.restart",
917
        "description": "Event test case RESTART"
918 919
    }

920

921
class MsgStepStimuliExecute(Message):
922
    """
923
    Requirements: TT MUST publish event
924

925
    Type: Event
926

927
    Pub/Sub: Testing Tool -> GUI
928

929
    Description:
930 931
        - Used to indicate to the GUI (or automated-iut) which is the stimuli step to be executed by the user (or
        automated-IUT).
932 933
    """

934
    # TODO change to control.testsuite
935
    routing_key = "control.testcoordination"
936 937

    _msg_data_template = {
938
        "_type": "testcoordination.step.stimuli.execute",
Federico Sismondi's avatar
Federico Sismondi committed
939 940
        "description": "Please execute TD_COAP_CORE_01_step_01",
        "step_id": "TD_COAP_CORE_01_step_01",
941 942
        "step_type": "stimuli",
        "step_info": [
943 944 945 946
            "Client is requested to send a GET request with",
            "Type = 0(CON)",
            "Code = 1(GET)"
        ],
947 948
        "step_state": "executing",
        "node": "coap_client",
949
        "node_execution_mode": "user_assisted",
950
        "testcase_id": "TBD",
Federico Sismondi's avatar
Federico Sismondi committed
951 952
        "testcase_ref": "TBD",
        "target_address": "TBD"
953 954
    }

955

956
class MsgStepStimuliExecuted(Message):
957
    """
958
    Requirements: TT MUST listen to event
Federico Sismondi's avatar
Federico Sismondi committed
959

960
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
961

962
    Pub/Sub: GUI (or automated-IUT)-> Testing Tool
Federico Sismondi's avatar
Federico Sismondi committed
963

964 965
    Description:
        - Used to indicate stimuli has been executed by user (and it's user-assisted iut) or by automated-iut
966 967
    """

968
    # TODO change to control.testsuite
969
    routing_key = "control.testcoordination"
970 971

    _msg_data_template = {
972
        "_type": "testcoordination.step.stimuli.executed",
973 974 975
        "description": "Event step (stimuli) EXECUTED",
        "node": "coap_client",
        "node_execution_mode": "user_assisted",
976 977 978
    }


979
class MsgStepCheckExecute(Message):
980
    """
981
    Requirements: Testing Tool SHOULD publish event
Federico Sismondi's avatar
Federico Sismondi committed
982

983
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
984

985
    Pub/Sub: Testing Tool -> Analysis
Federico Sismondi's avatar
Federico Sismondi committed
986

987 988 989 990 991
    Description:
        - Used to indicate to the GUI (or automated-iut) which is the stimuli step to be executed by the user (or
        automated-IUT).
    """

992
    # TODO change to control.testsuite
993 994 995 996
    routing_key = "control.testcoordination"

    _msg_data_template = {
        "_type": "testcoordination.step.check.execute",
Federico Sismondi's avatar
Federico Sismondi committed
997 998
        "description": "Please execute TD_COAP_CORE_01_step_02",
        "step_id": "TD_COAP_CORE_01_step_02",
999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015
        "step_type": "check",
        "step_info": [
            "The request sent by the client contains",
            "Type=0 and Code=1,"
            "Client-generated Message ID (➔ CMID)",
            "Client-generated Token (➔ CTOK)",
            "UTEST Uri-Path option test"
        ],
        "step_state": "executing",
        "testcase_id": "TBD",
        "testcase_ref": "TBD"
    }


class MsgStepCheckExecuted(Message):
    """
    Requirements: Testing Tool SHOULD implement
Federico Sismondi's avatar
Federico Sismondi committed
1016

1017
    Type: Event
Federico Sismondi's avatar
Federico Sismondi committed
1018

1019
    Pub/Sub: test coordination -> test analysis
Federico Sismondi's avatar
Federico Sismondi committed
1020

1021
    Description:
1022 1023
        - In the context of IUT to IUT test execution, this message is used for indicating that the previously
        executed
1024 1025
        messages (stimuli message and its reply) CHECK or comply to what is described in the Test Description.
        - Not used in CoAP testing Tool (analysis of traces is done post mortem)
1026 1027
    """

1028
    # TODO change to control.testsuite
1029
    routing_key = "control.testcoordination"
1030

1031
    _msg_data_template = {
1032
        "_type": "testcoordination.step.check.executed",
1033
        "partial_verdict": "pass",
1034
        "description": "TAT says: step complies (checks) with specification",
1035 1036 1037
    }


1038
class MsgStepVerifyExecute(Message):
1039
    """
1040
    Requirements: TT MUST publish event
Federico Sismondi's avatar
Federico Sismondi committed
1041

1042
    Type: Event