예제 #1
0
class TestSettingsCache(unittest.TestCase):
    def setUp(self):
        self._settings_view_factory = MockSettingsViewFactory()
        self._settings_cache = SettingsCache(self._settings_view_factory, )

    def test_get_settings(self):
        """
        Test that a setting can be fetched from the state.
        """
        self._settings_view_factory.add_setting("setting1", "test")
        self.assertIsNone(self._settings_cache["setting1"])

        settings_view = \
            self._settings_view_factory.create_settings_view("state_root")
        self.assertEqual(
            self._settings_cache.get_setting("setting1", "state_root"),
            settings_view.get_setting("setting1"))

    def test_setting_invalidate(self):
        """
        Test that a setting can be invalidated.
        """
        self._settings_view_factory.add_setting("setting1", "test")
        self._settings_cache.invalidate("setting1")

        self.assertEqual(self._settings_cache["setting2"], None)

        settings_view = \
            self._settings_view_factory.create_settings_view("state_root")
        self.assertEqual(
            self._settings_cache.get_setting("setting1", "state_root"),
            settings_view.get_setting("setting1"))

    def test_forked(self):
        """
        Test that forked() invalidates all items in the cache, and they can
        be fetched from state.
        """
        self._settings_view_factory.add_setting("setting1", "test1")
        self._settings_view_factory.add_setting("setting2", "test2")

        settings_view = \
            self._settings_view_factory.create_settings_view("state_root")

        self._settings_cache.get_setting("setting1", "test1")
        self._settings_cache.get_setting("setting2", "test2")

        self.assertEqual(len(self._settings_cache), 2)
        self._settings_cache.forked()

        self.assertEqual(self._settings_cache["setting1"], None)
        self.assertEqual(self._settings_cache["setting2"], None)

        self.assertEqual(
            self._settings_cache.get_setting("setting1", "state_root"),
            settings_view.get_setting("setting1"))

        self.assertEqual(
            self._settings_cache.get_setting("setting2", "state_root"),
            settings_view.get_setting("setting2"))
예제 #2
0
class TestSettingsObserver(unittest.TestCase):
    def setUp(self):
        self._settings_view_factory = MockSettingsViewFactory()
        self._settings_cache = SettingsCache(self._settings_view_factory, )
        self._settings_obsever = SettingsObserver(
            to_update=self._settings_cache.invalidate,
            forked=self._settings_cache.forked)

        # Make sure SettingsCache has populated settings
        self._settings_view_factory.add_setting("setting1", "test")

    def create_block(self, previous_block_id="0000000000000000"):
        block_header = BlockHeader(block_num=85,
                                   state_root_hash="0987654321fedcba",
                                   previous_block_id=previous_block_id)
        block = BlockWrapper(
            Block(header_signature="abcdef1234567890",
                  header=block_header.SerializeToString()))
        return block

    def test_chain_update(self):
        """
        Test that if there is no fork and only one value is updated, only
        that value is in validated in the catch.
        """
        # Set up cache so it does not fork
        block1 = self.create_block()
        self._settings_obsever.chain_update(block1, [])
        self._settings_cache.get_setting("setting1", "state_root")
        self.assertNotEqual(self._settings_cache["setting1"], None)

        # Add next block and event that says network was updated.
        block2 = self.create_block("abcdef1234567890")
        event = Event(
            event_type="settings/update",
            attributes=[Event.Attribute(key="updated", value="setting1")])
        receipts = TransactionReceipt(events=[event])
        self._settings_obsever.chain_update(block2, [receipts])
        # Check that only "network" was invalidated
        self.assertEqual(self._settings_cache["setting"], None)

        # check that the correct values can be fetched from state.
        settings_view = \
            self._settings_view_factory.create_settings_view("state_root")

        self.assertEqual(
            self._settings_cache.get_setting("setting1", "state_root"),
            settings_view.get_setting("setting1"))

    def test_fork(self):
        """
        Test that if there is a fork, all values in the cache will be
        invalidated and fetched from state.
        """
        block = self.create_block()
        self._settings_obsever.chain_update(block, [])
        # Check that all items are invalid
        for key in self._settings_cache:
            self.assertEqual(self._settings_cache[key], None)

        # Check that the items can be fetched from state.
        settings_view = \
            self._settings_view_factory.create_settings_view("state_root")

        self.assertEqual(
            self._settings_cache.get_setting("setting1", "state_root"),
            settings_view.get_setting("setting1"))