def test_directoryCreation(self):
        #
        # Check default directory creation
        #
        directory = path_helpers.prettify(MqttDefaultFilePersistence.DEFAULT_DIRECTORY)
        self.persistenceFile = MqttDefaultFilePersistence()

        self.assertTrue(os.path.isdir(directory))   # Directory must now exist

        self.persistenceFile.open('theClientId', 'theUri')

        storageDirectory = os.path.join(directory, self.persistenceFile._perClientIdAndServerUriDirectory)
        self.assertTrue(os.path.isdir(storageDirectory))   # Sub-directory must now exist

        del self.persistenceFile

        #
        # Check custom directory creation
        #
        directory = path_helpers.prettify('~/mqtt-custom-persistence')

        self.persistenceFile = MqttDefaultFilePersistence(directory)
        self.assertTrue(os.path.isdir(directory))  # Directory must now exist

        # Tidy up on disk
        shutil.rmtree(directory)
Esempio n. 2
0
    def test_directoryCreation(self):
        #
        # Check default directory creation
        #
        directory = path_helpers.prettify(
            MqttDefaultFilePersistence.DEFAULT_DIRECTORY)
        self.persistenceFile = MqttDefaultFilePersistence()

        self.assertTrue(os.path.isdir(directory))  # Directory must now exist

        self.persistenceFile.open('theClientId', 'theUri')

        storageDirectory = os.path.join(
            directory, self.persistenceFile._perClientIdAndServerUriDirectory)
        self.assertTrue(
            os.path.isdir(storageDirectory))  # Sub-directory must now exist

        del self.persistenceFile

        #
        # Check custom directory creation
        #
        directory = path_helpers.prettify('~/mqtt-custom-persistence')

        self.persistenceFile = MqttDefaultFilePersistence(directory)
        self.assertTrue(os.path.isdir(directory))  # Directory must now exist

        # Tidy up on disk
        shutil.rmtree(directory)
Esempio n. 3
0
    def parseConfigFile(self, configFile):
        global config

        config = None

        pathConfigFile = path_helpers.prettify(configFile)

        if pathConfigFile and os.path.isfile(pathConfigFile):
            config = ConfigObj(pathConfigFile)

        if config:
            # Check if most important configuration parameters are present
            assert ('cloudio'
                    ) in config, 'Missing group \'cloudio\' in config file!'
            assert ('host') in config[
                'cloudio'], 'Missing \'host\' parameter in cloudio group!'
            assert ('port') in config[
                'cloudio'], 'Missing \'port\' parameter in cloudio group!'
            assert ('username') in config[
                'cloudio'], 'Missing \'username\' parameter in cloudio group!'
            assert ('password') in config[
                'cloudio'], 'Missing \'password\' parameter in cloudio group!'
        else:
            sys.exit(u'Error reading config file')

        return config
    def test_storageDirectory(self):
        testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory)

        storageDirectoryName = 'theClientId-888-theServerUri'
        storageDirectory = os.path.join(self.persistenceFile._directory, storageDirectoryName)

        if os.path.exists(storageDirectory):
            os.rmdir(storageDirectory)
        self.assertTrue(not os.path.exists(storageDirectory))   # Directory must not exist before this test

        #
        # Check that '/', '\\', ':' and ' ' gets removed
        #
        self.persistenceFile.open('the Client/ Id-888', '\\the:Server:Uri ')

        # Check storage directory
        self.assertEqual(self.persistenceFile._perClientIdAndServerUriDirectory, storageDirectoryName)
        # Compare storage directory name
        self.assertEqual(self.persistenceFile._storageDirectory(), storageDirectory)
        # Directory must now exist
        self.assertTrue(os.path.exists(storageDirectory))

        # Tidy up on disk
        shutil.rmtree(testPresistenceDirectory)
    def parseConfigFile(self, configFile):
        global config

        from configobj import ConfigObj

        config = None

        pathConfigFile = path_helpers.prettify(configFile)

        if pathConfigFile and os.path.isfile(pathConfigFile):
            config = ConfigObj(pathConfigFile)

        if config:
            # Check if most important configuration parameters are present
            assert 'cloudio' in config, 'Missing group \'cloudio\' in config file!'
            assert 'endpoint' in config, 'Missing group \'endpoint\' in config file!'
            assert 'node' in config, 'Missing group \'node\' in config file!'

            assert 'host' in config['cloudio'], 'Missing \'host\' parameter in cloudio group!'
            assert 'port' in config['cloudio'], 'Missing \'port\' parameter in cloudio group!'
            assert 'username' in config['cloudio'], 'Missing \'username\' parameter in cloudio group!'
            assert 'password' in config['cloudio'], 'Missing \'password\' parameter in cloudio group!'
            assert 'subscribe_topics' in config['cloudio'], 'Missing \'subscribe_topics\' parameter in cloudio group!'
            assert 'qos' in config['cloudio'], 'Missing \'qos\' parameter in cloudio group!'

            assert 'name' in config['endpoint'], 'Missing \'name\' parameter in endpoint group!'

            assert 'name' in config['node'], 'Missing \'name\' parameter in node group!'
        else:
            sys.exit(u'Error reading config file')

        return config
Esempio n. 6
0
    def test_clearPresistence(self):
        keyNbrs = 5
        testPresistenceDirectory = path_helpers.prettify(
            '~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(
            testPresistenceDirectory)

        self.persistenceFile.open('put-persistable', 'mqtt-test-server')

        # Put some data
        for idx, key in enumerate(self.keys):
            if idx >= keyNbrs:
                break
            data = key  # Store the key as data
            self.persistenceFile.put(key, data)

        self.assertEqual(keyNbrs, len(self.persistenceFile.keys()))

        # Clear persistence
        self.persistenceFile.clear()

        self.assertEqual(0, len(self.persistenceFile.keys()))
        self.assertEqual(0, len(self._getStorageFileNames()))

        # Tidy up on disk
        shutil.rmtree(testPresistenceDirectory)
    def createModel(self, xmlModelFile):
        try:
            pathName = path_helpers.prettify(xmlModelFile)

            self.log.info('Reading cloud.iO enpoint model from \'%s\'' % pathName)

            pathName = os.path.abspath(pathName)    # Convert to absolute path to make isfile() happy

            # Check if config file is present
            if os.path.isfile(pathName):
                # Parse XML config file
                xmlConfigFile = minidom.parse(pathName)

                if xmlConfigFile:
                    configList = xmlConfigFile.getElementsByTagName(u'config')
                    """:type : list of minidom.Element"""

                    for config in configList:
                        deviceTypeList = config.getElementsByTagName(u'deviceType')
                        """:type : list of minidom.Element"""

                        for deviceType in deviceTypeList:
                            """:type : list of minidom.Element"""
                            print(u'Parsing elements for device: ' + deviceType.getAttribute('typeId'))
                            self._parseDeviceTypeFromXmlDomElement(deviceType)
            else:
                raise RuntimeError(u'Missing configuration file: %s' % pathName)

        except Exception as e:
            traceback.print_exc()

        # After the endpoint is fully created the presents can be announced
        self.endpoint.announce()
Esempio n. 8
0
    def test_storageDirectory(self):
        testPresistenceDirectory = path_helpers.prettify(
            '~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(
            testPresistenceDirectory)

        storageDirectoryName = 'theClientId-888-theServerUri'
        storageDirectory = os.path.join(self.persistenceFile._directory,
                                        storageDirectoryName)

        if os.path.exists(storageDirectory):
            os.rmdir(storageDirectory)
        self.assertTrue(not os.path.exists(storageDirectory)
                        )  # Directory must not exist before this test

        #
        # Check that '/', '\\', ':' and ' ' gets removed
        #
        self.persistenceFile.open('the Client/ Id-888', '\\the:Server:Uri ')

        # Check storage directory
        self.assertEqual(
            self.persistenceFile._perClientIdAndServerUriDirectory,
            storageDirectoryName)
        # Compare storage directory name
        self.assertEqual(self.persistenceFile._storageDirectory(),
                         storageDirectory)
        # Directory must now exist
        self.assertTrue(os.path.exists(storageDirectory))

        # Tidy up on disk
        shutil.rmtree(testPresistenceDirectory)
    def test_putPendingUpdate(self):
        testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory)

        self.persistenceFile.open('put-persistable', 'mqtt-test-server')

        self.persistenceFile.put(self.keys[8], PendingUpdate(self.keys[8]))

        self.assertEqual(self.persistenceFile.get(self.keys[8]).getHeaderBytes(), self.keys[8])
Esempio n. 10
0
    def test_putPendingUpdate(self):
        testPresistenceDirectory = path_helpers.prettify(
            '~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(
            testPresistenceDirectory)

        self.persistenceFile.open('put-persistable', 'mqtt-test-server')

        self.persistenceFile.put(self.keys[8], PendingUpdate(self.keys[8]))

        self.assertEqual(
            self.persistenceFile.get(self.keys[8]).getHeaderBytes(),
            self.keys[8])
Esempio n. 11
0
    def __init__(self, directory=None):
        """
        :param directory: Base directory where to store the persistent data
        """
        super(MqttDefaultFilePersistence, self).__init__()

        if directory is None or directory == '':
            directory = self.DEFAULT_DIRECTORY

        self._directory = path_helpers.prettify(directory)
        self._perClientIdAndServerUriDirectory = None  # type: str

        # Give a temporary unique storage name in case open() method does not get called
        self._perClientIdAndServerUriDirectory = str(uuid.uuid4())

        # Create base directory
        if not os.path.exists(self._directory):
            os.makedirs(self._directory)
Esempio n. 12
0
    def test_containsKeys(self):
        keyNbrs = 5
        testPresistenceDirectory = path_helpers.prettify(
            '~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(
            testPresistenceDirectory)

        self.persistenceFile.open('put-persistable', 'mqtt-test-server')

        # Put some data
        for idx, key in enumerate(self.keys):
            if idx >= keyNbrs:
                break
            data = key  # Store the key as data
            self.persistenceFile.put(key, data)

        self.assertTrue(self.persistenceFile.containsKey(self.keys[0]))
        self.assertTrue(self.persistenceFile.containsKey(self.keys[1]))
        self.assertTrue(self.persistenceFile.containsKey(self.keys[3]))
        self.assertTrue(self.persistenceFile.containsKey(self.keys[4]))
        self.assertFalse(self.persistenceFile.containsKey(self.keys[5]))
        self.assertFalse(self.persistenceFile.containsKey(self.keys[10]))
        self.assertFalse(self.persistenceFile.containsKey(self.keys[20]))

        self.assertEqual(keyNbrs, len(self.persistenceFile.keys()))

        # Remove one key and check again
        self.assertTrue(self.persistenceFile.containsKey(
            self.keys[2]))  # Should be present
        self.persistenceFile.remove(self.keys[2])  # Remove it
        self.assertFalse(self.persistenceFile.containsKey(
            self.keys[2]))  # Should be gone

        self.assertEqual(keyNbrs - 1, len(self.persistenceFile.keys()))

        # Get one key (not removing it) and check again
        self.assertTrue(self.persistenceFile.containsKey(
            self.keys[4]))  # Should be present
        self.persistenceFile.get(self.keys[4])  # Get it
        self.assertTrue(self.persistenceFile.containsKey(
            self.keys[4]))  # Should be still there

        # Tidy up on disk
        shutil.rmtree(testPresistenceDirectory)
    def test_putPersistable(self):
        testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory)

        self.persistenceFile.open('put-persistable', 'mqtt-test-server')

        data = self.keys[0] # Store the key as data
        self.persistenceFile.put(self.keys[0], data)

        keyFile = os.path.join(self.persistenceFile._storageDirectory(), self.keys[0])
        # Check if name of key file is right
        self.assertEqual(self.persistenceFile._keyFileName(self.keys[0]), keyFile)
        # Check if key file was created
        self.assertTrue(os.path.isfile(keyFile))
        # Check if file data is what we expect
        self.assertEqual(self._getFileContent(keyFile), data)

        # Tidy up on disk
        shutil.rmtree(testPresistenceDirectory)
    def test_putPersistableMultiple(self):
        keyNbrs = 3
        testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory)

        self.persistenceFile.open('put-persistable', 'mqtt-test-server')

        for idx, key in enumerate(self.keys):
            if idx >= keyNbrs:
                break
            data = key  # Store the key as data
            self.persistenceFile.put(key, data)

        fileNames = self._getStorageFileNames()

        self.assertEqual(keyNbrs, len(fileNames))

        # Tidy up on disk
        shutil.rmtree(testPresistenceDirectory)
Esempio n. 15
0
    def test_putPersistableMultiple(self):
        keyNbrs = 3
        testPresistenceDirectory = path_helpers.prettify(
            '~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(
            testPresistenceDirectory)

        self.persistenceFile.open('put-persistable', 'mqtt-test-server')

        for idx, key in enumerate(self.keys):
            if idx >= keyNbrs:
                break
            data = key  # Store the key as data
            self.persistenceFile.put(key, data)

        fileNames = self._getStorageFileNames()

        self.assertEqual(keyNbrs, len(fileNames))

        # Tidy up on disk
        shutil.rmtree(testPresistenceDirectory)
Esempio n. 16
0
    def parseConfigFile(self, configFile):
        global config

        from configobj import ConfigObj

        config = None

        pathConfigFile = path_helpers.prettify(configFile)

        if pathConfigFile and os.path.isfile(pathConfigFile):
            config = ConfigObj(pathConfigFile)

        if config:
            # Check if most important configuration parameters are present
            assert 'cloudio' in config, 'Missing group \'cloudio\' in config file!'
            assert 'endpoint' in config, 'Missing group \'endpoint\' in config file!'
            assert 'node' in config, 'Missing group \'node\' in config file!'

            assert 'host' in config[
                'cloudio'], 'Missing \'host\' parameter in cloudio group!'
            assert 'port' in config[
                'cloudio'], 'Missing \'port\' parameter in cloudio group!'
            assert 'username' in config[
                'cloudio'], 'Missing \'username\' parameter in cloudio group!'
            assert 'password' in config[
                'cloudio'], 'Missing \'password\' parameter in cloudio group!'
            assert 'subscribe_topics' in config[
                'cloudio'], 'Missing \'subscribe_topics\' parameter in cloudio group!'
            assert 'qos' in config[
                'cloudio'], 'Missing \'qos\' parameter in cloudio group!'

            assert 'name' in config[
                'endpoint'], 'Missing \'name\' parameter in endpoint group!'

            assert 'name' in config[
                'node'], 'Missing \'name\' parameter in node group!'
        else:
            sys.exit(u'Error reading config file')

        return config
Esempio n. 17
0
    def test_putAndRemovePersistable(self):
        keyNbrs = 10
        testPresistenceDirectory = path_helpers.prettify(
            '~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(
            testPresistenceDirectory)

        self.persistenceFile.open('put-persistable', 'mqtt-test-server')

        # Put some data
        for idx, key in enumerate(self.keys):
            if idx >= keyNbrs:
                break
            data = key  # Store the key as data
            self.persistenceFile.put(key, data)

        # Remove in the middle
        self.persistenceFile.remove(self.keys[5])
        self.persistenceFile.remove(self.keys[6])
        # Check files left
        self.assertEqual(keyNbrs - 2, len(self._getStorageFileNames()))

        # Remove first and last
        self.persistenceFile.remove(self.keys[0])
        self.persistenceFile.remove(self.keys[keyNbrs - 1])
        # Check files left
        self.assertEqual(keyNbrs - 4, len(self._getStorageFileNames()))

        # Check names of remaining key files
        fileNames = self._getStorageFileNames()
        self.assertTrue(self.keys[1] in fileNames)
        self.assertTrue(self.keys[2] in fileNames)
        self.assertTrue(self.keys[3] in fileNames)
        self.assertTrue(self.keys[4] in fileNames)
        self.assertTrue(self.keys[7] in fileNames)
        self.assertTrue(self.keys[8] in fileNames)

        # Tidy up on disk
        shutil.rmtree(testPresistenceDirectory)
    def test_containsKeys(self):
        keyNbrs = 5
        testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory)

        self.persistenceFile.open('put-persistable', 'mqtt-test-server')

        # Put some data
        for idx, key in enumerate(self.keys):
            if idx >= keyNbrs:
                break
            data = key  # Store the key as data
            self.persistenceFile.put(key, data)

        self.assertTrue(self.persistenceFile.containsKey(self.keys[0]))
        self.assertTrue(self.persistenceFile.containsKey(self.keys[1]))
        self.assertTrue(self.persistenceFile.containsKey(self.keys[3]))
        self.assertTrue(self.persistenceFile.containsKey(self.keys[4]))
        self.assertFalse(self.persistenceFile.containsKey(self.keys[5]))
        self.assertFalse(self.persistenceFile.containsKey(self.keys[10]))
        self.assertFalse(self.persistenceFile.containsKey(self.keys[20]))

        self.assertEqual(keyNbrs, len(self.persistenceFile.keys()))

        # Remove one key and check again
        self.assertTrue(self.persistenceFile.containsKey(self.keys[2]))     # Should be present
        self.persistenceFile.remove(self.keys[2])                           # Remove it
        self.assertFalse(self.persistenceFile.containsKey(self.keys[2]))    # Should be gone

        self.assertEqual(keyNbrs - 1, len(self.persistenceFile.keys()))

        # Get one key (not removing it) and check again
        self.assertTrue(self.persistenceFile.containsKey(self.keys[4]))     # Should be present
        self.persistenceFile.get(self.keys[4])                              # Get it
        self.assertTrue(self.persistenceFile.containsKey(self.keys[4]))     # Should be still there

        # Tidy up on disk
        shutil.rmtree(testPresistenceDirectory)
Esempio n. 19
0
    def test_putAndGetPersistable(self):
        keyNbrs = 10
        testPresistenceDirectory = path_helpers.prettify(
            '~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(
            testPresistenceDirectory)

        self.persistenceFile.open('put-persistable', 'mqtt-test-server')

        # Put some data
        for idx, key in enumerate(self.keys):
            if idx >= keyNbrs:
                break
            data = key  # Store the key as data
            self.persistenceFile.put(key, data)

        # Get data key[0]
        data = self.persistenceFile.get(self.keys[0])
        self.assertEqual(data.getHeaderBytes(), self.keys[0])

        # Get data key[9]
        data = self.persistenceFile.get(self.keys[9])
        self.assertEqual(data.getHeaderBytes(), self.keys[9])

        # Get data key[3]
        data = self.persistenceFile.get(self.keys[3])
        self.assertEqual(data.getHeaderBytes(), self.keys[3])

        # Get data key[8]
        data = self.persistenceFile.get(self.keys[8])
        self.assertEqual(data.getHeaderBytes(), self.keys[8])

        # Get none existing data
        data = self.persistenceFile.get(self.keys[keyNbrs + 1])
        self.assertEqual(data, None)

        # Tidy up on disk
        shutil.rmtree(testPresistenceDirectory)
    def createModel(self, xmlModelFile):
        try:
            pathName = path_helpers.prettify(xmlModelFile)

            self.log.info('Reading cloud.iO enpoint model from \'%s\'' %
                          pathName)

            pathName = os.path.abspath(
                pathName)  # Convert to absolute path to make isfile() happy

            # Check if config file is present
            if os.path.isfile(pathName):
                # Parse XML config file
                xmlConfigFile = minidom.parse(pathName)

                if xmlConfigFile:
                    configList = xmlConfigFile.getElementsByTagName(u'config')
                    """:type : list of minidom.Element"""

                    for config in configList:
                        deviceTypeList = config.getElementsByTagName(
                            u'deviceType')
                        """:type : list of minidom.Element"""

                        for deviceType in deviceTypeList:
                            """:type : list of minidom.Element"""
                            print(u'Parsing elements for device: ' +
                                  deviceType.getAttribute('typeId'))
                            self._parseDeviceTypeFromXmlDomElement(deviceType)
            else:
                raise RuntimeError(u'Missing configuration file: %s' %
                                   pathName)

        except Exception as e:
            traceback.print_exc()

        # After the endpoint is fully created the presents can be announced
        self.endpoint.announce()
Esempio n. 21
0
    def test_putPersistable(self):
        testPresistenceDirectory = path_helpers.prettify(
            '~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(
            testPresistenceDirectory)

        self.persistenceFile.open('put-persistable', 'mqtt-test-server')

        data = self.keys[0]  # Store the key as data
        self.persistenceFile.put(self.keys[0], data)

        keyFile = os.path.join(self.persistenceFile._storageDirectory(),
                               self.keys[0])
        # Check if name of key file is right
        self.assertEqual(self.persistenceFile._keyFileName(self.keys[0]),
                         keyFile)
        # Check if key file was created
        self.assertTrue(os.path.isfile(keyFile))
        # Check if file data is what we expect
        self.assertEqual(self._getFileContent(keyFile), data)

        # Tidy up on disk
        shutil.rmtree(testPresistenceDirectory)
    def test_putAndRemovePersistable(self):
        keyNbrs = 10
        testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory)

        self.persistenceFile.open('put-persistable', 'mqtt-test-server')

        # Put some data
        for idx, key in enumerate(self.keys):
            if idx >= keyNbrs:
                break
            data = key  # Store the key as data
            self.persistenceFile.put(key, data)

        # Remove in the middle
        self.persistenceFile.remove(self.keys[5])
        self.persistenceFile.remove(self.keys[6])
        # Check files left
        self.assertEqual(keyNbrs -2, len(self._getStorageFileNames()))

        # Remove first and last
        self.persistenceFile.remove(self.keys[0])
        self.persistenceFile.remove(self.keys[keyNbrs - 1])
        # Check files left
        self.assertEqual(keyNbrs - 4, len(self._getStorageFileNames()))

        # Check names of remaining key files
        fileNames = self._getStorageFileNames()
        self.assertTrue(self.keys[1] in fileNames)
        self.assertTrue(self.keys[2] in fileNames)
        self.assertTrue(self.keys[3] in fileNames)
        self.assertTrue(self.keys[4] in fileNames)
        self.assertTrue(self.keys[7] in fileNames)
        self.assertTrue(self.keys[8] in fileNames)

        # Tidy up on disk
        shutil.rmtree(testPresistenceDirectory)
    def test_putAndGetPersistable(self):
        keyNbrs = 10
        testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory)

        self.persistenceFile.open('put-persistable', 'mqtt-test-server')

        # Put some data
        for idx, key in enumerate(self.keys):
            if idx >= keyNbrs:
                break
            data = key  # Store the key as data
            self.persistenceFile.put(key, data)

        # Get data key[0]
        data = self.persistenceFile.get(self.keys[0])
        self.assertEqual(data.getHeaderBytes(), self.keys[0])

        # Get data key[9]
        data = self.persistenceFile.get(self.keys[9])
        self.assertEqual(data.getHeaderBytes(), self.keys[9])

        # Get data key[3]
        data = self.persistenceFile.get(self.keys[3])
        self.assertEqual(data.getHeaderBytes(), self.keys[3])

        # Get data key[8]
        data = self.persistenceFile.get(self.keys[8])
        self.assertEqual(data.getHeaderBytes(), self.keys[8])

        # Get none existing data
        data = self.persistenceFile.get(self.keys[keyNbrs + 1])
        self.assertEqual(data, None)

        # Tidy up on disk
        shutil.rmtree(testPresistenceDirectory)
    def test_clearPresistence(self):
        keyNbrs = 5
        testPresistenceDirectory = path_helpers.prettify('~/mqtt-test-persistence')
        self.persistenceFile = MqttDefaultFilePersistence(testPresistenceDirectory)

        self.persistenceFile.open('put-persistable', 'mqtt-test-server')

        # Put some data
        for idx, key in enumerate(self.keys):
            if idx >= keyNbrs:
                break
            data = key  # Store the key as data
            self.persistenceFile.put(key, data)

        self.assertEqual(keyNbrs, len(self.persistenceFile.keys()))

        # Clear persistence
        self.persistenceFile.clear()

        self.assertEqual(0, len(self.persistenceFile.keys()))
        self.assertEqual(0, len(self._getStorageFileNames()))

        # Tidy up on disk
        shutil.rmtree(testPresistenceDirectory)
    def __init__(self, uuid, configuration=None):
        self._endPointIsReady = False               # Set to true after connection and subscription

        self.uuid = uuid            # type: str
        self.nodes = {}             # type: dict as CloudioNode
        self.cleanSession = True
        self.messageFormat = None   # type: CloudioMessageFormat
        self.persistence = None     # type MqttClientPersistence

        self.log.debug('Creating Endpoint %s' % uuid)

        # Check if a configuration with properties is given
        if configuration is None:
            # Try to load properties using a config file
            properties = ResourceLoader.loadFromLocations(self.uuid + '.properties',
                                                          ['home:' + '/.config/cloud.io/', 'file:/etc/cloud.io/'])
            configuration = PropertiesEndpointConfiguration(properties)

        self._retryInterval = 10    # Connect retry interval in seconds
        self.messageFormat = JsonMessageFormat()

        # Check if 'host' property is present in config file
        host = configuration.getProperty(self.MQTT_HOST_URI_PROPERTY)
        if host == '':
            exit('Missing mandatory property "' + self.MQTT_HOST_URI_PROPERTY + '"')

        # Create persistence object.
        persistenceType = configuration.getProperty(self.MQTT_PERSISTENCE_PROPERTY, self.MQTT_PERSISTENCE_DEFAULT)
        if persistenceType == self.MQTT_PERSISTENCE_MEMORY:
            self.persistence = mqtt.MemoryPersistence()
        elif persistenceType == self.MQTT_PERSISTENCE_FILE:
            persistenceLocation = configuration.getProperty(self.MQTT_PERSISTENCE_LOCATION)
            self.persistence = mqtt.MqttDefaultFilePersistence(directory=persistenceLocation)
        elif persistenceType == self.MQTT_PERSISTENCE_NONE:
            self.persistence = None
        else:
            raise InvalidPropertyException('Unknown persistence implementation ' +
                                           '(ch.hevs.cloudio.endpoint.persistence): ' +
                                           '\'' + persistenceType + '\'')
        # Open peristence storage
        if self.persistence:
            self.persistence.open(clientId=self.uuid, serverUri=host)

        self.options = mqtt.MqttConnectOptions()

        # Last will is a message with the UUID of the endpoint and no payload.
        willMessage = 'DEAD'
        self.options.setWill(u'@offline/' + uuid, willMessage, 1, False)

        self.options._caFile = configuration.getProperty(self.CERT_AUTHORITY_FILE_PROPERTY, None)
        self.options._clientCertFile = configuration.getProperty(self.ENDPOINT_IDENTITY_CERT_FILE_PROPERTY, None)
        self.options._clientKeyFile = configuration.getProperty(self.ENDPOINT_IDENTITY_KEY_FILE_PROPERTY, None)
        self.options._username = configuration.getProperty('username')
        self.options._password = configuration.getProperty('password')
        self.options._tlsVersion = configuration.getProperty(self.ENDPOINT_IDENTITY_TLS_VERSION_PROPERTY, 'tlsv1.2')

        # Make path usable
        self.options._caFile = path_helpers.prettify(self.options._caFile)
        self.options._clientCertFile = path_helpers.prettify(self.options._clientCertFile)
        self.options._clientKeyFile = path_helpers.prettify(self.options._clientKeyFile)

        self._client = mqtt.MqttReconnectClient(host,
                                                clientId=self.uuid + '-endpoint-',
                                                clean_session=self.cleanSession,
                                                options=self.options)
        #  Register callback method for connection established
        self._client.setOnConnectedCallback(self._onConnected)
        # Register callback method to be called when receiving a message over MQTT
        self._client.setOnMessageCallback(self._onMessageArrived)
        # Start the client
        self._client.start()
    def __init__(self, uuid, configuration=None):
        self._endPointIsReady = False  # Set to true after connection and subscription

        self.uuid = uuid  # type: str
        self.nodes = {}  # type: dict as CloudioNode
        self.cleanSession = True
        self.messageFormat = None  # type: CloudioMessageFormat
        self.persistence = None  # type MqttClientPersistence

        self.log.debug('Creating Endpoint %s' % uuid)

        # Check if a configuration with properties is given
        if configuration is None:
            # Try to load properties using a config file
            properties = ResourceLoader.loadFromLocations(
                self.uuid + '.properties',
                ['home:' + '/.config/cloud.io/', 'file:/etc/cloud.io/'])
            configuration = PropertiesEndpointConfiguration(properties)

        self._retryInterval = 10  # Connect retry interval in seconds
        self.messageFormat = JsonMessageFormat()

        # Check if 'host' property is present in config file
        host = configuration.getProperty(self.MQTT_HOST_URI_PROPERTY)
        if host == '':
            exit('Missing mandatory property "' + self.MQTT_HOST_URI_PROPERTY +
                 '"')

        # Create persistence object.
        persistenceType = configuration.getProperty(
            self.MQTT_PERSISTENCE_PROPERTY, self.MQTT_PERSISTENCE_DEFAULT)
        if persistenceType == self.MQTT_PERSISTENCE_MEMORY:
            self.persistence = mqtt.MemoryPersistence()
        elif persistenceType == self.MQTT_PERSISTENCE_FILE:
            persistenceLocation = configuration.getProperty(
                self.MQTT_PERSISTENCE_LOCATION)
            self.persistence = mqtt.MqttDefaultFilePersistence(
                directory=persistenceLocation)
        elif persistenceType == self.MQTT_PERSISTENCE_NONE:
            self.persistence = None
        else:
            raise InvalidPropertyException(
                'Unknown persistence implementation ' +
                '(ch.hevs.cloudio.endpoint.persistence): ' + '\'' +
                persistenceType + '\'')
        # Open peristence storage
        if self.persistence:
            self.persistence.open(clientId=self.uuid, serverUri=host)

        self.options = mqtt.MqttConnectOptions()

        # Last will is a message with the UUID of the endpoint and no payload.
        willMessage = 'DEAD'
        self.options.setWill(u'@offline/' + uuid, willMessage, 1, False)

        self.options._caFile = configuration.getProperty(
            self.CERT_AUTHORITY_FILE_PROPERTY, None)
        self.options._clientCertFile = configuration.getProperty(
            self.ENDPOINT_IDENTITY_CERT_FILE_PROPERTY, None)
        self.options._clientKeyFile = configuration.getProperty(
            self.ENDPOINT_IDENTITY_KEY_FILE_PROPERTY, None)
        self.options._username = configuration.getProperty('username')
        self.options._password = configuration.getProperty('password')
        self.options._tlsVersion = configuration.getProperty(
            self.ENDPOINT_IDENTITY_TLS_VERSION_PROPERTY, 'tlsv1.2')

        # Make path usable
        self.options._caFile = path_helpers.prettify(self.options._caFile)
        self.options._clientCertFile = path_helpers.prettify(
            self.options._clientCertFile)
        self.options._clientKeyFile = path_helpers.prettify(
            self.options._clientKeyFile)

        self._client = mqtt.MqttReconnectClient(
            host,
            clientId=self.uuid + '-endpoint-',
            clean_session=self.cleanSession,
            options=self.options)
        #  Register callback method for connection established
        self._client.setOnConnectedCallback(self._onConnected)
        # Register callback method to be called when receiving a message over MQTT
        self._client.setOnMessageCallback(self._onMessageArrived)
        # Start the client
        self._client.start()