def METHOD_NAME(self):
    run_count = 0
    cache.start_session()
    @cache.stored(KEY)
    def func():
        nonlocal run_count
        run_count += 1
        return b"foo"
    # cache is empty
    self.assertIsNone(cache.get(KEY))
    self.assertEqual(run_count, 0)
    self.assertEqual(func(), b"foo")
    # function was run
    self.assertEqual(run_count, 1)
    self.assertEqual(cache.get(KEY), b"foo")
    # function does not run again but returns cached value
    self.assertEqual(func(), b"foo")
    self.assertEqual(run_count, 1)
    @cache.stored_async(KEY)
    async def async_func():
        nonlocal run_count
        run_count += 1
        return b"bar"
    # cache is still full
    self.assertEqual(await_result(async_func()), b"foo")
    self.assertEqual(run_count, 1)
    cache.start_session()
    self.assertEqual(await_result(async_func()), b"bar")
    self.assertEqual(run_count, 2)
    # awaitable is also run only once
    self.assertEqual(await_result(async_func()), b"bar")
    self.assertEqual(run_count, 2)