def testSavedDeviceWillBeAvailableOnAnotherDAOInstance(self):
     device = {'ip':'127.0.0.1'}
     self._device_dao.add('500', device)
     another_dao = DeviceDAO (self._db)
     devices = another_dao.get_devices('500')
     self.assertEqual(1, len(devices))
     self.assertEqual(device, devices[0])
 def testSavedDeviceWontBeAvailableOnAnotherADAOUsingADifferentDB(self):
     device = {'ip':'127.0.0.1'}
     server = couchdb.Server()
     self._device_dao.add('500', device)
     another_dao = DeviceDAO (self._another_db)
     devices = another_dao.get_devices('500')
     self.assertEqual(0, len(devices))
class ServerI(Database.DeviceRegisterServer):

    def __init__(self, *args, **kwargs):
        Database.DeviceRegisterServer.__init__(self, *args, **kwargs)
        self.__person_dao = PersonDAO()
        self.__device_dao = DeviceDAO()

    def register(self, ip, room, current=None):
        print('register: database device ip[{0}] on room[{1}]'.format(ip, room))
        self.__device_dao.add(str(room), {'ip':ip})
        return utils.get_allowed_persons_on_room(self.__person_dao.load_all(), room)
class CacheCoeherenceManager(object):


    def __init__(self):
        self.__device_dao = DeviceDAO()  
        self.__person_dao = PersonDAO()
        self.__ice_communicator = Ice.initialize()

    def update (self, room):
        persons = utils.get_allowed_persons_on_room(self.__person_dao.load_all(), room)

        for device in self.__device_dao.get_devices(room):
            if self.__update_device_cache(device, persons):
                print("CacheCoeherenceManager: update: device[{0}] update with success".format(device))
            else:
                print("CacheCoeherenceManager: update: unable to connect on device[{0}], removing it from db".format(device))
                self.__device_dao.remove(room, device)


    def __update_device_cache(self, device, persons):
        try:
            ip = device['ip']
            print('CacheCoeherenceManager: update_device_cache: updating device[{ip}]'.format(ip = ip))

            proxy_name = "{name}:default -h {ip} -p {port}".format(name = ice_cfg.CACHE_COEHERENCE_SERVER_NAME,
                                                                              ip = ip, port = ice_cfg.CACHE_COEHERENCE_SERVER_PORT)
            print('CacheCoeherenceManager: update_device_cache: connecting at [{0}]'.format(proxy_name))

            base = self.__ice_communicator.stringToProxy(proxy_name)
            print('CacheCoeherenceManager: update_device_cache: obtained proxy base object')
            cache_server = Database.CacheCoeherenceServerPrx.checkedCast(base)
            print('CacheCoeherenceManager: update_device_cache: obtained CacheCoeherenceServer proxy object')
            if not cache_server:
                raise RuntimeError("Invalid proxy")

            cache_server.update(persons)
 
        except:
            traceback.print_exc()
            return False

        return True 
    def setUp (self):
        server = couchdb.Server()

        try:
            server.delete('test')
            server.delete('other-test')
        except:
            pass

        self._db = server.create('test')
        self._another_db = server.create('other-test')
        self._device_dao = DeviceDAO (self._db)
class DeviceDAOTest(unittest.TestCase):

    def setUp (self):
        server = couchdb.Server()

        try:
            server.delete('test')
            server.delete('other-test')
        except:
            pass

        self._db = server.create('test')
        self._another_db = server.create('other-test')
        self._device_dao = DeviceDAO (self._db)
        
    def tearDown (self):
        server = couchdb.Server()
        server.delete('test')
        server.delete('other-test')


    def testRoomCanBeANumber(self):
        device = {'ip':'127.0.0.1'}
        self._device_dao.add(500, device)

        devices = self._device_dao.get_devices(500)
        self.assertEqual(1, len(devices))
        self.assertEqual(device, devices[0])
        self._device_dao.remove(500, device)

        devices = self._device_dao.get_devices(500)
        self.assertEqual(0, len(devices))


    def testAfterAddingADeviceItWillBeThere(self):
        device = {'ip':'127.0.0.1'}
        self._device_dao.add('500', device)
        devices = self._device_dao.get_devices('500')
        self.assertEqual(1, len(devices))
        self.assertEqual(device, devices[0])

    def testAfterRemovingADeviceItWontBeThere(self):
        device = {'ip':'127.0.0.1'}
        self._device_dao.add('500', device)

        devices = self._device_dao.get_devices('500')
        self.assertEqual(1, len(devices))
        self.assertEqual(device, devices[0])

        self._device_dao.remove('500', device)
        devices = self._device_dao.get_devices('500')
        self.assertEqual(0, len(devices))

    def testRemovingADeviceFromARoomThatHasNoDeviceDoesNothing(self):
        self._device_dao.remove('500', {'whatever':'device'})
        devices = self._device_dao.get_devices('500')
        self.assertEqual(0, len(devices))

    def testIfADeviceIsAddedOnMultipleRoomsOnlyTheLastAddWillCount(self):
        device = {'ip':'127.0.0.1'}
        
        self._device_dao.add('35948789', device)
        self._device_dao.add('500', device)
        self._device_dao.add('777', device)

        self.assertEqual([], self._device_dao.get_devices('500'))
        self.assertEqual([], self._device_dao.get_devices('35948789'))

        devices = self._device_dao.get_devices('777')
        self.assertEqual(1, len(devices))
        self.assertTrue(device in devices)
        
    def testRemovingADeviceThatIsNotOnTheDBDoesNothing(self):
        device = {'ip':'127.0.0.1'}
        another_device = {'abacate': 'hahaha'}
        self._device_dao.add('500', device)
        self._device_dao.remove('500', another_device)
        devices = self._device_dao.get_devices('500')
        self.assertEqual(1, len(devices))
        self.assertEqual(device, devices[0])

    def testARoomCanHaveNoDeviceRegistered(self):
        self.assertEqual([], self._device_dao.get_devices('500'))

    def testIfTheSameDeviceIsAddedMultipleTimesItWillBeLikeItHasBeenAddedOnlyOnce(self):
        device = {'ip':'127.0.0.1'}
        self._device_dao.add('500', device)
        self._device_dao.add('500', device)
        self._device_dao.add('500', device)
        self._device_dao.add('500', device)
        devices = self._device_dao.get_devices('500')
        self.assertEqual(1, len(devices))
        self.assertEqual(device, devices[0])

    def testAllDevicesCanBeRetrievedFromARoom(self):
        device  = {'ip':'127.0.0.1'}
        device2 = {'ip':'192.168.160.181'}

        self._device_dao.add('500', device)
        self._device_dao.add('500', device2)

        devices = self._device_dao.get_devices('500')
        self.assertEqual(2, len(devices))
        self.assertTrue(device in devices)
        self.assertTrue(device2 in devices)

    def testDeviceCanBeADictWithAnyData(self):
        device = {'ip':'127.0.0.1', 'metadata' : 'hahaha', 'abacate': 5 }
        self._device_dao.add('500', device)
        devices = self._device_dao.get_devices('500')
        self.assertEqual(1, len(devices))
        self.assertEqual(device, devices[0])

    def testSavedDeviceWillBeAvailableOnAnotherDAOInstance(self):
        device = {'ip':'127.0.0.1'}
        self._device_dao.add('500', device)
        another_dao = DeviceDAO (self._db)
        devices = another_dao.get_devices('500')
        self.assertEqual(1, len(devices))
        self.assertEqual(device, devices[0])

    def testSavedDeviceWontBeAvailableOnAnotherADAOUsingADifferentDB(self):
        device = {'ip':'127.0.0.1'}
        server = couchdb.Server()
        self._device_dao.add('500', device)
        another_dao = DeviceDAO (self._another_db)
        devices = another_dao.get_devices('500')
        self.assertEqual(0, len(devices))
 def __init__(self, *args, **kwargs):
     Database.DeviceRegisterServer.__init__(self, *args, **kwargs)
     self.__person_dao = PersonDAO()
     self.__device_dao = DeviceDAO()
 def __init__(self):
     self.__device_dao = DeviceDAO()  
     self.__person_dao = PersonDAO()
     self.__ice_communicator = Ice.initialize()