diff --git a/cache_test.py b/cache_test.py index 92c82d6..e105f91 100644 --- a/cache_test.py +++ b/cache_test.py @@ -1,8 +1,9 @@ from queue import Queue import random -import socket import threading import unittest +import time + from coapclient import HelperClient from coapforwardproxy import CoAPForwardProxy from coapserver import CoAPServer @@ -10,8 +11,6 @@ from coapthon import defines from coapthon.messages.option import Option from coapthon.messages.request import Request from coapthon.messages.response import Response -from coapthon.serializer import Serializer -import time __author__ = 'Emilio Vallati' __version__ = "1.0" @@ -459,7 +458,6 @@ class Tests(unittest.TestCase): expected.token = None expected.payload = None expected.etag = str(1) - expected.location_path = "etag" exchange3 = (req3, expected) diff --git a/coapthon/defines.py b/coapthon/defines.py index 094d001..09fff43 100644 --- a/coapthon/defines.py +++ b/coapthon/defines.py @@ -1,5 +1,6 @@ +# -*- coding: utf-8 -*- + import collections -import array import struct __author__ = 'Giacomo Tanganelli' @@ -167,7 +168,7 @@ class OptionRegistry(object): :return: option flags :rtype: 3-tuple (critical, unsafe, no-cache) """ - opt_bytes = array.array('B', '\0\0') + opt_bytes = bytearray(2) if option_num < 256: s = struct.Struct("!B") s.pack_into(opt_bytes, 0, option_num) diff --git a/coapthon/forward_proxy/coap.py b/coapthon/forward_proxy/coap.py index 8d29f8d..d974872 100644 --- a/coapthon/forward_proxy/coap.py +++ b/coapthon/forward_proxy/coap.py @@ -4,8 +4,6 @@ import socket import struct import threading -import os - from coapthon import defines from coapthon.layers.blocklayer import BlockLayer from coapthon.layers.cachelayer import CacheLayer diff --git a/coapthon/layers/resourcelayer.py b/coapthon/layers/resourcelayer.py index 41b5b81..863d69f 100644 --- a/coapthon/layers/resourcelayer.py +++ b/coapthon/layers/resourcelayer.py @@ -105,10 +105,12 @@ class ResourceLayer(object): if resource.etag is not None: transaction.response.etag = resource.etag - transaction.response.location_path = resource.path + if transaction.response.code == defines.Codes.CREATED.number: + # Only on CREATED according to RFC 7252 Chapter 5.8.2 POST + transaction.response.location_path = resource.path - if resource.location_query is not None and len(resource.location_query) > 0: - transaction.response.location_query = resource.location_query + if resource.location_query is not None and len(resource.location_query) > 0: + transaction.response.location_query = resource.location_query transaction.response.payload = None diff --git a/coapthon/reverse_proxy/coap.py b/coapthon/reverse_proxy/coap.py index e74346b..fbb7d26 100644 --- a/coapthon/reverse_proxy/coap.py +++ b/coapthon/reverse_proxy/coap.py @@ -4,7 +4,6 @@ import socket import struct import threading import xml.etree.ElementTree as ElementTree - import os import re @@ -173,7 +172,8 @@ class CoAP(object): host, port = response.source if response.code == defines.Codes.CONTENT.number: - resource = Resource('server', self, visible=True, observable=False, allow_children=True) + resource = RemoteResource('server', (host, port), "/", + coap_server=self, visible=True, observable=False, allow_children=True) self.add_resource(name, resource) self._mapping[name] = (host, port) self.parse_core_link_format(response.payload, name, (host, port)) @@ -209,8 +209,8 @@ class CoAP(object): dict_att[a[0]] = a[0] link_format = link_format[result.end(0) + 1:] # TODO handle observing - resource = RemoteResource('server', remote_server, path, coap_server=self, visible=True, observable=False, - allow_children=True) + resource = RemoteResource('server', remote_server, path, + coap_server=self, visible=True, observable=False, allow_children=True) resource.attributes = dict_att self.add_resource(base_path + "/" + path, resource) diff --git a/coapthon/serializer.py b/coapthon/serializer.py index 2d167d5..a92726f 100644 --- a/coapthon/serializer.py +++ b/coapthon/serializer.py @@ -1,6 +1,7 @@ import logging import struct import ctypes + from coapthon.messages.request import Request from coapthon.messages.response import Response from coapthon.messages.option import Option @@ -262,28 +263,6 @@ class Serializer(object): """ return defines.RESPONSE_CODE_LOWER_BOUND <= code <= defines.RESPONSE_CODE_UPPER_BOUND - @staticmethod - def read_option_value_from_nibble(nibble, pos, values): - """ - Calculates the value used in the extended option fields. - - :param nibble: the 4-bit option header value. - :return: the value calculated from the nibble and the extended option value. - """ - if nibble <= 12: - return nibble, pos - elif nibble == 13: - tmp = struct.unpack("!B", values[pos].to_bytes(1, "big"))[0] + 13 - pos += 1 - return tmp, pos - elif nibble == 14: - s = struct.Struct("!H") - tmp = s.unpack_from(values[pos:].to_bytes(2, "big"))[0] + 269 - pos += 2 - return tmp, pos - else: - raise AttributeError("Unsupported option nibble " + str(nibble)) - @staticmethod def read_option_value_len_from_byte(byte, pos, values): """ @@ -303,7 +282,7 @@ class Serializer(object): pos += 1 elif h_nibble == 14: s = struct.Struct("!H") - value = s.unpack_from(values[pos:].to_bytes(2, "big"))[0] + 269 + value = s.unpack_from(values[pos:pos+2])[0] + 269 pos += 2 else: raise AttributeError("Unsupported option number nibble " + str(h_nibble)) @@ -315,7 +294,7 @@ class Serializer(object): pos += 1 elif l_nibble == 14: s = struct.Struct("!H") - length = s.unpack_from(values[pos:].to_bytes(2, "big"))[0] + 269 + length = s.unpack_from(values[pos:pos+2])[0] + 269 pos += 2 else: raise AttributeError("Unsupported option length nibble " + str(l_nibble)) diff --git a/coverage_test.py b/coverage_test.py index 94e8c1c..6f6b6c0 100644 --- a/coverage_test.py +++ b/coverage_test.py @@ -1,14 +1,14 @@ -import os -import logging.config +# -*- coding: utf-8 -*- + from queue import Queue import random import socket import threading import unittest + from coapclient import HelperClient from coapserver import CoAPServer from coapthon import defines -from coapthon.utils import create_logging from coapthon.messages.message import Message from coapthon.messages.option import Option from coapthon.messages.request import Request @@ -60,10 +60,6 @@ PAYLOAD = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam no "erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd " \ "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet." -if not os.path.isfile("logging.conf"): - create_logging() -logging.config.fileConfig("logging.conf", disable_existing_loggers=False) - class Tests(unittest.TestCase): @@ -271,88 +267,86 @@ class Tests(unittest.TestCase): self.current_mid += 1 self._test_with_client([exchange1, exchange2, exchange3, exchange4]) - # def test_separate(self): - # print "TEST_SEPARATE" - # path = "/separate" - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["CON"] - # expected._mid = None - # expected.code = defines.Codes.CONTENT.number - # expected.token = None - # expected.max_age = 60 - # - # exchange1 = (req, expected) - # - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "POST" - # - # expected = Response() - # expected.type = defines.Types["CON"] - # expected._mid = None - # expected.code = defines.Codes.CHANGED.number - # expected.token = None - # expected.options = None - # - # exchange2 = (req, expected) - # - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.PUT.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "PUT" - # - # expected = Response() - # expected.type = defines.Types["CON"] - # expected._mid = None - # expected.code = defines.Codes.CHANGED.number - # expected.token = None - # expected.options = None - # - # exchange3 = (req, expected) - # - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.DELETE.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["CON"] - # expected._mid = None - # expected.code = defines.Codes.DELETED.number - # expected.token = None - # - # exchange4 = (req, expected) - # - # self.current_mid += 1 - # self._test_with_client([exchange1, exchange2, exchange3, exchange4]) + def test_separate(self): + print("TEST_SEPARATE") + path = "/separate" + + req = Request() + req.code = defines.Codes.GET.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["CON"] + expected._mid = None + expected.code = defines.Codes.CONTENT.number + expected.token = None + expected.max_age = 60 + + exchange1 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.POST.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "POST" + + expected = Response() + expected.type = defines.Types["CON"] + expected._mid = None + expected.code = defines.Codes.CHANGED.number + expected.token = None + expected.options = None + + exchange2 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.PUT.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "PUT" + + expected = Response() + expected.type = defines.Types["CON"] + expected._mid = None + expected.code = defines.Codes.CHANGED.number + expected.token = None + expected.options = None + + exchange3 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.DELETE.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["CON"] + expected._mid = None + expected.code = defines.Codes.DELETED.number + expected.token = None + + exchange4 = (req, expected) + self.current_mid += 1 + + self._test_with_client([exchange1, exchange2, exchange3, exchange4]) def test_post(self): print("TEST_POST") path = "/storage/new_res?id=1" - req = Request() + req = Request() req.code = defines.Codes.POST.number req.uri_path = path req.type = defines.Types["CON"] @@ -743,7 +737,8 @@ class Tests(unittest.TestCase): exchange8 = (req, expected) self.current_mid += 1 - self._test_plugtest([exchange0, exchange1, exchange2, exchange3, exchange4, exchange5, exchange6, exchange7, exchange8]) + self._test_plugtest([exchange0, exchange1, exchange2, exchange3, exchange4, + exchange5, exchange6, exchange7, exchange8]) def test_post_block_big(self): print("TEST_POST_BLOCK_BIG") @@ -884,7 +879,6 @@ class Tests(unittest.TestCase): expected.code = defines.Codes.CHANGED.number expected.token = None expected.payload = None - expected.location_path = "big" exchange7 = (req, expected) self.current_mid += 1 @@ -969,75 +963,74 @@ class Tests(unittest.TestCase): self._test_with_client([exchange1, exchange2, exchange3]) - # def test_long_options(self): - # """ - # Test processing of options with extended length - # """ - # print("TEST_LONG_OPTIONS") - # - # path = "/storage/" - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # option = Option() - # # This option should be silently ignored by the server - # # since it is not critical - # option.number = defines.OptionRegistry.RM_MESSAGE_SWITCHING.number - # option.value = "\1\1\1\1\0\0" - # options = req.options - # req.add_option(option) - # req.payload = "test" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected.code = defines.Codes.CONTENT.number - # expected.token = None - # expected.payload = None - # - # exchange1 = (req, expected) - # self.current_mid += 1 - # - # self._test_with_client([exchange1]) - # - # # This option (244) should be silently ignored by the server - # req = ("\x40\x01\x01\x01\xd6\xe7\x01\x01\x01\x01\x00\x00", self.server_address) - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = None - # expected.code = defines.Codes.NOT_FOUND.number - # expected.token = None - # expected.payload = None - # - # exchange21 = (req, expected) - # self.current_mid += 1 - # - # # This option (245) should cause BAD REQUEST, as unrecognizable critical - # req = ("\x40\x01\x01\x01\xd6\xe8\x01\x01\x01\x01\x00\x00", self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange22 = (req, expected) - # self.current_mid += 1 - # - # # This option (65525) should cause BAD REQUEST, as unrecognizable critical - # req = ("\x40\x01\x01\x01\xe6\xfe\xe8\x01\x01\x01\x01\x00\x00", self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange23 = (req, expected) - # self.current_mid += 1 - # - # self._test_datagram([exchange21, exchange22, exchange23]) + def test_long_options(self): + """ + Test processing of options with extended length + """ + print("TEST_LONG_OPTIONS") + path = "/storage/" + + req = Request() + req.code = defines.Codes.GET.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + option = Option() + # This option should be silently ignored by the server + # since it is not critical + option.number = defines.OptionRegistry.RM_MESSAGE_SWITCHING.number + option.value = b'\1\1\1\1\0\0' + req.add_option(option) + req.payload = "test" + + expected = Response() + expected.type = defines.Types["ACK"] + expected.code = defines.Codes.CONTENT.number + expected.token = None + expected.payload = None + + exchange1 = (req, expected) + self.current_mid += 1 + + self._test_with_client([exchange1]) + + # This option (244) should be silently ignored by the server + req = (b'\x40\x01\x01\x01\xd6\xe7\x01\x01\x01\x01\x00\x00', self.server_address) + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = None + expected.code = defines.Codes.NOT_FOUND.number + expected.token = None + expected.payload = None + + exchange21 = (req, expected) + self.current_mid += 1 + + # This option (245) should cause BAD REQUEST, as unrecognizable critical + req = (b'\x40\x01\x01\x01\xd6\xe8\x01\x01\x01\x01\x00\x00', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange22 = (req, expected) + self.current_mid += 1 + + # This option (65525) should cause BAD REQUEST, as unrecognizable critical + req = (b'\x40\x01\x01\x01\xe6\xfe\xe8\x01\x01\x01\x01\x00\x00', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange23 = (req, expected) + self.current_mid += 1 + + self._test_datagram([exchange21, exchange22, exchange23]) def test_content_type(self): print("TEST_CONTENT_TYPE") @@ -1226,9 +1219,8 @@ class Tests(unittest.TestCase): exchange10 = (req, expected) self.current_mid += 1 - # self._test_with_client([exchange1, exchange2, exchange3, exchange4, exchange5, exchange6, exchange7, - # exchange8, exchange9, exchange10]) - self._test_with_client([exchange1, exchange2, exchange3, exchange4, exchange5]) + self._test_with_client([exchange1, exchange2, exchange3, exchange4, exchange5, + exchange6, exchange7, exchange8, exchange9, exchange10]) def test_ETAG(self): print("TEST_ETAG") @@ -1266,7 +1258,6 @@ class Tests(unittest.TestCase): expected.code = defines.Codes.CHANGED.number expected.token = None expected.payload = None - expected.location_path = path expected.etag = "1" exchange2 = (req, expected) @@ -1329,7 +1320,7 @@ class Tests(unittest.TestCase): expected.code = defines.Codes.CREATED.number expected.token = None expected.payload = None - expected.location_path = path + expected.location_path = "child" exchange1 = (req, expected) self.current_mid += 1 @@ -1464,60 +1455,60 @@ class Tests(unittest.TestCase): self._test_with_client([exchange1, exchange2, exchange3, exchange4]) - # def test_invalid(self): - # print("TEST_INVALID") - # - # # version - # req = ("\x00\x01\x8c\xda", self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange1 = (req, expected) - # - # # version - # req = ("\x40", self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange2 = (req, expected) - # - # # code - # req = ("\x40\x05\x8c\xda", self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange3 = (req, expected) - # - # # option - # req = ("\x40\x01\x8c\xda\x94", self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange4 = (req, expected) - # - # # payload marker - # req = ("\x40\x02\x8c\xda\x75\x62\x61\x73\x69\x63\xff", self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange5 = (req, expected) - # - # self._test_datagram([exchange1, exchange2, exchange3, exchange4, exchange5]) + def test_invalid(self): + print("TEST_INVALID") + + # version + req = (b'\x00\x01\x8c\xda', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange1 = (req, expected) + + # version + req = (b'\x40', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange2 = (req, expected) + + # code + req = (b'\x40\x05\x8c\xda', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange3 = (req, expected) + + # option + req = (b'\x40\x01\x8c\xda\x94', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange4 = (req, expected) + + # payload marker + req = (b'\x40\x02\x8c\xda\x75\x62\x61\x73\x69\x63\xff', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange5 = (req, expected) + + self._test_datagram([exchange1, exchange2, exchange3, exchange4, exchange5]) def test_post_block_big_client(self): print("TEST_POST_BLOCK_BIG_CLIENT") @@ -1599,6 +1590,6 @@ class Tests(unittest.TestCase): self._test_with_client_observe([exchange1, exchange2]) + if __name__ == '__main__': unittest.main() - diff --git a/coverage_testIPv6.py b/coverage_testIPv6.py index d0a1381..2bc6572 100644 --- a/coverage_testIPv6.py +++ b/coverage_testIPv6.py @@ -1,7 +1,10 @@ +# -*- coding: utf-8 -*- + from queue import Queue import random import threading import unittest + from coapclient import HelperClient from coapserver import CoAPServer from coapthon import defines @@ -89,6 +92,7 @@ class Tests(unittest.TestCase): def test_not_allowed(self): print("TEST_NOT_ALLOWED") path = "/void" + req = Request() req.code = defines.Codes.GET.number req.uri_path = path @@ -103,7 +107,6 @@ class Tests(unittest.TestCase): expected.token = None exchange1 = (req, expected) - self.current_mid += 1 req = Request() @@ -120,7 +123,6 @@ class Tests(unittest.TestCase): expected.token = None exchange2 = (req, expected) - self.current_mid += 1 req = Request() @@ -137,7 +139,6 @@ class Tests(unittest.TestCase): expected.token = None exchange3 = (req, expected) - self.current_mid += 1 req = Request() @@ -154,11 +155,10 @@ class Tests(unittest.TestCase): expected.token = None exchange4 = (req, expected) - self.current_mid += 1 + self._test_with_client([exchange1, exchange2, exchange3, exchange4]) if __name__ == '__main__': unittest.main() - diff --git a/coverage_test_advanced.py b/coverage_test_advanced.py index e576b3c..cf189d5 100644 --- a/coverage_test_advanced.py +++ b/coverage_test_advanced.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + import threading import unittest from queue import Queue @@ -61,6 +63,7 @@ class Tests(unittest.TestCase): def test_advanced(self): print("TEST_ADVANCED") path = "/advanced" + req = Request() req.code = defines.Codes.GET.number req.uri_path = path @@ -76,7 +79,6 @@ class Tests(unittest.TestCase): expected.token = None exchange1 = (req, expected) - self.current_mid += 1 req = Request() @@ -94,7 +96,6 @@ class Tests(unittest.TestCase): expected.token = None exchange2 = (req, expected) - self.current_mid += 1 req = Request() @@ -112,7 +113,6 @@ class Tests(unittest.TestCase): expected.token = None exchange3 = (req, expected) - self.current_mid += 1 req = Request() @@ -130,13 +130,14 @@ class Tests(unittest.TestCase): expected.token = None exchange4 = (req, expected) - self.current_mid += 1 + self._test_with_client([exchange1, exchange2, exchange3, exchange4]) def test_advanced_separate(self): print("TEST_ADVANCED_SEPARATE") path = "/advancedSeparate" + req = Request() req.code = defines.Codes.GET.number req.uri_path = path @@ -152,7 +153,6 @@ class Tests(unittest.TestCase): expected.token = None exchange1 = (req, expected) - self.current_mid += 1 req = Request() @@ -170,7 +170,6 @@ class Tests(unittest.TestCase): expected.token = None exchange2 = (req, expected) - self.current_mid += 1 req = Request() @@ -188,7 +187,6 @@ class Tests(unittest.TestCase): expected.token = None exchange3 = (req, expected) - self.current_mid += 1 req = Request() @@ -206,9 +204,10 @@ class Tests(unittest.TestCase): expected.token = None exchange4 = (req, expected) - self.current_mid += 1 + self._test_with_client([exchange1, exchange2, exchange3, exchange4]) + if __name__ == '__main__': unittest.main() diff --git a/coverage_test_multicast.py b/coverage_test_multicast.py index 812221a..0435c01 100644 --- a/coverage_test_multicast.py +++ b/coverage_test_multicast.py @@ -1,11 +1,13 @@ +# -*- coding: utf-8 -*- + from queue import Queue import random import threading import unittest + from coapclient import HelperClient from coapserver import CoAPServer from coapthon import defines -from coapthon.messages.message import Message from coapthon.messages.option import Option from coapthon.messages.request import Request from coapthon.messages.response import Response @@ -90,6 +92,7 @@ class Tests(unittest.TestCase): def test_not_allowed(self): print("TEST_NOT_ALLOWED") path = "/void" + req = Request() req.code = defines.Codes.GET.number req.uri_path = path @@ -104,7 +107,6 @@ class Tests(unittest.TestCase): expected.token = None exchange1 = (req, expected) - self.current_mid += 1 req = Request() @@ -121,7 +123,6 @@ class Tests(unittest.TestCase): expected.token = None exchange2 = (req, expected) - self.current_mid += 1 req = Request() @@ -138,7 +139,6 @@ class Tests(unittest.TestCase): expected.token = None exchange3 = (req, expected) - self.current_mid += 1 req = Request() @@ -155,11 +155,10 @@ class Tests(unittest.TestCase): expected.token = None exchange4 = (req, expected) - self.current_mid += 1 + self._test_with_client([exchange1, exchange2, exchange3, exchange4]) if __name__ == '__main__': unittest.main() - diff --git a/coverage_test_multicast_ipv6.py b/coverage_test_multicast_ipv6.py index da427d2..56ee483 100644 --- a/coverage_test_multicast_ipv6.py +++ b/coverage_test_multicast_ipv6.py @@ -1,11 +1,13 @@ +# -*- coding: utf-8 -*- + from queue import Queue import random import threading import unittest + from coapclient import HelperClient from coapserver import CoAPServer from coapthon import defines -from coapthon.messages.message import Message from coapthon.messages.option import Option from coapthon.messages.request import Request from coapthon.messages.response import Response @@ -90,6 +92,7 @@ class Tests(unittest.TestCase): def test_not_allowed(self): print("TEST_NOT_ALLOWED") path = "/void" + req = Request() req.code = defines.Codes.GET.number req.uri_path = path @@ -104,7 +107,6 @@ class Tests(unittest.TestCase): expected.token = None exchange1 = (req, expected) - self.current_mid += 1 req = Request() @@ -121,7 +123,6 @@ class Tests(unittest.TestCase): expected.token = None exchange2 = (req, expected) - self.current_mid += 1 req = Request() @@ -138,7 +139,6 @@ class Tests(unittest.TestCase): expected.token = None exchange3 = (req, expected) - self.current_mid += 1 req = Request() @@ -155,11 +155,10 @@ class Tests(unittest.TestCase): expected.token = None exchange4 = (req, expected) - self.current_mid += 1 + self._test_with_client([exchange1, exchange2, exchange3, exchange4]) if __name__ == '__main__': unittest.main() - diff --git a/coverage_test_proxy.py b/coverage_test_proxy.py index e40f007..8642c82 100644 --- a/coverage_test_proxy.py +++ b/coverage_test_proxy.py @@ -1,8 +1,11 @@ +# -*- coding: utf-8 -*- + from queue import Queue import random import socket import threading import unittest + from coapclient import HelperClient from coapforwardproxy import CoAPForwardProxy from coapserver import CoAPServer @@ -159,14 +162,13 @@ class Tests(unittest.TestCase): def test_get_forward(self): print("TEST_GET_FORWARD") - path = "/basic" + req = Request() req.code = defines.Codes.GET.number - req.uri_path = path + req.proxy_uri = "coap://127.0.0.1:5684/basic" req.type = defines.Types["CON"] req._mid = self.current_mid req.destination = self.server_address - req.proxy_uri = "coap://127.0.0.1:5684/basic" expected = Response() expected.type = defines.Types["ACK"] @@ -176,93 +178,88 @@ class Tests(unittest.TestCase): expected.payload = "Basic Resource" exchange1 = (req, expected) - self.current_mid += 1 self._test_with_client([exchange1]) - # def test_separate(self): - # print "TEST_SEPARATE" - # path = "/separate" - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["CON"] - # expected._mid = None - # expected.code = defines.Codes.CONTENT.number - # expected.token = None - # expected.max_age = 60 - # - # exchange1 = (req, expected) - # - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "POST" - # - # expected = Response() - # expected.type = defines.Types["CON"] - # expected._mid = None - # expected.code = defines.Codes.CREATED.number - # expected.token = None - # expected.options = None - # - # exchange2 = (req, expected) - # - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.PUT.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "PUT" - # - # expected = Response() - # expected.type = defines.Types["CON"] - # expected._mid = None - # expected.code = defines.Codes.CHANGED.number - # expected.token = None - # expected.options = None - # - # exchange3 = (req, expected) - # - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.DELETE.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["CON"] - # expected._mid = None - # expected.code = defines.Codes.DELETED.number - # expected.token = None - # - # exchange4 = (req, expected) - # - # self.current_mid += 1 - # self._test_with_client([exchange1, exchange2, exchange3, exchange4]) - # + def test_separate(self): + print("TEST_SEPARATE") + + req = Request() + req.code = defines.Codes.GET.number + req.proxy_uri = "coap://127.0.0.1:5684/separate" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["CON"] + expected._mid = None + expected.code = defines.Codes.CONTENT.number + expected.token = None + expected.max_age = 60 + + exchange1 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.POST.number + req.proxy_uri = "coap://127.0.0.1:5684/separate" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "POST" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CHANGED.number + expected.token = None + expected.options = None + + exchange2 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.PUT.number + req.proxy_uri = "coap://127.0.0.1:5684/separate" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "PUT" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CHANGED.number + expected.token = None + expected.options = None + + exchange3 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.DELETE.number + req.proxy_uri = "coap://127.0.0.1:5684/separate" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.DELETED.number + expected.token = None + + exchange4 = (req, expected) + self.current_mid += 1 + + self._test_with_client([exchange1, exchange2, exchange3, exchange4]) + def test_post(self): print("TEST_POST") - path = "/storage/new_res?id=1" - req = Request() + req = Request() req.code = defines.Codes.POST.number req.type = defines.Types["CON"] req._mid = self.current_mid @@ -358,8 +355,8 @@ class Tests(unittest.TestCase): def test_post_block(self): print("TEST_POST_BLOCK") - req = Request() + req = Request() req.code = defines.Codes.POST.number req.proxy_uri = "coap://127.0.0.1:5684/storage/new_res" req.type = defines.Types["CON"] @@ -665,8 +662,8 @@ class Tests(unittest.TestCase): def test_post_block_big(self): print("TEST_POST_BLOCK_BIG") - req = Request() + req = Request() req.code = defines.Codes.POST.number req.proxy_uri = "coap://127.0.0.1:5684/big" req.type = defines.Types["CON"] @@ -820,501 +817,495 @@ class Tests(unittest.TestCase): expected.code = defines.Codes.CHANGED.number expected.token = None expected.payload = None - expected.location_path = "big" exchange7 = (req, expected) self.current_mid += 1 self._test_plugtest([exchange1, exchange2, exchange3, exchange4, exchange5, exchange6, exchange7]) - # def test_options(self): - # print "TEST_OPTIONS" - # path = "/storage/new_res" - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # option = Option() - # option.number = defines.OptionRegistry.ETAG.number - # option.value = "test" - # req.add_option(option) - # req.del_option(option) - # req.payload = "test" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CREATED.number - # expected.token = None - # expected.payload = None - # expected.location_path = "storage/new_res" - # - # exchange1 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # option = Option() - # option.number = defines.OptionRegistry.ETAG.number - # option.value = "test" - # req.add_option(option) - # req.del_option_by_name("ETag") - # req.payload = "test" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CREATED.number - # expected.token = None - # expected.payload = None - # expected.location_path = "storage/new_res" - # - # exchange2 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # option = Option() - # option.number = defines.OptionRegistry.ETAG.number - # option.value = "test" - # req.add_option(option) - # del req.etag - # req.payload = "test" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CREATED.number - # expected.token = None - # expected.payload = None - # expected.location_path = "storage/new_res" - # - # exchange3 = (req, expected) - # self.current_mid += 1 - # - # self._test_with_client([exchange1, exchange2, exchange3]) - # - # def test_content_type(self): - # print "TEST_CONTENT_TYPE" - # path = "/storage/new_res" - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "test" - # req.content_type = defines.Content_types["application/xml"] - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CREATED.number - # expected.token = None - # expected.payload = None - # expected.location_path = "storage/new_res" - # - # exchange1 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CONTENT.number - # expected.token = None - # expected.payload = "Basic Resource" - # - # exchange2 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.PUT.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "test" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CHANGED.number - # expected.token = None - # expected.payload = None - # - # exchange3 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CONTENT.number - # expected.token = None - # expected.payload = "test" - # - # exchange4 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.accept = defines.Content_types["application/xml"] - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CONTENT.number - # expected.token = None - # expected.payload = "test" - # - # exchange5 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.accept = defines.Content_types["application/json"] - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.NOT_ACCEPTABLE.number - # expected.token = None - # expected.payload = None - # expected.content_type = defines.Content_types["application/json"] - # - # exchange6 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = "/xml" - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CONTENT.number - # expected.token = None - # expected.payload = "0" - # expected.content_type = defines.Content_types["application/xml"] - # - # print(expected.pretty_print()) - # - # exchange7 = (req, expected) - # self.current_mid += 1 - # - # self._test_with_client([exchange1, exchange2, exchange3, exchange4, exchange5, exchange6, exchange7]) - # - # def test_ETAG(self): - # print "TEST_ETAG" - # path = "/etag" - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CONTENT.number - # expected.token = None - # expected.payload = "ETag resource" - # expected.etag = "0" - # - # exchange1 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "test" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CREATED.number - # expected.token = None - # expected.payload = None - # expected.location_path = path - # expected.etag = "1" - # - # exchange2 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.etag = "1" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.VALID.number - # expected.token = None - # expected.payload = "test" - # expected.etag = "1" - # - # exchange3 = (req, expected) - # self.current_mid += 1 - # - # self._test_with_client([exchange1, exchange2, exchange3]) - # - # def test_child(self): - # print "TEST_CHILD" - # path = "/child" - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "test" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CREATED.number - # expected.token = None - # expected.payload = None - # expected.location_path = path - # - # exchange1 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CONTENT.number - # expected.token = None - # expected.payload = "test" - # - # exchange2 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.PUT.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "testPUT" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CHANGED.number - # expected.token = None - # expected.payload = None - # - # exchange3 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.DELETE.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.DELETED.number - # expected.token = None - # expected.payload = None - # - # exchange4 = (req, expected) - # self.current_mid += 1 - # - # self._test_with_client([exchange1, exchange2, exchange3, exchange4]) - # - # def test_not_found(self): - # print "TEST_not_found" - # path = "/not_found" - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.token = 100 - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.NOT_FOUND.number - # expected.token = "100" - # expected.payload = None - # - # exchange1 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "test" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.METHOD_NOT_ALLOWED.number - # expected.token = None - # - # exchange2 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.PUT.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "testPUT" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.NOT_FOUND.number - # expected.token = None - # expected.payload = None - # - # exchange3 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.DELETE.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.NOT_FOUND.number - # expected.token = None - # expected.payload = None - # - # exchange4 = (req, expected) - # self.current_mid += 1 - # - # self._test_with_client([exchange1, exchange2, exchange3, exchange4]) - # - # def test_invalid(self): - # print("TEST_INVALID") - # - # # version - # req = (bytes("\x00\x01\x8c\xda", "utf-8"), self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange1 = (req, expected) - # - # # version - # req = (bytes("\x40", "utf-8"), self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange2 = (req, expected) - # - # # code - # req = (bytes("\x40\x05\x8c\xda", "utf-8"), self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange3 = (req, expected) - # - # # option - # req = (bytes("\x40\x01\x8c\xda\x94", "utf-8"), self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange4 = (req, expected) - # - # # payload marker - # req = (bytes("\x40\x02\x8c\xda\x75\x62\x61\x73\x69\x63\xff", "utf-8"), self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange5 = (req, expected) - # - # self._test_datagram([exchange1, exchange2, exchange3, exchange4, exchange5]) + def test_options(self): + print("TEST_OPTIONS") + path = "/storage/new_res" + + req = Request() + req.code = defines.Codes.POST.number + req.proxy_uri = "coap://127.0.0.1:5684/storage/new_res" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + option = Option() + option.number = defines.OptionRegistry.ETAG.number + option.value = "test" + req.add_option(option) + req.del_option(option) + req.payload = "test" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CREATED.number + expected.token = None + expected.payload = None + expected.location_path = "storage/new_res" + + exchange1 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.POST.number + req.proxy_uri = "coap://127.0.0.1:5684/storage/new_res" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + option = Option() + option.number = defines.OptionRegistry.ETAG.number + option.value = "test" + req.add_option(option) + req.del_option_by_name("ETag") + req.payload = "test" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CREATED.number + expected.token = None + expected.payload = None + expected.location_path = "storage/new_res" + + exchange2 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.POST.number + req.proxy_uri = "coap://127.0.0.1:5684/storage/new_res" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + option = Option() + option.number = defines.OptionRegistry.ETAG.number + option.value = "test" + req.add_option(option) + del req.etag + req.payload = "test" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CREATED.number + expected.token = None + expected.payload = None + expected.location_path = "storage/new_res" + + exchange3 = (req, expected) + self.current_mid += 1 + + self._test_with_client([exchange1, exchange2, exchange3]) + + def test_content_type(self): + print("TEST_CONTENT_TYPE") + + req = Request() + req.code = defines.Codes.POST.number + req.proxy_uri = "coap://127.0.0.1:5684/storage/new_res" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "test" + req.content_type = defines.Content_types["application/xml"] + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CREATED.number + expected.token = None + expected.payload = None + expected.location_path = "storage/new_res" + + exchange1 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.GET.number + req.proxy_uri = "coap://127.0.0.1:5684/storage/new_res" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CONTENT.number + expected.token = None + expected.payload = "Basic Resource" + + exchange2 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.PUT.number + req.proxy_uri = "coap://127.0.0.1:5684/storage/new_res" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "test" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CHANGED.number + expected.token = None + expected.payload = None + + exchange3 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.GET.number + req.proxy_uri = "coap://127.0.0.1:5684/storage/new_res" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CONTENT.number + expected.token = None + expected.payload = "test" + + exchange4 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.GET.number + req.proxy_uri = "coap://127.0.0.1:5684/storage/new_res" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.accept = defines.Content_types["application/xml"] + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CONTENT.number + expected.token = None + expected.payload = "test" + + exchange5 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.GET.number + req.proxy_uri = "coap://127.0.0.1:5684/storage/new_res" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.accept = defines.Content_types["application/json"] + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.NOT_ACCEPTABLE.number + expected.token = None + expected.payload = None + # expected.content_type = defines.Content_types["application/json"] + + exchange6 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.GET.number + req.proxy_uri = "coap://127.0.0.1:5684/xml" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CONTENT.number + expected.token = None + expected.payload = "0" + expected.content_type = defines.Content_types["application/xml"] + + print(expected.pretty_print()) + + exchange7 = (req, expected) + self.current_mid += 1 + + self._test_with_client([exchange1, exchange2, exchange3, exchange4, exchange5, exchange6, exchange7]) + + def test_ETAG(self): + print("TEST_ETAG") + + req = Request() + req.code = defines.Codes.GET.number + req.proxy_uri = "coap://127.0.0.1:5684/etag" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CONTENT.number + expected.token = None + expected.payload = "ETag resource" + expected.etag = "0" + + exchange1 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.POST.number + req.proxy_uri = "coap://127.0.0.1:5684/etag" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "test" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CHANGED.number + expected.token = None + expected.payload = None + expected.etag = "1" + + exchange2 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.GET.number + req.proxy_uri = "coap://127.0.0.1:5684/etag" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.etag = "1" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.VALID.number + expected.token = None + expected.payload = None + expected.etag = "1" + + exchange3 = (req, expected) + self.current_mid += 1 + + self._test_with_client([exchange1, exchange2, exchange3]) + + def test_child(self): + print("TEST_CHILD") + + req = Request() + req.code = defines.Codes.POST.number + req.proxy_uri = "coap://127.0.0.1:5684/child" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "test" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CREATED.number + expected.token = None + expected.payload = None + expected.location_path = "child" + + exchange1 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.GET.number + req.proxy_uri = "coap://127.0.0.1:5684/child" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CONTENT.number + expected.token = None + expected.payload = "test" + + exchange2 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.PUT.number + req.proxy_uri = "coap://127.0.0.1:5684/child" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "testPUT" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CHANGED.number + expected.token = None + expected.payload = None + + exchange3 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.DELETE.number + req.proxy_uri = "coap://127.0.0.1:5684/child" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.DELETED.number + expected.token = None + expected.payload = None + + exchange4 = (req, expected) + self.current_mid += 1 + + self._test_with_client([exchange1, exchange2, exchange3, exchange4]) + + def test_not_found(self): + print("TEST_not_found") + + req = Request() + req.code = defines.Codes.GET.number + req.proxy_uri = "coap://127.0.0.1:5684/not_found" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.token = 100 + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.NOT_FOUND.number + expected.token = 100 + expected.payload = None + + exchange1 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.POST.number + req.proxy_uri = "coap://127.0.0.1:5684/not_found" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "testPOST" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.METHOD_NOT_ALLOWED.number + expected.token = None + + exchange2 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.PUT.number + req.proxy_uri = "coap://127.0.0.1:5684/not_found" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "testPUT" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.NOT_FOUND.number + expected.token = None + expected.payload = None + + exchange3 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.DELETE.number + req.proxy_uri = "coap://127.0.0.1:5684/not_found" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.NOT_FOUND.number + expected.token = None + expected.payload = None + + exchange4 = (req, expected) + self.current_mid += 1 + + self._test_with_client([exchange1, exchange2, exchange3, exchange4]) + + def test_invalid(self): + print("TEST_INVALID") + + # version + req = (b'\x00\x01\x8c\xda', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange1 = (req, expected) + + # version + req = (b'\x40', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange2 = (req, expected) + + # code + req = (b'\x40\x05\x8c\xda', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange3 = (req, expected) + + # option + req = (b'\x40\x01\x8c\xda\x94', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange4 = (req, expected) + + # payload marker + req = (b'\x40\x02\x8c\xda\x75\x62\x61\x73\x69\x63\xff', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange5 = (req, expected) + + self._test_datagram([exchange1, exchange2, exchange3, exchange4, exchange5]) def test_post_block_big_client(self): print("TEST_POST_BLOCK_BIG_CLIENT") - req = Request() + req = Request() req.code = defines.Codes.POST.number req.proxy_uri = "coap://127.0.0.1:5684/big" req.type = defines.Types["CON"] @@ -1375,13 +1366,13 @@ class Tests(unittest.TestCase): expected.payload = None exchange1 = (req, expected) - self.current_mid += 1 self._test_with_client_observe([exchange1]) def test_duplicate(self): print("TEST_DUPLICATE") + req = Request() req.code = defines.Codes.GET.number req.proxy_uri = "coap://127.0.0.1:5684/basic" @@ -1396,10 +1387,12 @@ class Tests(unittest.TestCase): expected.token = None self.current_mid += 1 + self._test_plugtest([(req, expected), (req, expected)]) def test_duplicate_not_completed(self): print("TEST_DUPLICATE_NOT_COMPLETED") + req = Request() req.code = defines.Codes.GET.number req.proxy_uri = "coap://127.0.0.1:5684/long" @@ -1420,8 +1413,9 @@ class Tests(unittest.TestCase): expected2.token = None self.current_mid += 1 + self._test_plugtest([(req, None), (req, expected), (None, expected2)]) + if __name__ == '__main__': unittest.main() - diff --git a/coverage_test_reverse_proxy.py b/coverage_test_reverse_proxy.py index 6aabdd1..1938fe3 100644 --- a/coverage_test_reverse_proxy.py +++ b/coverage_test_reverse_proxy.py @@ -1,14 +1,15 @@ +# -*- coding: utf-8 -*- + from queue import Queue import random import socket import threading import unittest + from coapclient import HelperClient -from coapforwardproxy import CoAPForwardProxy from coapreverseproxy import CoAPReverseProxy from coapserver import CoAPServer from coapthon import defines -from coapthon.messages.message import Message from coapthon.messages.option import Option from coapthon.messages.request import Request from coapthon.messages.response import Response @@ -408,8 +409,8 @@ class Tests(unittest.TestCase): def test_post_block(self): print("TEST_POST_BLOCK") path = "/Server1/storage/new_res" - req = Request() + req = Request() req.code = defines.Codes.POST.number req.uri_path = path req.type = defines.Types["CON"] @@ -533,7 +534,7 @@ class Tests(unittest.TestCase): expected.code = defines.Codes.CREATED.number expected.token = None expected.payload = None - expected.location_path = "/Server1/storage/new_res" + expected.location_path = "Server1/storage/new_res" exchange5 = (req, expected) self.current_mid += 1 @@ -714,727 +715,272 @@ class Tests(unittest.TestCase): self._test_plugtest([exchange1, exchange2, exchange3, exchange4, exchange5, exchange6, exchange7, exchange8]) - # def test_post_block_big(self): - # print "TEST_POST_BLOCK_BIG" - # path = "/big" - # req = Request() - # - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "Lorem ipsum dolo" - # req.block1 = (0, 1, 16) - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = None - # expected.code = defines.Codes.CONTINUE.number - # expected.token = None - # expected.payload = None - # expected.block1 = (0, 1, 16) - # - # exchange1 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "r sit amet, consectetur adipisci" - # req.block1 = (1, 1, 32) - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = None - # expected.code = defines.Codes.CONTINUE.number - # expected.token = None - # expected.payload = None - # expected.block1 = (1, 1, 32) - # - # exchange2 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "ng elit. Sed ut ultrices ligula. Pellentesque purus augue, cursu" - # req.block1 = (2, 1, 64) - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = None - # expected.code = defines.Codes.CONTINUE.number - # expected.token = None - # expected.payload = None - # expected.block1 = (2, 1, 64) - # - # exchange3 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "s ultricies est in, vehicula congue metus. Vestibulum vel justo lacinia, porttitor quam vitae, " \ - # "feugiat sapien. Quisque finibus, " - # req.block1 = (3, 1, 128) - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = None - # expected.code = defines.Codes.CONTINUE.number - # expected.token = None - # expected.payload = None - # expected.block1 = (3, 1, 128) - # - # exchange4 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "nisi vitae rhoncus malesuada, augue mauris dapibus tellus, sit amet venenatis libero" \ - # " libero sed lorem. In pharetra turpis sed eros porta mollis. Quisque dictum dolor nisl," \ - # " imperdiet tincidunt augue malesuada vitae. Donec non felis urna. Suspendisse at hend" - # req.block1 = (4, 1, 256) - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = None - # expected.code = defines.Codes.CONTINUE.number - # expected.token = None - # expected.payload = None - # expected.block1 = (4, 1, 256) - # - # exchange5 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "rerit ex, quis aliquet ante. Vivamus ultrices dolor at elit tincidunt, eget fringilla " \ - # "ligula vestibulum. In molestie sagittis nibh, ut efficitur tellus faucibus non. Maecenas " \ - # "posuere elementum faucibus. Morbi nisi diam, molestie non feugiat et, elementum eget magna." \ - # " Donec vel sem facilisis quam viverra ultrices nec eu lacus. Sed molestie nisi id ultrices " \ - # "interdum. Curabitur pharetra sed tellus in dignissim. Duis placerat aliquam metus, volutpat " \ - # "elementum augue aliquam a. Nunc sed dolor at orci maximus portt" - # req.block1 = (5, 1, 512) - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = None - # expected.code = defines.Codes.CONTINUE.number - # expected.token = None - # expected.payload = None - # expected.block1 = (5, 1, 512) - # - # exchange6 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "itor ac sit amet eros. Mauris et nisi in tortor pharetra rhoncus sit amet hendrerit metus. " \ - # "Integer laoreet placerat cursus. Nam a nulla ex. Donec laoreet sagittis libero quis " \ - # "imperdiet. Vivamus facilisis turpis nec rhoncus venenatis. Duis pulvinar tellus vel quam " \ - # "maximus imperdiet. Mauris eget nibh orci. Duis ut cursus nibh. Nulla sed commodo elit. " \ - # "Suspendisse ac eros lacinia, mattis turpis at, porttitor justo. Vivamus molestie " \ - # "tincidunt libero. Etiam porttitor lacus odio, at lobortis tortor scelerisque nec. " \ - # "Nullam non ante vel nisi ultrices consectetur. Maecenas massa felis, tempor eget " \ - # "malesuada eget, pretium eu sapien. Vivamus dapibus ante erat, non faucibus orci sodales " \ - # "sit amet. Cras magna felis, sodales eget magna sed, eleifend rutrum ligula. Vivamus interdum " \ - # "enim enim, eu facilisis tortor dignissim quis. Ut metus nulla, mattis non lorem et, " \ - # "elementum ultrices orci. Quisque eleifend, arcu vitae ullamcorper pulvinar, ipsum ex " \ - # "sodales arcu, eget consectetur mauris metus ac tortor. Donec id sem felis. Maur" - # req.block1 = (6, 0, 1024) - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = None - # expected.code = defines.Codes.CREATED.number - # expected.token = None - # expected.payload = None - # expected.location_path = "big" - # - # exchange7 = (req, expected) - # self.current_mid += 1 - # - # self._test_plugtest([exchange1, exchange2, exchange3, exchange4, exchange5, exchange6, exchange7]) - # - # def test_options(self): - # print "TEST_OPTIONS" - # path = "/storage/new_res" - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # option = Option() - # option.number = defines.OptionRegistry.ETAG.number - # option.value = "test" - # req.add_option(option) - # req.del_option(option) - # req.payload = "test" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CREATED.number - # expected.token = None - # expected.payload = None - # expected.location_path = "storage/new_res" - # - # exchange1 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # option = Option() - # option.number = defines.OptionRegistry.ETAG.number - # option.value = "test" - # req.add_option(option) - # req.del_option_by_name("ETag") - # req.payload = "test" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CREATED.number - # expected.token = None - # expected.payload = None - # expected.location_path = "storage/new_res" - # - # exchange2 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # option = Option() - # option.number = defines.OptionRegistry.ETAG.number - # option.value = "test" - # req.add_option(option) - # del req.etag - # req.payload = "test" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CREATED.number - # expected.token = None - # expected.payload = None - # expected.location_path = "storage/new_res" - # - # exchange3 = (req, expected) - # self.current_mid += 1 - # - # self._test_with_client([exchange1, exchange2, exchange3]) - # - # def test_content_type(self): - # print "TEST_CONTENT_TYPE" - # path = "/storage/new_res" - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "test" - # req.content_type = defines.Content_types["application/xml"] - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CREATED.number - # expected.token = None - # expected.payload = None - # expected.location_path = "storage/new_res" - # - # exchange1 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CONTENT.number - # expected.token = None - # expected.payload = "Basic Resource" - # - # exchange2 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.PUT.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "test" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CHANGED.number - # expected.token = None - # expected.payload = None - # - # exchange3 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CONTENT.number - # expected.token = None - # expected.payload = "test" - # - # exchange4 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.accept = defines.Content_types["application/xml"] - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CONTENT.number - # expected.token = None - # expected.payload = "test" - # - # exchange5 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.accept = defines.Content_types["application/json"] - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.NOT_ACCEPTABLE.number - # expected.token = None - # expected.payload = None - # expected.content_type = defines.Content_types["application/json"] - # - # exchange6 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = "/xml" - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CONTENT.number - # expected.token = None - # expected.payload = "0" - # expected.content_type = defines.Content_types["application/xml"] - # - # print(expected.pretty_print()) - # - # exchange7 = (req, expected) - # self.current_mid += 1 - # - # self._test_with_client([exchange1, exchange2, exchange3, exchange4, exchange5, exchange6, exchange7]) - # - # def test_ETAG(self): - # print "TEST_ETAG" - # path = "/etag" - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CONTENT.number - # expected.token = None - # expected.payload = "ETag resource" - # expected.etag = "0" - # - # exchange1 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "test" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CREATED.number - # expected.token = None - # expected.payload = None - # expected.location_path = path - # expected.etag = "1" - # - # exchange2 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.etag = "1" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.VALID.number - # expected.token = None - # expected.payload = "test" - # expected.etag = "1" - # - # exchange3 = (req, expected) - # self.current_mid += 1 - # - # self._test_with_client([exchange1, exchange2, exchange3]) - # - # def test_child(self): - # print "TEST_CHILD" - # path = "/child" - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "test" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CREATED.number - # expected.token = None - # expected.payload = None - # expected.location_path = path - # - # exchange1 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CONTENT.number - # expected.token = None - # expected.payload = "test" - # - # exchange2 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.PUT.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "testPUT" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.CHANGED.number - # expected.token = None - # expected.payload = None - # - # exchange3 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.DELETE.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.DELETED.number - # expected.token = None - # expected.payload = None - # - # exchange4 = (req, expected) - # self.current_mid += 1 - # - # self._test_with_client([exchange1, exchange2, exchange3, exchange4]) - # - # def test_not_found(self): - # print "TEST_not_found" - # path = "/not_found" - # - # req = Request() - # req.code = defines.Codes.GET.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.token = 100 - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.NOT_FOUND.number - # expected.token = "100" - # expected.payload = None - # - # exchange1 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.POST.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "test" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.METHOD_NOT_ALLOWED.number - # expected.token = None - # - # exchange2 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.PUT.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # req.payload = "testPUT" - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.NOT_FOUND.number - # expected.token = None - # expected.payload = None - # - # exchange3 = (req, expected) - # self.current_mid += 1 - # - # req = Request() - # req.code = defines.Codes.DELETE.number - # req.uri_path = path - # req.type = defines.Types["CON"] - # req._mid = self.current_mid - # req.destination = self.server_address - # - # expected = Response() - # expected.type = defines.Types["ACK"] - # expected._mid = self.current_mid - # expected.code = defines.Codes.NOT_FOUND.number - # expected.token = None - # expected.payload = None - # - # exchange4 = (req, expected) - # self.current_mid += 1 - # - # self._test_with_client([exchange1, exchange2, exchange3, exchange4]) - # - # def test_invalid(self): - # print("TEST_INVALID") - # - # # version - # req = ("\x00\x01\x8c\xda", self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange1 = (req, expected) - # - # # version - # req = ("\x40", self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange2 = (req, expected) - # - # # code - # req = ("\x40\x05\x8c\xda", self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange3 = (req, expected) - # - # # option - # req = ("\x40\x01\x8c\xda\x94", self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange4 = (req, expected) - # - # # payload marker - # req = ("\x40\x02\x8c\xda\x75\x62\x61\x73\x69\x63\xff", self.server_address) - # - # expected = Response() - # expected.type = defines.Types["RST"] - # expected._mid = None - # expected.code = defines.Codes.BAD_REQUEST.number - # - # exchange5 = (req, expected) - # - # self._test_datagram([exchange1, exchange2, exchange3, exchange4, exchange5]) - - def test_post_block_big_client(self): - print("TEST_POST_BLOCK_BIG_CLIENT") + def test_post_block_big(self): + print("TEST_POST_BLOCK_BIG") path = "/Server1/big" - req = Request() + req = Request() req.code = defines.Codes.POST.number req.uri_path = path req.type = defines.Types["CON"] req._mid = self.current_mid req.destination = self.server_address - req.payload = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras sollicitudin fermentum ornare. " \ - "Cras accumsan tellus quis dui lacinia eleifend. Proin ultrices rutrum orci vitae luctus. " \ - "Nullam malesuada pretium elit, at aliquam odio vehicula in. Etiam nec maximus elit. " \ - "Etiam at erat ac ex ornare feugiat. Curabitur sed malesuada orci, id aliquet nunc. Phasellus " \ - "nec leo luctus, blandit lorem sit amet, interdum metus. Duis efficitur volutpat magna, ac " \ - "ultricies nibh aliquet sit amet. Etiam tempor egestas augue in hendrerit. Nunc eget augue " \ - "ultricies, dignissim lacus et, vulputate dolor. Nulla eros odio, fringilla vel massa ut, " \ - "facilisis cursus quam. Fusce faucibus lobortis congue. Fusce consectetur porta neque, id " \ - "sollicitudin velit maximus eu. Sed pharetra leo quam, vel finibus turpis cursus ac. " \ - "Aenean ac nisi massa. Cras commodo arcu nec ante tristique ullamcorper. Quisque eu hendrerit" \ - " urna. Cras fringilla eros ut nunc maximus, non porta nisl mollis. Aliquam in rutrum massa." \ - " Praesent tristique turpis dui, at ultricies lorem fermentum at. Vivamus sit amet ornare neque, " \ - "a imperdiet nisl. Quisque a iaculis libero, id tempus lacus. Aenean convallis est non justo " \ - "consectetur, a hendrerit enim consequat. In accumsan ante a egestas luctus. Etiam quis neque " \ - "nec eros vestibulum faucibus. Nunc viverra ipsum lectus, vel scelerisque dui dictum a. Ut orci " \ - "enim, ultrices a ultrices nec, pharetra in quam. Donec accumsan sit amet eros eget fermentum." \ - "Vivamus ut odio ac odio malesuada accumsan. Aenean vehicula diam at tempus ornare. Phasellus " \ - "dictum mauris a mi consequat, vitae mattis nulla fringilla. Ut laoreet tellus in nisl efficitur," \ - " a luctus justo tempus. Fusce finibus libero eget velit finibus iaculis. Morbi rhoncus purus " \ - "vel vestibulum ullamcorper. Sed ac metus in urna fermentum feugiat. Nulla nunc diam, sodales " \ - "aliquam mi id, varius porta nisl. Praesent vel nibh ac turpis rutrum laoreet at non odio. " \ - "Phasellus ut posuere mi. Suspendisse malesuada velit nec mauris convallis porta. Vivamus " \ - "sed ultrices sapien, at cras amet." + req.payload = "Lorem ipsum dolo" + req.block1 = (0, 1, 16) expected = Response() expected.type = defines.Types["ACK"] expected._mid = None - expected.code = defines.Codes.CHANGED.number + expected.code = defines.Codes.CONTINUE.number expected.token = None expected.payload = None + expected.block1 = (0, 1, 16) exchange1 = (req, expected) self.current_mid += 1 - self._test_with_client([exchange1]) + req = Request() + req.code = defines.Codes.POST.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "r sit amet, consectetur adipisci" + req.block1 = (1, 1, 32) - def test_observe_client(self): - print("TEST_OBSERVE_CLIENT") - path = "/Server1/basic" + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = None + expected.code = defines.Codes.CONTINUE.number + expected.token = None + expected.payload = None + expected.block1 = (1, 1, 32) + + exchange2 = (req, expected) + self.current_mid += 1 req = Request() - req.code = defines.Codes.GET.number + req.code = defines.Codes.POST.number req.uri_path = path req.type = defines.Types["CON"] req._mid = self.current_mid req.destination = self.server_address - req.observe = 0 + req.payload = "ng elit. Sed ut ultrices ligula. Pellentesque purus augue, cursu" + req.block1 = (2, 1, 64) expected = Response() expected.type = defines.Types["ACK"] expected._mid = None - expected.code = defines.Codes.CONTENT.number + expected.code = defines.Codes.CONTINUE.number + expected.token = None + expected.payload = None + expected.block1 = (2, 1, 64) + + exchange3 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.POST.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "s ultricies est in, vehicula congue metus. Vestibulum vel justo lacinia, porttitor quam vitae, " \ + "feugiat sapien. Quisque finibus, " + req.block1 = (3, 1, 128) + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = None + expected.code = defines.Codes.CONTINUE.number + expected.token = None + expected.payload = None + expected.block1 = (3, 1, 128) + + exchange4 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.POST.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "nisi vitae rhoncus malesuada, augue mauris dapibus tellus, sit amet venenatis libero" \ + " libero sed lorem. In pharetra turpis sed eros porta mollis. Quisque dictum dolor nisl," \ + " imperdiet tincidunt augue malesuada vitae. Donec non felis urna. Suspendisse at hend" + req.block1 = (4, 1, 256) + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = None + expected.code = defines.Codes.CONTINUE.number + expected.token = None + expected.payload = None + expected.block1 = (4, 1, 256) + + exchange5 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.POST.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "rerit ex, quis aliquet ante. Vivamus ultrices dolor at elit tincidunt, eget fringilla " \ + "ligula vestibulum. In molestie sagittis nibh, ut efficitur tellus faucibus non. Maecenas " \ + "posuere elementum faucibus. Morbi nisi diam, molestie non feugiat et, elementum eget magna." \ + " Donec vel sem facilisis quam viverra ultrices nec eu lacus. Sed molestie nisi id ultrices " \ + "interdum. Curabitur pharetra sed tellus in dignissim. Duis placerat aliquam metus, volutpat " \ + "elementum augue aliquam a. Nunc sed dolor at orci maximus portt" + req.block1 = (5, 1, 512) + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = None + expected.code = defines.Codes.CONTINUE.number + expected.token = None + expected.payload = None + expected.block1 = (5, 1, 512) + + exchange6 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.POST.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "itor ac sit amet eros. Mauris et nisi in tortor pharetra rhoncus sit amet hendrerit metus. " \ + "Integer laoreet placerat cursus. Nam a nulla ex. Donec laoreet sagittis libero quis " \ + "imperdiet. Vivamus facilisis turpis nec rhoncus venenatis. Duis pulvinar tellus vel quam " \ + "maximus imperdiet. Mauris eget nibh orci. Duis ut cursus nibh. Nulla sed commodo elit. " \ + "Suspendisse ac eros lacinia, mattis turpis at, porttitor justo. Vivamus molestie " \ + "tincidunt libero. Etiam porttitor lacus odio, at lobortis tortor scelerisque nec. " \ + "Nullam non ante vel nisi ultrices consectetur. Maecenas massa felis, tempor eget " \ + "malesuada eget, pretium eu sapien. Vivamus dapibus ante erat, non faucibus orci sodales " \ + "sit amet. Cras magna felis, sodales eget magna sed, eleifend rutrum ligula. Vivamus interdum " \ + "enim enim, eu facilisis tortor dignissim quis. Ut metus nulla, mattis non lorem et, " \ + "elementum ultrices orci. Quisque eleifend, arcu vitae ullamcorper pulvinar, ipsum ex " \ + "sodales arcu, eget consectetur mauris metus ac tortor. Donec id sem felis. Maur" + req.block1 = (6, 0, 1024) + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = None + expected.code = defines.Codes.CHANGED.number + expected.token = None + expected.payload = None + + exchange7 = (req, expected) + self.current_mid += 1 + + self._test_plugtest([exchange1, exchange2, exchange3, exchange4, exchange5, exchange6, exchange7]) + + def test_options(self): + print("TEST_OPTIONS") + path = "/Server1/storage/new_res" + + req = Request() + req.code = defines.Codes.POST.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + option = Option() + option.number = defines.OptionRegistry.ETAG.number + option.value = "test" + req.add_option(option) + req.del_option(option) + req.payload = "test" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CREATED.number expected.token = None expected.payload = None + expected.location_path = "Server1/storage/new_res" exchange1 = (req, expected) + self.current_mid += 1 - self._test_with_client_observe([exchange1]) + req = Request() + req.code = defines.Codes.POST.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + option = Option() + option.number = defines.OptionRegistry.ETAG.number + option.value = "test" + req.add_option(option) + req.del_option_by_name("ETag") + req.payload = "test" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CREATED.number + expected.token = None + expected.payload = None + expected.location_path = "Server1/storage/new_res" + + exchange2 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.POST.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + option = Option() + option.number = defines.OptionRegistry.ETAG.number + option.value = "test" + req.add_option(option) + del req.etag + req.payload = "test" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CREATED.number + expected.token = None + expected.payload = None + expected.location_path = "Server1/storage/new_res" + + exchange3 = (req, expected) + self.current_mid += 1 + + self._test_with_client([exchange1, exchange2, exchange3]) + + def test_content_type(self): + print("TEST_CONTENT_TYPE") + path = "/Server1/storage/new_res" + + req = Request() + req.code = defines.Codes.POST.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "test" + req.content_type = defines.Content_types["application/xml"] + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CREATED.number + expected.token = None + expected.payload = None + expected.location_path = "Server1/storage/new_res" + + exchange1 = (req, expected) + self.current_mid += 1 - def test_duplicate(self): - print("TEST_DUPLICATE") - path = "/Server1/basic" req = Request() req.code = defines.Codes.GET.number req.uri_path = path @@ -1447,35 +993,486 @@ class Tests(unittest.TestCase): expected._mid = self.current_mid expected.code = defines.Codes.CONTENT.number expected.token = None + expected.payload = "Basic Resource" + exchange2 = (req, expected) self.current_mid += 1 - self._test_plugtest([(req, expected), (req, expected)]) - def test_duplicate_not_completed(self): - print("TEST_DUPLICATE_NOT_COMPLETED") - path = "/Server1/long" req = Request() - req.code = defines.Codes.GET.number + req.code = defines.Codes.PUT.number req.uri_path = path req.type = defines.Types["CON"] req._mid = self.current_mid req.destination = self.server_address + req.payload = "test" expected = Response() expected.type = defines.Types["ACK"] expected._mid = self.current_mid - expected.code = None + expected.code = defines.Codes.CHANGED.number expected.token = None + expected.payload = None - expected2 = Response() - expected2.type = defines.Types["CON"] - expected2._mid = None - expected2.code = defines.Codes.CONTENT.number - expected2.token = None + exchange3 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.GET.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CONTENT.number + expected.token = None + expected.payload = "test" + exchange4 = (req, expected) self.current_mid += 1 - self._test_plugtest([(req, None), (req, expected), (None, expected2)]) -if __name__ == '__main__': - unittest.main() + req = Request() + req.code = defines.Codes.GET.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.accept = defines.Content_types["application/xml"] + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CONTENT.number + expected.token = None + expected.payload = "test" + + exchange5 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.GET.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.accept = defines.Content_types["application/json"] + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.NOT_ACCEPTABLE.number + expected.token = None + expected.payload = None + # expected.content_type = defines.Content_types["application/json"] + + exchange6 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.GET.number + req.uri_path = "/Server1/xml" + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CONTENT.number + expected.token = None + expected.payload = "0" + expected.content_type = defines.Content_types["application/xml"] + + exchange7 = (req, expected) + self.current_mid += 1 + + self._test_with_client([exchange1, exchange2, exchange3, exchange4, exchange5, exchange6, exchange7]) + + def test_ETAG(self): + print("TEST_ETAG") + path = "/Server1/etag" + + req = Request() + req.code = defines.Codes.GET.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CONTENT.number + expected.token = None + expected.payload = "ETag resource" + expected.etag = "0" + + exchange1 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.POST.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "test" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CHANGED.number + expected.token = None + expected.payload = None + expected.etag = "1" + + exchange2 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.GET.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.etag = "1" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.VALID.number + expected.token = None + expected.payload = None + expected.etag = "1" + + exchange3 = (req, expected) + self.current_mid += 1 + + self._test_with_client([exchange1, exchange2, exchange3]) + + def test_child(self): + print("TEST_CHILD") + path = "/Server1/child" + + req = Request() + req.code = defines.Codes.POST.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "test" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CREATED.number + expected.token = None + expected.payload = None + expected.location_path = "Server1/child" + + exchange1 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.GET.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CONTENT.number + expected.token = None + expected.payload = "test" + + exchange2 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.PUT.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "testPUT" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CHANGED.number + expected.token = None + expected.payload = None + + exchange3 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.DELETE.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.DELETED.number + expected.token = None + expected.payload = None + + exchange4 = (req, expected) + self.current_mid += 1 + + self._test_with_client([exchange1, exchange2, exchange3, exchange4]) + + def test_not_found(self): + print("TEST_not_found") + path = "/Server1/not_found" + + req = Request() + req.code = defines.Codes.GET.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.token = 100 + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.NOT_FOUND.number + expected.token = 100 + expected.payload = None + + exchange1 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.POST.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "testPOST" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.METHOD_NOT_ALLOWED.number + expected.token = None + + exchange2 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.PUT.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "testPUT" + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.NOT_FOUND.number + expected.token = None + expected.payload = None + + exchange3 = (req, expected) + self.current_mid += 1 + + req = Request() + req.code = defines.Codes.DELETE.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.NOT_FOUND.number + expected.token = None + expected.payload = None + + exchange4 = (req, expected) + self.current_mid += 1 + + self._test_with_client([exchange1, exchange2, exchange3, exchange4]) + + def test_invalid(self): + print("TEST_INVALID") + + # version + req = (b'\x00\x01\x8c\xda', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange1 = (req, expected) + + # version + req = (b'\x40', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange2 = (req, expected) + + # code + req = (b'\x40\x05\x8c\xda', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange3 = (req, expected) + + # get/option + req = (b'\x40\x01\x8c\xda\x94', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange4 = (req, expected) + + # post/payload marker + req = (b'\x40\x02\x8c\xda\x75\x62\x61\x73\x69\x63\xff', self.server_address) + + expected = Response() + expected.type = defines.Types["RST"] + expected._mid = None + expected.code = defines.Codes.BAD_REQUEST.number + + exchange5 = (req, expected) + + self._test_datagram([exchange1, exchange2, exchange3, exchange4, exchange5]) + + def test_post_block_big_client(self): + print("TEST_POST_BLOCK_BIG_CLIENT") + path = "/Server1/big" + req = Request() + + req.code = defines.Codes.POST.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.payload = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras sollicitudin fermentum ornare. " \ + "Cras accumsan tellus quis dui lacinia eleifend. Proin ultrices rutrum orci vitae luctus. " \ + "Nullam malesuada pretium elit, at aliquam odio vehicula in. Etiam nec maximus elit. " \ + "Etiam at erat ac ex ornare feugiat. Curabitur sed malesuada orci, id aliquet nunc. Phasellus " \ + "nec leo luctus, blandit lorem sit amet, interdum metus. Duis efficitur volutpat magna, ac " \ + "ultricies nibh aliquet sit amet. Etiam tempor egestas augue in hendrerit. Nunc eget augue " \ + "ultricies, dignissim lacus et, vulputate dolor. Nulla eros odio, fringilla vel massa ut, " \ + "facilisis cursus quam. Fusce faucibus lobortis congue. Fusce consectetur porta neque, id " \ + "sollicitudin velit maximus eu. Sed pharetra leo quam, vel finibus turpis cursus ac. " \ + "Aenean ac nisi massa. Cras commodo arcu nec ante tristique ullamcorper. Quisque eu hendrerit" \ + " urna. Cras fringilla eros ut nunc maximus, non porta nisl mollis. Aliquam in rutrum massa." \ + " Praesent tristique turpis dui, at ultricies lorem fermentum at. Vivamus sit amet ornare neque, " \ + "a imperdiet nisl. Quisque a iaculis libero, id tempus lacus. Aenean convallis est non justo " \ + "consectetur, a hendrerit enim consequat. In accumsan ante a egestas luctus. Etiam quis neque " \ + "nec eros vestibulum faucibus. Nunc viverra ipsum lectus, vel scelerisque dui dictum a. Ut orci " \ + "enim, ultrices a ultrices nec, pharetra in quam. Donec accumsan sit amet eros eget fermentum." \ + "Vivamus ut odio ac odio malesuada accumsan. Aenean vehicula diam at tempus ornare. Phasellus " \ + "dictum mauris a mi consequat, vitae mattis nulla fringilla. Ut laoreet tellus in nisl efficitur," \ + " a luctus justo tempus. Fusce finibus libero eget velit finibus iaculis. Morbi rhoncus purus " \ + "vel vestibulum ullamcorper. Sed ac metus in urna fermentum feugiat. Nulla nunc diam, sodales " \ + "aliquam mi id, varius porta nisl. Praesent vel nibh ac turpis rutrum laoreet at non odio. " \ + "Phasellus ut posuere mi. Suspendisse malesuada velit nec mauris convallis porta. Vivamus " \ + "sed ultrices sapien, at cras amet." + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = None + expected.code = defines.Codes.CHANGED.number + expected.token = None + expected.payload = None + + exchange1 = (req, expected) + self.current_mid += 1 + + self._test_with_client([exchange1]) + + def test_observe_client(self): + print("TEST_OBSERVE_CLIENT") + path = "/Server1/basic" + + req = Request() + req.code = defines.Codes.GET.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + req.observe = 0 + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = None + expected.code = defines.Codes.CONTENT.number + expected.token = None + expected.payload = None + + exchange1 = (req, expected) + + self._test_with_client_observe([exchange1]) + + def test_duplicate(self): + print("TEST_DUPLICATE") + path = "/Server1/basic" + req = Request() + req.code = defines.Codes.GET.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = defines.Codes.CONTENT.number + expected.token = None + + self.current_mid += 1 + self._test_plugtest([(req, expected), (req, expected)]) + + def test_duplicate_not_completed(self): + print("TEST_DUPLICATE_NOT_COMPLETED") + path = "/Server1/long" + req = Request() + req.code = defines.Codes.GET.number + req.uri_path = path + req.type = defines.Types["CON"] + req._mid = self.current_mid + req.destination = self.server_address + + expected = Response() + expected.type = defines.Types["ACK"] + expected._mid = self.current_mid + expected.code = None + expected.token = None + + expected2 = Response() + expected2.type = defines.Types["CON"] + expected2._mid = None + expected2.code = defines.Codes.CONTENT.number + expected2.token = None + + self.current_mid += 1 + self._test_plugtest([(req, None), (req, expected), (None, expected2)]) + + +if __name__ == '__main__': + unittest.main() diff --git a/plugtest.py b/plugtest.py index a970d39..3ed12a4 100644 --- a/plugtest.py +++ b/plugtest.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- + from queue import Queue import random import socket import threading import unittest + from coapthon.messages.message import Message from coapclient import HelperClient from coapthon.messages.response import Response @@ -127,6 +129,7 @@ class Tests(unittest.TestCase): def test_td_coap_link_01(self): print("TD_COAP_LINK_01") path = "/.well-known/core" + req = Request() req.code = defines.Codes.GET.number req.uri_path = path @@ -147,6 +150,7 @@ class Tests(unittest.TestCase): def test_td_coap_link_02(self): print("TD_COAP_LINK_02") path = "/.well-known/core" + req = Request() req.code = defines.Codes.GET.number req.uri_path = path @@ -168,6 +172,7 @@ class Tests(unittest.TestCase): def test_td_coap_core_01(self): print("TD_COAP_CORE_01") path = "/test" + req = Request() req.code = defines.Codes.GET.number req.uri_path = path @@ -188,8 +193,8 @@ class Tests(unittest.TestCase): def test_td_coap_core_02(self): print("TD_COAP_CORE_02") path = "/test_post" - req = Request() + req = Request() req.code = defines.Codes.POST.number req.uri_path = path req.type = defines.Types["CON"] @@ -204,7 +209,7 @@ class Tests(unittest.TestCase): expected.code = defines.Codes.CREATED.number expected.token = None expected.payload = None - expected.location_path = "/test_post" + expected.location_path = "test_post" self.current_mid += 1 self._test_with_client([(req, expected)]) @@ -212,8 +217,8 @@ class Tests(unittest.TestCase): def test_td_coap_core_03(self): print("TD_COAP_CORE_03") path = "/test" - req = Request() + req = Request() req.code = defines.Codes.PUT.number req.uri_path = path req.type = defines.Types["CON"] @@ -233,7 +238,6 @@ class Tests(unittest.TestCase): exchange1 = (req, expected) req = Request() - req.code = defines.Codes.GET.number req.uri_path = path req.type = defines.Types["CON"] @@ -251,7 +255,6 @@ class Tests(unittest.TestCase): exchange2 = (req, expected) req = Request() - req.code = defines.Codes.GET.number req.uri_path = path req.type = defines.Types["CON"] @@ -274,8 +277,8 @@ class Tests(unittest.TestCase): def test_td_coap_core_04(self): print("TD_COAP_CORE_04") path = "/test" - req = Request() + req = Request() req.code = defines.Codes.DELETE.number req.uri_path = path req.type = defines.Types["CON"] @@ -295,8 +298,8 @@ class Tests(unittest.TestCase): def test_td_coap_core_05(self): print("TD_COAP_CORE_05") path = "/test" - req = Request() + req = Request() req.code = defines.Codes.GET.number req.uri_path = path req.type = defines.Types["NON"] @@ -316,8 +319,8 @@ class Tests(unittest.TestCase): def test_td_coap_core_06(self): print("TD_COAP_CORE_06") path = "/test_post" - req = Request() + req = Request() req.code = defines.Codes.POST.number req.uri_path = path req.type = defines.Types["NON"] @@ -332,7 +335,7 @@ class Tests(unittest.TestCase): expected.code = defines.Codes.CREATED.number expected.token = None expected.payload = None - expected.location_path = "/test_post" + expected.location_path = "test_post" self.current_mid += 1 self._test_with_client([(req, expected)]) @@ -340,8 +343,8 @@ class Tests(unittest.TestCase): def test_td_coap_core_07(self): print("TD_COAP_CORE_07") path = "/test" - req = Request() + req = Request() req.code = defines.Codes.PUT.number req.uri_path = path req.type = defines.Types["NON"] @@ -363,8 +366,8 @@ class Tests(unittest.TestCase): def test_td_coap_core_08(self): print("TD_COAP_CORE_08") path = "/test" - req = Request() + req = Request() req.code = defines.Codes.DELETE.number req.uri_path = path req.type = defines.Types["NON"] @@ -384,8 +387,8 @@ class Tests(unittest.TestCase): def test_td_coap_core_09(self): print("TD_COAP_CORE_09") path = "/separate" - req = Request() + req = Request() req.code = defines.Codes.GET.number req.uri_path = path req.type = defines.Types["CON"] @@ -412,8 +415,8 @@ class Tests(unittest.TestCase): def test_td_coap_core_10(self): print("TD_COAP_CORE_10") path = "/test" - req = Request() + req = Request() req.code = defines.Codes.GET.number req.uri_path = path req.type = defines.Types["CON"] @@ -435,8 +438,8 @@ class Tests(unittest.TestCase): def test_td_coap_core_12(self): print("TD_COAP_CORE_12") path = "/seg1/seg2/seg3" - req = Request() + req = Request() req.code = defines.Codes.GET.number req.uri_path = path req.type = defines.Types["CON"] @@ -455,8 +458,8 @@ class Tests(unittest.TestCase): def test_td_coap_core_13(self): print("TD_COAP_CORE_13") path = "/query?first=1&second=2&third=3" - req = Request() + req = Request() req.code = defines.Codes.GET.number req.uri_path = path req.type = defines.Types["CON"] @@ -476,8 +479,8 @@ class Tests(unittest.TestCase): def test_td_coap_obs_01(self): print("TD_COAP_OBS_01") path = "/obs" - req = Request() + req = Request() req.code = defines.Codes.GET.number req.uri_path = path req.type = defines.Types["CON"] @@ -508,8 +511,8 @@ class Tests(unittest.TestCase): def test_td_coap_obs_03(self): print("TD_COAP_OBS_03") path = "/obs" - req = Request() + req = Request() req.code = defines.Codes.GET.number req.uri_path = path req.type = defines.Types["CON"] @@ -802,6 +805,7 @@ I say, looked for all the world like a strip of that same patchwork quilt. Indee def test_duplicate(self): print("TEST_DUPLICATE") path = "/test" + req = Request() req.code = defines.Codes.GET.number req.uri_path = path @@ -816,11 +820,13 @@ I say, looked for all the world like a strip of that same patchwork quilt. Indee expected.token = None self.current_mid += 1 + self._test_plugtest([(req, expected), (req, expected)]) def test_duplicate_not_completed(self): print("TEST_DUPLICATE_NOT_COMPLETED") path = "/long" + req = Request() req.code = defines.Codes.GET.number req.uri_path = path @@ -841,11 +847,13 @@ I say, looked for all the world like a strip of that same patchwork quilt. Indee expected2.token = None self.current_mid += 1 + self._test_plugtest([(req, None), (req, expected), (None, expected2)]) def test_no_response(self): print("TEST_NO_RESPONSE") path = "/long" + req = Request() req.code = defines.Codes.GET.number req.uri_path = path @@ -866,13 +874,14 @@ I say, looked for all the world like a strip of that same patchwork quilt. Indee expected2.token = None self.current_mid += 1 + self._test_plugtest([(req, expected), (None, expected2), (None, expected2), (None, expected2)]) def test_edit_resource(self): print("TEST_EDIT_RESOURCE") path = "/obs" - req = Request() + req = Request() req.code = defines.Codes.POST.number req.uri_path = path req.type = defines.Types["CON"] @@ -886,10 +895,11 @@ I say, looked for all the world like a strip of that same patchwork quilt. Indee expected.code = defines.Codes.CHANGED.number expected.token = None expected.payload = None - expected.location_path = "/obs" self.current_mid += 1 + self._test_with_client([(req, expected)]) + if __name__ == '__main__': unittest.main() diff --git a/plugtest_coapserver.py b/plugtest_coapserver.py index 2b91918..44585d9 100644 --- a/plugtest_coapserver.py +++ b/plugtest_coapserver.py @@ -1,9 +1,9 @@ import getopt -import logging import sys + +from coapthon.server.coap import CoAP from plugtest_resources import TestResource, SeparateResource, ObservableResource, LargeResource, LargeUpdateResource, \ LongResource -from coapthon.server.coap import CoAP __author__ = 'Giacomo Tanganelli' @@ -11,33 +11,15 @@ __author__ = 'Giacomo Tanganelli' class CoAPServerPlugTest(CoAP): def __init__(self, host, port, multicast=False, starting_mid=None): CoAP.__init__(self, (host, port), multicast, starting_mid) - - # create logger - logger = logging.getLogger(__name__) - logger.setLevel(logging.DEBUG) - - # create console handler and set level to debug - ch = logging.StreamHandler() - ch.setLevel(logging.DEBUG) - - # create formatter - formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') - - # add formatter to ch - ch.setFormatter(formatter) - - # add ch to logger - logger.addHandler(ch) - self.add_resource('test/', TestResource()) self.add_resource('separate/', SeparateResource()) self.add_resource('seg1/', TestResource()) self.add_resource('seg1/seg2/', TestResource()) self.add_resource('seg1/seg2/seg3/', TestResource()) self.add_resource('query/', TestResource()) - self.add_resource("obs/", ObservableResource(coap_server=self)) - self.add_resource("large/", LargeResource(coap_server=self)) - self.add_resource("large-update/", LargeUpdateResource(coap_server=self)) + self.add_resource('obs/', ObservableResource(coap_server=self)) + self.add_resource('large/', LargeResource(coap_server=self)) + self.add_resource('large-update/', LargeUpdateResource(coap_server=self)) self.add_resource('long/', LongResource()) @@ -66,9 +48,7 @@ def main(argv): # pragma: no cover try: server.listen(10) except KeyboardInterrupt: - print("Server Shutdown") server.close() - print("Exiting...") if __name__ == "__main__": diff --git a/plugtest_resources.py b/plugtest_resources.py index ca4ccd3..b860d94 100644 --- a/plugtest_resources.py +++ b/plugtest_resources.py @@ -1,10 +1,9 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- + import logging import threading import time -import datetime - from coapthon import defines from coapthon.resources.resource import Resource