#!/usr/bin/env python
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

from unittest import TestCase, main
import asyncio
import logging
from pulsar import Client

class CustomLoggingTest(TestCase):

    serviceUrl = 'pulsar://localhost:6650'

    def test_async_func_with_custom_logger(self):
        # boost::python::call may fail in C++ destructors, even worse, calls
        # to PyErr_Print could corrupt the Python interpreter.
        # See https://github.com/boostorg/python/issues/374 for details.
        # This test is to verify these functions won't be called in C++ destructors
        # so that Python's async function works well.
        client = Client(
            self.serviceUrl,
            logger=logging.getLogger('custom-logger')
        )

        async def async_get(value):
            consumer = client.subscribe('test_async_get', 'sub')
            consumer.close()
            return value

        value = 'foo'
        result = asyncio.run(async_get(value))
        self.assertEqual(value, result)

        client.close()

if __name__ == '__main__':
    logging.basicConfig(encoding='utf-8', level=logging.DEBUG)
    main()
