示例#1
0
    def test_set(self):
        status = self._create_status()

        self.assertEqual(status.revision(), 1)
        self.assertEqual(status.get("status://int"), 2)
        self.assertEqual(status.get("status://list"), [])
        self.assertEqual(status.get("status://dict"), {"sub1": 3, "sub2": 4})

        # Revision didn't change with the gets.
        self.assertEqual(status.revision(), 1)

        # Set an integer
        status.set("status://int", 10)
        self.assertEqual(status.get("status://int"), 10)
        self.assertEqual(status.revision(), 2)

        # Set a complex structure, and ensure it is copied, not referenced.
        l = []
        status.set("status://list2", l)
        self.assertEqual(status.get("status://list2"), [])
        l.append(1)
        self.assertEqual(status.get("status://list2"), [])
        self.assertEqual(status.revision(), 3)

        # Ensure that setting to an unchanged value does not increment revision.
        status.set("status://int", 10)
        self.assertEqual(status.get("status://int"), 10)
        self.assertEqual(status.revision(), 3)

        # Set a nested value.
        status.set("status://dict/sub1", 5)
        self.assertEqual(status.get("status://dict/sub1"), 5)
        self.assertEqual(status.revision(), 4)

        # Set a nested value with new intermediate paths.
        status.set("status://nest1/nest2/nest3", "foo")
        self.assertEqual(status.get("status://nest1"), {"nest2": {"nest3": "foo"}})
        self.assertEqual(status.revision(), 5)

        # Clear an existing value.
        status.set("status://dict/sub1", None)
        self.assertEqual(status.get("status://dict"), {"sub1": None, "sub2": 4})
        self.assertEqual(status.revision(), 6)

        # Clear a sub-tree
        status.set("status://nest1", None)
        self.assertEqual(
            status.get("status://"),
            {"dict": {"sub1": None, "sub2": 4}, "int": 10, "list": [], "list2": [], "nest1": None},
        )
        self.assertEqual(status.revision(), 7)

        # Clear a nonexitent value
        status.set("status://nonexistent", None)
        self.assertEqual(
            status.get("status://"),
            {"dict": {"sub1": None, "sub2": 4}, "int": 10, "list": [], "list2": [], "nest1": None},
        )
        self.assertEqual(status.revision(), 7)
示例#2
0
    def test_url_parent_different_revision(self):
        status = self._create_status({'foo': 1, 'bar': 2})
        status.set('status://foo', 3)

        self.assertEqual(status.revision(), 2)
        self.assertEqual(status.revision('status://bar'), 1)

        # Ask for a specialized notification with the parents revision, not
        # the revision of the url.
        d = status.deferred(revision=1, url='status://bar')
        status.set('status://int', 3)
        self.assertFalse(d.called)
示例#3
0
    def test_url_parent_different_revision(self):
        status = self._create_status({"foo": 1, "bar": 2})
        status.set("status://foo", 3)

        self.assertEqual(status.revision(), 2)
        self.assertEqual(status.revision("status://bar"), 1)

        # Ask for a specialized notification with the parents revision, not
        # the revision of the url.
        d = status.deferred(revision=1, url="status://bar")
        status.set("status://int", 3)
        self.assertFalse(d.called)
示例#4
0
    def test_set_revision(self):
        """Test Status.set() if revision is passed in."""

        # Make Sure initial revisions match expectations.
        status = self._create_status()

        # Set a new value, update with correct specified revision.
        status.set("status://int", 10, revision=1)
        self.assertEqual(status.revision(), 2)
        self.assertEqual(status.revision("status://int"), 2)

        # Update an existing value with correct specified revision.
        status.set("status://int", 20, revision=2)
        self.assertEqual(status.revision(), 3)
        self.assertEqual(status.revision("status://int"), 3)

        # Set a new value, update with incorrect specified revision.
        # Should raise exception, and modify nothing.
        self.assertRaises(monitor.status.RevisionMismatch, status.set, "status://int", 30, revision=1)
        self.assertEqual(status.get("status://int"), 20)
        self.assertEqual(status.revision(), 3)
        self.assertEqual(status.revision("status://int"), 3)

        # Set a new value, update with a future version.
        self.assertRaises(monitor.status.RevisionMismatch, status.set, "status://int", 30, revision=100)
        self.assertEqual(status.get("status://int"), 20)
        self.assertEqual(status.revision(), 3)
        self.assertEqual(status.revision("status://int"), 3)
示例#5
0
    def test_creation(self):
        """Verify handle_action with status and http URL strings."""
        status = self._create_status({})

        # If we start with nothing, we should end up with nothing but a revision
        # of 1.
        self.assertEqual(status.revision(), 1)
        self.assertEqual(status.get(), {})
示例#6
0
    def test_creation(self):
        """Verify handle_action with status and http URL strings."""
        status = self._create_status({})

        # If we start with nothing, we should end up with nothing but a revision
        # of 1.
        self.assertEqual(status.revision(), 1)
        self.assertEqual(status.get(), {})
示例#7
0
    def test_set_revision(self):
        """Test Status.set() if revision is passed in."""

        # Make Sure initial revisions match expectations.
        status = self._create_status()

        # Set a new value, update with correct specified revision.
        status.set('status://int', 10, revision=1)
        self.assertEqual(status.revision(), 2)
        self.assertEqual(status.revision('status://int'), 2)

        # Update an existing value with correct specified revision.
        status.set('status://int', 20, revision=2)
        self.assertEqual(status.revision(), 3)
        self.assertEqual(status.revision('status://int'), 3)

        # Set a new value, update with incorrect specified revision.
        # Should raise exception, and modify nothing.
        self.assertRaises(monitor.status.RevisionMismatch,
                          status.set,
                          'status://int',
                          30,
                          revision=1)
        self.assertEqual(status.get('status://int'), 20)
        self.assertEqual(status.revision(), 3)
        self.assertEqual(status.revision('status://int'), 3)

        # Set a new value, update with a future version.
        self.assertRaises(monitor.status.RevisionMismatch,
                          status.set,
                          'status://int',
                          30,
                          revision=100)
        self.assertEqual(status.get('status://int'), 20)
        self.assertEqual(status.revision(), 3)
        self.assertEqual(status.revision('status://int'), 3)
示例#8
0
    def test_set_revision_nested(self):
        """Test Status.set() if revision is passed in."""

        # Make Sure initial revisions match expectations.
        status = self._create_status({
            'int': 1,
            'deep': {
                'foo': 2
            },
        })

        # Update one section.
        status.set('status://int', 10, revision=1)
        self.assertEqual(status.revision(), 2)
        self.assertEqual(status.revision('status://int'), 2)
        self.assertEqual(status.revision('status://deep'), 1)
        self.assertEqual(status.revision('status://deep/foo'), 1)

        # Ensure old section can still update using original revision.
        status.set('status://deep/foo', 20, revision=1)
        self.assertEqual(status.revision(), 3)
        self.assertEqual(status.revision('status://int'), 2)
        self.assertEqual(status.revision('status://deep'), 3)
        self.assertEqual(status.revision('status://deep/foo'), 3)

        # Ensure new creation works with nested revisions.
        status.set('status://deep/bar', 30, revision=3)
        self.assertEqual(status.revision(), 4)
        self.assertEqual(status.revision('status://int'), 2)
        self.assertEqual(status.revision('status://deep'), 4)
        self.assertEqual(status.revision('status://deep/foo'), 3)
        self.assertEqual(status.revision('status://deep/bar'), 4)

        # Ensure value can be updated using a parents revision.
        status.set('status://deep/foo', 21, revision=4)
        self.assertEqual(status.revision(), 5)
        self.assertEqual(status.revision('status://int'), 2)
        self.assertEqual(status.revision('status://deep'), 5)
        self.assertEqual(status.revision('status://deep/foo'), 5)
        self.assertEqual(status.revision('status://deep/bar'), 4)

        # Ensure new creation works with updated revisions.
        status.set('status://deep/bar', 31, revision=4)
        self.assertEqual(status.revision(), 6)
        self.assertEqual(status.revision('status://int'), 2)
        self.assertEqual(status.revision('status://deep'), 6)
        self.assertEqual(status.revision('status://deep/foo'), 5)
        self.assertEqual(status.revision('status://deep/bar'), 6)

        # Ensure value can be updated using a parents revision.
        status.set('status://int', 11, revision=6)
        status.set('status://int', 12, revision=7)
        self.assertEqual(status.revision(), 8)
        self.assertEqual(status.revision('status://int'), 8)
        self.assertEqual(status.revision('status://deep'), 6)
        self.assertEqual(status.revision('status://deep/foo'), 5)
        self.assertEqual(status.revision('status://deep/bar'), 6)

        # Ensure value can NOT be updated using an outdated parent version.
        self.assertRaises(monitor.status.RevisionMismatch,
                          status.set,
                          'status://deep/foo',
                          21,
                          revision=7)

        self.assertEqual(status.revision(), 8)
        self.assertEqual(status.revision('status://int'), 8)
        self.assertEqual(status.revision('status://deep'), 6)
        self.assertEqual(status.revision('status://deep/foo'), 5)
        self.assertEqual(status.revision('status://deep/bar'), 6)
示例#9
0
    def test_nested_revisions(self):
        """Test Status.revision() handles nested revision numbers."""

        # Make Sure initial revisions match expectations.
        status = self._create_status({
            'int': 1,
            'string': 'foo',
            'list': [],
            'deep1': {
                'foo': 2
            },
            'deep2': {
                'sub_deep1': {
                    'foo': 3
                },
                'sub_deep2': {
                    'foo': 4
                }
            },
        })

        self.assertEqual(status.revision(), 1)
        self.assertEqual(status.revision('status://int'), 1)
        self.assertEqual(status.revision('status://string'), 1)
        self.assertEqual(status.revision('status://list'), 1)
        self.assertEqual(status.revision('status://deep1'), 1)
        self.assertEqual(status.revision('status://deep1/foo'), 1)
        self.assertEqual(status.revision('status://deep2'), 1)
        self.assertEqual(status.revision('status://deep2/sub_deep1'), 1)
        self.assertEqual(status.revision('status://deep2/sub_deep1/foo'), 1)
        self.assertEqual(status.revision('status://deep2/sub_deep2'), 1)
        self.assertEqual(status.revision('status://deep2/sub_deep2/foo'), 1)

        self.assertRaises(monitor.status.UnknownUrl, status.revision,
                          'status://nonexistent')

        # Make a simple update.
        status.set('status://int', 10)

        self.assertEqual(status.revision(), 2)
        self.assertEqual(status.revision('status://int'), 2)
        self.assertEqual(status.revision('status://string'), 1)
        self.assertEqual(status.revision('status://list'), 1)
        self.assertEqual(status.revision('status://deep1'), 1)
        self.assertEqual(status.revision('status://deep1/foo'), 1)
        self.assertEqual(status.revision('status://deep2'), 1)
        self.assertEqual(status.revision('status://deep2/sub_deep1'), 1)
        self.assertEqual(status.revision('status://deep2/sub_deep1/foo'), 1)
        self.assertEqual(status.revision('status://deep2/sub_deep2'), 1)
        self.assertEqual(status.revision('status://deep2/sub_deep2/foo'), 1)

        # Make a nested update.
        status.set('status://deep1/foo', 20)

        self.assertEqual(status.revision(), 3)
        self.assertEqual(status.revision('status://int'), 2)
        self.assertEqual(status.revision('status://string'), 1)
        self.assertEqual(status.revision('status://list'), 1)
        self.assertEqual(status.revision('status://deep1'), 3)
        self.assertEqual(status.revision('status://deep1/foo'), 3)
        self.assertEqual(status.revision('status://deep2'), 1)
        self.assertEqual(status.revision('status://deep2/sub_deep1'), 1)
        self.assertEqual(status.revision('status://deep2/sub_deep1/foo'), 1)
        self.assertEqual(status.revision('status://deep2/sub_deep2'), 1)
        self.assertEqual(status.revision('status://deep2/sub_deep2/foo'), 1)

        # Make a deeper nested update.
        status.set('status://deep2/sub_deep1/foo', 30)

        self.assertEqual(status.revision(), 4)
        self.assertEqual(status.revision('status://int'), 2)
        self.assertEqual(status.revision('status://string'), 1)
        self.assertEqual(status.revision('status://list'), 1)
        self.assertEqual(status.revision('status://deep1'), 3)
        self.assertEqual(status.revision('status://deep1/foo'), 3)
        self.assertEqual(status.revision('status://deep2'), 4)
        self.assertEqual(status.revision('status://deep2/sub_deep1'), 4)
        self.assertEqual(status.revision('status://deep2/sub_deep1/foo'), 4)
        self.assertEqual(status.revision('status://deep2/sub_deep2'), 1)
        self.assertEqual(status.revision('status://deep2/sub_deep2/foo'), 1)

        # Replace a sub-tree
        status.set('status://deep2/sub_deep1', {'foo': 40, 'bar': 50})

        self.assertEqual(status.revision(), 5)
        self.assertEqual(status.revision('status://int'), 2)
        self.assertEqual(status.revision('status://string'), 1)
        self.assertEqual(status.revision('status://list'), 1)
        self.assertEqual(status.revision('status://deep1'), 3)
        self.assertEqual(status.revision('status://deep1/foo'), 3)
        self.assertEqual(status.revision('status://deep2'), 5)
        self.assertEqual(status.revision('status://deep2/sub_deep1'), 5)
        self.assertEqual(status.revision('status://deep2/sub_deep1/foo'), 5)
        self.assertEqual(status.revision('status://deep2/sub_deep1/bar'), 5)
        self.assertEqual(status.revision('status://deep2/sub_deep2'), 1)
        self.assertEqual(status.revision('status://deep2/sub_deep2/foo'), 1)

        # Replace a sub-tree, unchanged.
        status.set('status://deep2/sub_deep1', {'foo': 40, 'bar': 50})

        self.assertEqual(status.revision(), 5)
        self.assertEqual(status.revision('status://int'), 2)
        self.assertEqual(status.revision('status://string'), 1)
        self.assertEqual(status.revision('status://list'), 1)
        self.assertEqual(status.revision('status://deep1'), 3)
        self.assertEqual(status.revision('status://deep1/foo'), 3)
        self.assertEqual(status.revision('status://deep2'), 5)
        self.assertEqual(status.revision('status://deep2/sub_deep1'), 5)
        self.assertEqual(status.revision('status://deep2/sub_deep1/foo'), 5)
        self.assertEqual(status.revision('status://deep2/sub_deep1/bar'), 5)
        self.assertEqual(status.revision('status://deep2/sub_deep2'), 1)
        self.assertEqual(status.revision('status://deep2/sub_deep2/foo'), 1)
示例#10
0
    def test_set(self):
        status = self._create_status()

        self.assertEqual(status.revision(), 1)
        self.assertEqual(status.get('status://int'), 2)
        self.assertEqual(status.get('status://list'), [])
        self.assertEqual(status.get('status://dict'), {'sub1': 3, 'sub2': 4})

        # Revision didn't change with the gets.
        self.assertEqual(status.revision(), 1)

        # Set an integer
        status.set('status://int', 10)
        self.assertEqual(status.get('status://int'), 10)
        self.assertEqual(status.revision(), 2)

        # Set a complex structure, and ensure it is copied, not referenced.
        l = []
        status.set('status://list2', l)
        self.assertEqual(status.get('status://list2'), [])
        l.append(1)
        self.assertEqual(status.get('status://list2'), [])
        self.assertEqual(status.revision(), 3)

        # Ensure that setting to an unchanged value does not increment revision.
        status.set('status://int', 10)
        self.assertEqual(status.get('status://int'), 10)
        self.assertEqual(status.revision(), 3)

        # Set a nested value.
        status.set('status://dict/sub1', 5)
        self.assertEqual(status.get('status://dict/sub1'), 5)
        self.assertEqual(status.revision(), 4)

        # Set a nested value with new intermediate paths.
        status.set('status://nest1/nest2/nest3', 'foo')
        self.assertEqual(status.get('status://nest1'),
                         {'nest2': {
                             'nest3': 'foo'
                         }})
        self.assertEqual(status.revision(), 5)

        # Clear an existing value.
        status.set('status://dict/sub1', None)
        self.assertEqual(status.get('status://dict'), {
            'sub1': None,
            'sub2': 4
        })
        self.assertEqual(status.revision(), 6)

        # Clear a sub-tree
        status.set('status://nest1', None)
        self.assertEqual(
            status.get('status://'), {
                'dict': {
                    'sub1': None,
                    'sub2': 4
                },
                'int': 10,
                'list': [],
                'list2': [],
                'nest1': None
            })
        self.assertEqual(status.revision(), 7)

        # Clear a nonexitent value
        status.set('status://nonexistent', None)
        self.assertEqual(
            status.get('status://'), {
                'dict': {
                    'sub1': None,
                    'sub2': 4
                },
                'int': 10,
                'list': [],
                'list2': [],
                'nest1': None
            })
        self.assertEqual(status.revision(), 7)
示例#11
0
    def test_set_revision_nested(self):
        """Test Status.set() if revision is passed in."""

        # Make Sure initial revisions match expectations.
        status = self._create_status({"int": 1, "deep": {"foo": 2}})

        # Update one section.
        status.set("status://int", 10, revision=1)
        self.assertEqual(status.revision(), 2)
        self.assertEqual(status.revision("status://int"), 2)
        self.assertEqual(status.revision("status://deep"), 1)
        self.assertEqual(status.revision("status://deep/foo"), 1)

        # Ensure old section can still update using original revision.
        status.set("status://deep/foo", 20, revision=1)
        self.assertEqual(status.revision(), 3)
        self.assertEqual(status.revision("status://int"), 2)
        self.assertEqual(status.revision("status://deep"), 3)
        self.assertEqual(status.revision("status://deep/foo"), 3)

        # Ensure new creation works with nested revisions.
        status.set("status://deep/bar", 30, revision=3)
        self.assertEqual(status.revision(), 4)
        self.assertEqual(status.revision("status://int"), 2)
        self.assertEqual(status.revision("status://deep"), 4)
        self.assertEqual(status.revision("status://deep/foo"), 3)
        self.assertEqual(status.revision("status://deep/bar"), 4)

        # Ensure value can be updated using a parents revision.
        status.set("status://deep/foo", 21, revision=4)
        self.assertEqual(status.revision(), 5)
        self.assertEqual(status.revision("status://int"), 2)
        self.assertEqual(status.revision("status://deep"), 5)
        self.assertEqual(status.revision("status://deep/foo"), 5)
        self.assertEqual(status.revision("status://deep/bar"), 4)

        # Ensure new creation works with updated revisions.
        status.set("status://deep/bar", 31, revision=4)
        self.assertEqual(status.revision(), 6)
        self.assertEqual(status.revision("status://int"), 2)
        self.assertEqual(status.revision("status://deep"), 6)
        self.assertEqual(status.revision("status://deep/foo"), 5)
        self.assertEqual(status.revision("status://deep/bar"), 6)

        # Ensure value can be updated using a parents revision.
        status.set("status://int", 11, revision=6)
        status.set("status://int", 12, revision=7)
        self.assertEqual(status.revision(), 8)
        self.assertEqual(status.revision("status://int"), 8)
        self.assertEqual(status.revision("status://deep"), 6)
        self.assertEqual(status.revision("status://deep/foo"), 5)
        self.assertEqual(status.revision("status://deep/bar"), 6)

        # Ensure value can NOT be updated using an outdated parent version.
        self.assertRaises(monitor.status.RevisionMismatch, status.set, "status://deep/foo", 21, revision=7)

        self.assertEqual(status.revision(), 8)
        self.assertEqual(status.revision("status://int"), 8)
        self.assertEqual(status.revision("status://deep"), 6)
        self.assertEqual(status.revision("status://deep/foo"), 5)
        self.assertEqual(status.revision("status://deep/bar"), 6)
示例#12
0
    def test_nested_revisions(self):
        """Test Status.revision() handles nested revision numbers."""

        # Make Sure initial revisions match expectations.
        status = self._create_status(
            {
                "int": 1,
                "string": "foo",
                "list": [],
                "deep1": {"foo": 2},
                "deep2": {"sub_deep1": {"foo": 3}, "sub_deep2": {"foo": 4}},
            }
        )

        self.assertEqual(status.revision(), 1)
        self.assertEqual(status.revision("status://int"), 1)
        self.assertEqual(status.revision("status://string"), 1)
        self.assertEqual(status.revision("status://list"), 1)
        self.assertEqual(status.revision("status://deep1"), 1)
        self.assertEqual(status.revision("status://deep1/foo"), 1)
        self.assertEqual(status.revision("status://deep2"), 1)
        self.assertEqual(status.revision("status://deep2/sub_deep1"), 1)
        self.assertEqual(status.revision("status://deep2/sub_deep1/foo"), 1)
        self.assertEqual(status.revision("status://deep2/sub_deep2"), 1)
        self.assertEqual(status.revision("status://deep2/sub_deep2/foo"), 1)

        self.assertRaises(monitor.status.UnknownUrl, status.revision, "status://nonexistent")

        # Make a simple update.
        status.set("status://int", 10)

        self.assertEqual(status.revision(), 2)
        self.assertEqual(status.revision("status://int"), 2)
        self.assertEqual(status.revision("status://string"), 1)
        self.assertEqual(status.revision("status://list"), 1)
        self.assertEqual(status.revision("status://deep1"), 1)
        self.assertEqual(status.revision("status://deep1/foo"), 1)
        self.assertEqual(status.revision("status://deep2"), 1)
        self.assertEqual(status.revision("status://deep2/sub_deep1"), 1)
        self.assertEqual(status.revision("status://deep2/sub_deep1/foo"), 1)
        self.assertEqual(status.revision("status://deep2/sub_deep2"), 1)
        self.assertEqual(status.revision("status://deep2/sub_deep2/foo"), 1)

        # Make a nested update.
        status.set("status://deep1/foo", 20)

        self.assertEqual(status.revision(), 3)
        self.assertEqual(status.revision("status://int"), 2)
        self.assertEqual(status.revision("status://string"), 1)
        self.assertEqual(status.revision("status://list"), 1)
        self.assertEqual(status.revision("status://deep1"), 3)
        self.assertEqual(status.revision("status://deep1/foo"), 3)
        self.assertEqual(status.revision("status://deep2"), 1)
        self.assertEqual(status.revision("status://deep2/sub_deep1"), 1)
        self.assertEqual(status.revision("status://deep2/sub_deep1/foo"), 1)
        self.assertEqual(status.revision("status://deep2/sub_deep2"), 1)
        self.assertEqual(status.revision("status://deep2/sub_deep2/foo"), 1)

        # Make a deeper nested update.
        status.set("status://deep2/sub_deep1/foo", 30)

        self.assertEqual(status.revision(), 4)
        self.assertEqual(status.revision("status://int"), 2)
        self.assertEqual(status.revision("status://string"), 1)
        self.assertEqual(status.revision("status://list"), 1)
        self.assertEqual(status.revision("status://deep1"), 3)
        self.assertEqual(status.revision("status://deep1/foo"), 3)
        self.assertEqual(status.revision("status://deep2"), 4)
        self.assertEqual(status.revision("status://deep2/sub_deep1"), 4)
        self.assertEqual(status.revision("status://deep2/sub_deep1/foo"), 4)
        self.assertEqual(status.revision("status://deep2/sub_deep2"), 1)
        self.assertEqual(status.revision("status://deep2/sub_deep2/foo"), 1)

        # Replace a sub-tree
        status.set("status://deep2/sub_deep1", {"foo": 40, "bar": 50})

        self.assertEqual(status.revision(), 5)
        self.assertEqual(status.revision("status://int"), 2)
        self.assertEqual(status.revision("status://string"), 1)
        self.assertEqual(status.revision("status://list"), 1)
        self.assertEqual(status.revision("status://deep1"), 3)
        self.assertEqual(status.revision("status://deep1/foo"), 3)
        self.assertEqual(status.revision("status://deep2"), 5)
        self.assertEqual(status.revision("status://deep2/sub_deep1"), 5)
        self.assertEqual(status.revision("status://deep2/sub_deep1/foo"), 5)
        self.assertEqual(status.revision("status://deep2/sub_deep1/bar"), 5)
        self.assertEqual(status.revision("status://deep2/sub_deep2"), 1)
        self.assertEqual(status.revision("status://deep2/sub_deep2/foo"), 1)

        # Replace a sub-tree, unchanged.
        status.set("status://deep2/sub_deep1", {"foo": 40, "bar": 50})

        self.assertEqual(status.revision(), 5)
        self.assertEqual(status.revision("status://int"), 2)
        self.assertEqual(status.revision("status://string"), 1)
        self.assertEqual(status.revision("status://list"), 1)
        self.assertEqual(status.revision("status://deep1"), 3)
        self.assertEqual(status.revision("status://deep1/foo"), 3)
        self.assertEqual(status.revision("status://deep2"), 5)
        self.assertEqual(status.revision("status://deep2/sub_deep1"), 5)
        self.assertEqual(status.revision("status://deep2/sub_deep1/foo"), 5)
        self.assertEqual(status.revision("status://deep2/sub_deep1/bar"), 5)
        self.assertEqual(status.revision("status://deep2/sub_deep2"), 1)
        self.assertEqual(status.revision("status://deep2/sub_deep2/foo"), 1)