Example #1
0
 def setUp(self):
     from adhocracy_core.websockets.server import ClientTracker
     app_root = testing.DummyResource()
     app_root['child'] = testing.DummyResource()
     self._child = app_root['child']
     self._tracker = ClientTracker()
Example #2
0
 def setUp(self):
     from adhocracy_core.websockets.server import ClientTracker
     app_root = testing.DummyResource()
     app_root['child'] = testing.DummyResource()
     self._child = app_root['child']
     self._tracker = ClientTracker()
Example #3
0
class ClientTrackerUnitTests(unittest.TestCase):
    def _make_client(self):
        return object()

    def setUp(self):
        from adhocracy_core.websockets.server import ClientTracker
        app_root = testing.DummyResource()
        app_root['child'] = testing.DummyResource()
        self._child = app_root['child']
        self._tracker = ClientTracker()

    def _make_child2(self):
        result = self._child.__parent__['child2'] = testing.DummyResource()
        return result

    def test_subscribe(self):
        client = self._make_client()
        resource = self._child
        result = self._tracker.subscribe(client, resource)
        assert result is True
        assert len(self._tracker._clients2resource_paths) == 1
        assert len(self._tracker._resource_paths2clients) == 1
        assert self._tracker._clients2resource_paths[client] == {'/child'}
        assert self._tracker._resource_paths2clients['/child'] == {client}

    def test_subscribe_redundant(self):
        """Test client subscribing same resource twice."""
        client = self._make_client()
        resource = self._child
        self._tracker.subscribe(client, resource)
        result = self._tracker.subscribe(client, resource)
        assert result is False

    def test_subscribe_two_resources(self):
        """Test client subscribing to two resources."""
        client = self._make_client()
        resource1 = self._child
        resource2 = self._make_child2()
        result1 = self._tracker.subscribe(client, resource1)
        result2 = self._tracker.subscribe(client, resource2)
        assert result1 is True
        assert result2 is True
        assert len(self._tracker._clients2resource_paths) == 1
        assert len(self._tracker._resource_paths2clients) == 2
        assert self._tracker._clients2resource_paths[client] == {
            '/child', '/child2'
        }
        assert self._tracker._resource_paths2clients['/child'] == {client}
        assert self._tracker._resource_paths2clients['/child2'] == {client}

    def test_subscribe_two_clients(self):
        """Test two clients subscribing to same resource."""
        client1 = self._make_client()
        client2 = self._make_client()
        resource = self._child
        result1 = self._tracker.subscribe(client1, resource)
        result2 = self._tracker.subscribe(client2, resource)
        assert result1 is True
        assert result2 is True
        assert len(self._tracker._clients2resource_paths) == 2
        assert len(self._tracker._resource_paths2clients) == 1
        assert self._tracker._clients2resource_paths[client1] == {'/child'}
        assert self._tracker._clients2resource_paths[client2] == {'/child'}
        assert self._tracker._resource_paths2clients['/child'] == {
            client1, client2
        }

    def test_unsubscribe(self):
        client = self._make_client()
        resource = self._child
        self._tracker.subscribe(client, resource)
        result = self._tracker.unsubscribe(client, resource)
        assert result is True
        assert len(self._tracker._clients2resource_paths) == 0
        assert len(self._tracker._resource_paths2clients) == 0

    def test_unsubscribe_redundant(self):
        """Test client unsubscribing from the same resource twice."""
        client = self._make_client()
        resource = self._child
        self._tracker.subscribe(client, resource)
        self._tracker.unsubscribe(client, resource)
        result = self._tracker.unsubscribe(client, resource)
        assert result is False

    def test_delete_subscriptions_for_client_empty(self):
        """Test deleting all subscriptions for a client that has none."""
        client = self._make_client()
        self._tracker.delete_subscriptions_for_client(client)
        assert len(self._tracker._clients2resource_paths) == 0
        assert len(self._tracker._resource_paths2clients) == 0

    def test_delete_subscriptions_for_client_two_resources(self):
        """Test deleting all subscriptions for a client that has two."""
        client = self._make_client()
        resource1 = self._child
        resource2 = self._make_child2()
        self._tracker.subscribe(client, resource1)
        self._tracker.subscribe(client, resource2)
        self._tracker.delete_subscriptions_for_client(client)
        assert len(self._tracker._clients2resource_paths) == 0
        assert len(self._tracker._resource_paths2clients) == 0

    def test_delete_subscriptions_for_client_two_clients(self):
        """Test deleting all subscriptions for one client subscribed to the
        same resource as another one.
        """
        client1 = self._make_client()
        client2 = self._make_client()
        resource = self._child
        self._tracker.subscribe(client1, resource)
        self._tracker.subscribe(client2, resource)
        self._tracker.delete_subscriptions_for_client(client1)
        assert len(self._tracker._clients2resource_paths) == 1
        assert len(self._tracker._resource_paths2clients) == 1
        assert self._tracker._clients2resource_paths[client2] == {'/child'}
        assert self._tracker._resource_paths2clients['/child'] == {client2}
        assert client1 not in self._tracker._clients2resource_paths

    def test_delete_subscriptions_to_resource_empty(self):
        """Test deleting all subscriptions to a resource that has none."""
        resource = self._child
        self._tracker.delete_subscriptions_to_resource(resource)
        assert len(self._tracker._clients2resource_paths) == 0
        assert len(self._tracker._resource_paths2clients) == 0

    def test_delete_subscriptions_to_resource_two_clients(self):
        """Test deleting all subscriptions to a resource that has two."""
        client1 = self._make_client()
        client2 = self._make_client()
        resource = self._child
        assert len(self._tracker._clients2resource_paths) == 0
        assert len(self._tracker._resource_paths2clients) == 0
        self._tracker.subscribe(client1, resource)
        self._tracker.subscribe(client2, resource)
        self._tracker.delete_subscriptions_to_resource(resource)
        assert len(self._tracker._clients2resource_paths) == 0
        assert len(self._tracker._resource_paths2clients) == 0

    def test_delete_subscriptions_to_resource_two_resources(self):
        """Test deleting all subscriptions to a resource if the client has
        multiple subscriptions.
        """
        client = self._make_client()
        resource1 = self._child
        resource2 = self._make_child2()
        self._tracker.subscribe(client, resource1)
        self._tracker.subscribe(client, resource2)
        self._tracker.delete_subscriptions_to_resource(resource1)
        assert len(self._tracker._clients2resource_paths) == 1
        assert len(self._tracker._resource_paths2clients) == 1
        assert self._tracker._clients2resource_paths[client] == {'/child2'}
        assert self._tracker._resource_paths2clients['/child2'] == {client}

    def test_iterate_subscribers_empty(self):
        """Test iterating subscribers for a resource that has none."""
        resource = self._child
        result = list(self._tracker.iterate_subscribers(resource))
        assert len(result) == 0
        assert len(self._tracker._clients2resource_paths) == 0
        assert len(self._tracker._resource_paths2clients) == 0

    def test_iterate_subscribers_two(self):
        """Test iterating subscribers for a resource that has two."""
        client1 = self._make_client()
        client2 = self._make_client()
        resource = self._child
        self._tracker.subscribe(client1, resource)
        self._tracker.subscribe(client2, resource)
        result = list(self._tracker.iterate_subscribers(resource))
        assert len(result) == 2
        assert client1 in result
        assert client2 in result
Example #4
0
class ClientTrackerUnitTests(unittest.TestCase):

    def _make_client(self):
        return object()

    def setUp(self):
        from adhocracy_core.websockets.server import ClientTracker
        app_root = testing.DummyResource()
        app_root['child'] = testing.DummyResource()
        self._child = app_root['child']
        self._tracker = ClientTracker()

    def _make_child2(self):
        result = self._child.__parent__['child2'] = testing.DummyResource()
        return result

    def test_subscribe(self):
        client = self._make_client()
        resource = self._child
        result = self._tracker.subscribe(client, resource)
        assert result is True
        assert len(self._tracker._clients2resource_paths) == 1
        assert len(self._tracker._resource_paths2clients) == 1
        assert self._tracker._clients2resource_paths[client] == {'/child'}
        assert self._tracker._resource_paths2clients['/child'] == {client}

    def test_subscribe_redundant(self):
        """Test client subscribing same resource twice."""
        client = self._make_client()
        resource = self._child
        self._tracker.subscribe(client, resource)
        result = self._tracker.subscribe(client, resource)
        assert result is False

    def test_subscribe_two_resources(self):
        """Test client subscribing to two resources."""
        client = self._make_client()
        resource1 = self._child
        resource2 = self._make_child2()
        result1 = self._tracker.subscribe(client, resource1)
        result2 = self._tracker.subscribe(client, resource2)
        assert result1 is True
        assert result2 is True
        assert len(self._tracker._clients2resource_paths) == 1
        assert len(self._tracker._resource_paths2clients) == 2
        assert self._tracker._clients2resource_paths[client] == {'/child',
                                                                 '/child2'}
        assert self._tracker._resource_paths2clients['/child'] == {client}
        assert self._tracker._resource_paths2clients['/child2'] == {client}

    def test_subscribe_two_clients(self):
        """Test two clients subscribing to same resource."""
        client1 = self._make_client()
        client2 = self._make_client()
        resource = self._child
        result1 = self._tracker.subscribe(client1, resource)
        result2 = self._tracker.subscribe(client2, resource)
        assert result1 is True
        assert result2 is True
        assert len(self._tracker._clients2resource_paths) == 2
        assert len(self._tracker._resource_paths2clients) == 1
        assert self._tracker._clients2resource_paths[client1] == {'/child'}
        assert self._tracker._clients2resource_paths[client2] == {'/child'}
        assert self._tracker._resource_paths2clients['/child'] == {client1, client2}

    def test_unsubscribe(self):
        client = self._make_client()
        resource = self._child
        self._tracker.subscribe(client, resource)
        result = self._tracker.unsubscribe(client, resource)
        assert result is True
        assert len(self._tracker._clients2resource_paths) == 0
        assert len(self._tracker._resource_paths2clients) == 0

    def test_unsubscribe_redundant(self):
        """Test client unsubscribing from the same resource twice."""
        client = self._make_client()
        resource = self._child
        self._tracker.subscribe(client, resource)
        self._tracker.unsubscribe(client, resource)
        result = self._tracker.unsubscribe(client, resource)
        assert result is False

    def test_delete_subscriptions_for_client_empty(self):
        """Test deleting all subscriptions for a client that has none."""
        client = self._make_client()
        self._tracker.delete_subscriptions_for_client(client)
        assert len(self._tracker._clients2resource_paths) == 0
        assert len(self._tracker._resource_paths2clients) == 0

    def test_delete_subscriptions_for_client_two_resources(self):
        """Test deleting all subscriptions for a client that has two."""
        client = self._make_client()
        resource1 = self._child
        resource2 = self._make_child2()
        self._tracker.subscribe(client, resource1)
        self._tracker.subscribe(client, resource2)
        self._tracker.delete_subscriptions_for_client(client)
        assert len(self._tracker._clients2resource_paths) == 0
        assert len(self._tracker._resource_paths2clients) == 0

    def test_delete_subscriptions_for_client_two_clients(self):
        """Test deleting all subscriptions for one client subscribed to the
        same resource as another one.
        """
        client1 = self._make_client()
        client2 = self._make_client()
        resource = self._child
        self._tracker.subscribe(client1, resource)
        self._tracker.subscribe(client2, resource)
        self._tracker.delete_subscriptions_for_client(client1)
        assert len(self._tracker._clients2resource_paths) == 1
        assert len(self._tracker._resource_paths2clients) == 1
        assert self._tracker._clients2resource_paths[client2] == {'/child'}
        assert self._tracker._resource_paths2clients['/child'] == {client2}
        assert client1 not in self._tracker._clients2resource_paths

    def test_delete_subscriptions_to_resource_empty(self):
        """Test deleting all subscriptions to a resource that has none."""
        resource = self._child
        self._tracker.delete_subscriptions_to_resource(resource)
        assert len(self._tracker._clients2resource_paths) == 0
        assert len(self._tracker._resource_paths2clients) == 0

    def test_delete_subscriptions_to_resource_two_clients(self):
        """Test deleting all subscriptions to a resource that has two."""
        client1 = self._make_client()
        client2 = self._make_client()
        resource = self._child
        assert len(self._tracker._clients2resource_paths) == 0
        assert len(self._tracker._resource_paths2clients) == 0
        self._tracker.subscribe(client1, resource)
        self._tracker.subscribe(client2, resource)
        self._tracker.delete_subscriptions_to_resource(resource)
        assert len(self._tracker._clients2resource_paths) == 0
        assert len(self._tracker._resource_paths2clients) == 0

    def test_delete_subscriptions_to_resource_two_resources(self):
        """Test deleting all subscriptions to a resource if the client has
        multiple subscriptions.
        """
        client = self._make_client()
        resource1 = self._child
        resource2 = self._make_child2()
        self._tracker.subscribe(client, resource1)
        self._tracker.subscribe(client, resource2)
        self._tracker.delete_subscriptions_to_resource(resource1)
        assert len(self._tracker._clients2resource_paths) == 1
        assert len(self._tracker._resource_paths2clients) == 1
        assert self._tracker._clients2resource_paths[client] == {'/child2'}
        assert self._tracker._resource_paths2clients['/child2'] == {client}

    def test_iterate_subscribers_empty(self):
        """Test iterating subscribers for a resource that has none."""
        resource = self._child
        result = list(self._tracker.iterate_subscribers(resource))
        assert len(result) == 0
        assert len(self._tracker._clients2resource_paths) == 0
        assert len(self._tracker._resource_paths2clients) == 0

    def test_iterate_subscribers_two(self):
        """Test iterating subscribers for a resource that has two."""
        client1 = self._make_client()
        client2 = self._make_client()
        resource = self._child
        self._tracker.subscribe(client1, resource)
        self._tracker.subscribe(client2, resource)
        result = list(self._tracker.iterate_subscribers(resource))
        assert len(result) == 2
        assert client1 in result
        assert client2 in result