def setUp(self):
        yield super(NotificationErrorsTestCase, self).setUp()
        self.event_sent = defer.Deferred()
        self.notifier = FakeNotifier(event_sent_deferred=self.event_sent)
        self.patch(notifier, 'get_notifier', lambda: self.notifier)
        self.fake_reactor = DummyReactor()

        self.ssfactory = StorageServerFactory(reactor=self.fake_reactor)

        protocol = StorageServer()
        protocol.factory = self.ssfactory
        protocol.working_caps = ["volumes", "generations"]
        protocol.session_id = uuid.uuid4()
        self.patch(self.ssfactory.content, 'get_user_by_id',
                   lambda *a: self.induced_error)
        self.handler = self.add_memento_handler(logger)
    def setUp(self):
        yield super(NotificationErrorsTestCase, self).setUp()
        self.event_sent = defer.Deferred()
        self.notifier = FakeNotifier(event_sent_deferred=self.event_sent)
        self.patch(notifier, 'get_notifier', lambda: self.notifier)
        self.fake_reactor = DummyReactor()

        self.ssfactory = StorageServerFactory(reactor=self.fake_reactor)

        protocol = StorageServer()
        protocol.factory = self.ssfactory
        protocol.working_caps = ["volumes", "generations"]
        protocol.session_id = uuid.uuid4()
        self.patch(self.ssfactory.content, 'get_user_by_id',
                   lambda *a: self.induced_error)
        self.handler = self.add_memento_handler(logger)
class NotificationErrorsTestCase(TestWithDatabase):
    """Test Notification error handling.

    These tests will throw notifications at the server that will raise
    exceptions. Some events don't trigger exceptions in themselves, but an
    exception is created at broadcast.

    """

    induced_error = Failure(ValueError("Test error"))

    @defer.inlineCallbacks
    def setUp(self):
        yield super(NotificationErrorsTestCase, self).setUp()
        self.event_sent = defer.Deferred()
        self.notifier = FakeNotifier(event_sent_deferred=self.event_sent)
        self.patch(notifier, 'get_notifier', lambda: self.notifier)
        self.fake_reactor = DummyReactor()

        self.ssfactory = StorageServerFactory(reactor=self.fake_reactor)

        protocol = StorageServer()
        protocol.factory = self.ssfactory
        protocol.working_caps = ["volumes", "generations"]
        protocol.session_id = uuid.uuid4()
        self.patch(self.ssfactory.content, 'get_user_by_id',
                   lambda *a: self.induced_error)
        self.handler = self.add_memento_handler(logger)

    @defer.inlineCallbacks
    def check_event(self, event, **kwargs):
        """Test an error in node update."""
        self.notifier.send_event(event)
        yield self.event_sent

        actual = self.handler.records_by_level[logging.ERROR]
        self.assertEqual(len(actual), 1)
        expected = '%s in notification %r while calling deliver_%s(**%r)' % (
            self.induced_error.value, event, event.event_type, kwargs)
        self.assertEqual(actual[0].getMessage(), expected)

    def test_share_created(self):
        """Test the share events."""
        event_args = (
            uuid.uuid4(), u"name", uuid.uuid4(), 1, 2, Share.VIEW, False)
        return self.check_event(ShareCreated(*event_args))

    def test_share_deleted(self):
        """Test the share events."""
        event_args = (
            uuid.uuid4(), u"name", uuid.uuid4(), 1, 2, Share.VIEW, False)
        return self.check_event(ShareDeleted(*event_args))

    def test_share_declined(self):
        """Test the share events."""
        event_args = (
            uuid.uuid4(), u"name", uuid.uuid4(), 1, 2, Share.VIEW, False)
        return self.check_event(ShareDeclined(*event_args))

    def test_share_accepted(self):
        """Test the share events."""
        event_args = (
            uuid.uuid4(), u"name", uuid.uuid4(), 1, 2, Share.VIEW, True)
        return self.check_event(
            ShareAccepted(*event_args), recipient_id=u'test')

    def test_udf_delete(self):
        """Test UDF Delete."""
        return self.check_event(UDFDelete(1, uuid.uuid4(), uuid.uuid4()))

    def test_udf_create(self):
        """Test UDF Create."""
        return self.check_event(
            UDFCreate(1, uuid.uuid4(), uuid.uuid4(), u"path", uuid.uuid4()))

    def test_new_volume_gen(self):
        """Test the new gen for volume events."""
        event = VolumeNewGeneration(1, uuid.uuid4(), 77, uuid.uuid4())
        return self.check_event(event)
class NotificationErrorsTestCase(TestWithDatabase):
    """Test Notification error handling.

    These tests will throw notifications at the server that will raise
    exceptions. Some events don't trigger exceptions in themselves, but an
    exception is created at broadcast.

    """

    induced_error = Failure(ValueError("Test error"))

    @defer.inlineCallbacks
    def setUp(self):
        yield super(NotificationErrorsTestCase, self).setUp()
        self.event_sent = defer.Deferred()
        self.notifier = FakeNotifier(event_sent_deferred=self.event_sent)
        self.patch(notifier, 'get_notifier', lambda: self.notifier)
        self.fake_reactor = DummyReactor()

        self.ssfactory = StorageServerFactory(reactor=self.fake_reactor)

        protocol = StorageServer()
        protocol.factory = self.ssfactory
        protocol.working_caps = ["volumes", "generations"]
        protocol.session_id = uuid.uuid4()
        self.patch(self.ssfactory.content, 'get_user_by_id',
                   lambda *a: self.induced_error)
        self.handler = self.add_memento_handler(logger)

    @defer.inlineCallbacks
    def check_event(self, event, **kwargs):
        """Test an error in node update."""
        self.notifier.send_event(event)
        yield self.event_sent

        actual = self.handler.records_by_level[logging.ERROR]
        self.assertEqual(len(actual), 1)
        expected = '%s in notification %r while calling deliver_%s(**%r)' % (
            self.induced_error.value, event, event.event_type, kwargs)
        self.assertEqual(actual[0].getMessage(), expected)

    def test_share_created(self):
        """Test the share events."""
        event_args = (uuid.uuid4(), u"name", uuid.uuid4(), 1, 2, Share.VIEW,
                      False)
        return self.check_event(ShareCreated(*event_args))

    def test_share_deleted(self):
        """Test the share events."""
        event_args = (uuid.uuid4(), u"name", uuid.uuid4(), 1, 2, Share.VIEW,
                      False)
        return self.check_event(ShareDeleted(*event_args))

    def test_share_declined(self):
        """Test the share events."""
        event_args = (uuid.uuid4(), u"name", uuid.uuid4(), 1, 2, Share.VIEW,
                      False)
        return self.check_event(ShareDeclined(*event_args))

    def test_share_accepted(self):
        """Test the share events."""
        event_args = (uuid.uuid4(), u"name", uuid.uuid4(), 1, 2, Share.VIEW,
                      True)
        return self.check_event(ShareAccepted(*event_args),
                                recipient_id=u'test')

    def test_udf_delete(self):
        """Test UDF Delete."""
        return self.check_event(UDFDelete(1, uuid.uuid4(), uuid.uuid4()))

    def test_udf_create(self):
        """Test UDF Create."""
        return self.check_event(
            UDFCreate(1, uuid.uuid4(), uuid.uuid4(), u"path", uuid.uuid4()))

    def test_new_volume_gen(self):
        """Test the new gen for volume events."""
        event = VolumeNewGeneration(1, uuid.uuid4(), 77, uuid.uuid4())
        return self.check_event(event)