Skip to content

Missing test data in source distribution #1112

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
mgorny opened this issue Jun 3, 2025 · 1 comment · May be fixed by #1113
Open

Missing test data in source distribution #1112

mgorny opened this issue Jun 3, 2025 · 1 comment · May be fixed by #1113

Comments

@mgorny
Copy link

mgorny commented Jun 3, 2025

As of 0.22.1, the tests/certs and tests/proc directories are missing from the source distribution, which leads to test failures:

$ pytest
========================================================= test session starts =========================================================
platform linux -- Python 3.13.3, pytest-8.4.0, pluggy-1.6.0
rootdir: /tmp/prometheus_client-0.22.1
configfile: pyproject.toml
collected 253 items                                                                                                                   

tests/test_asgi.py ssssssss                                                                                                     [  3%]
tests/test_core.py .........................................................................................................    [ 44%]
tests/test_exposition.py ............................F..............................                                            [ 67%]
tests/test_gc_collector.py ..                                                                                                   [ 68%]
tests/test_graphite_bridge.py .......                                                                                           [ 71%]
tests/test_multiprocess.py .............................                                                                        [ 83%]
tests/test_parser.py ...........................                                                                                [ 93%]
tests/test_platform_collector.py ..                                                                                             [ 94%]
tests/test_process_collector.py FFF.                                                                                            [ 96%]
tests/test_samples.py ..                                                                                                        [ 96%]
tests/test_twisted.py s                                                                                                         [ 97%]
tests/test_wsgi.py .......                                                                                                      [100%]

============================================================== FAILURES ===============================================================
___________________________________________ TestPushGateway.test_push_with_tls_auth_handler ___________________________________________

self = <test_exposition.TestPushGateway testMethod=test_push_with_tls_auth_handler>

    def test_push_with_tls_auth_handler(self):
        def my_auth_handler(url, method, timeout, headers, data):
            certs_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'certs')
            return tls_auth_handler(url, method, timeout, headers, data, os.path.join(certs_dir, "cert.pem"), os.path.join(certs_dir, "key.pem"))
    
>       push_to_gateway(self.address, "my_job_with_tls_auth", self.registry, handler=my_auth_handler)

tests/test_exposition.py:362: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
prometheus_client/exposition.py:554: in push_to_gateway
    _use_gateway('PUT', gateway, job, registry, grouping_key, timeout, handler)
prometheus_client/exposition.py:646: in _use_gateway
    handler(
tests/test_exposition.py:360: in my_auth_handler
    return tls_auth_handler(url, method, timeout, headers, data, os.path.join(certs_dir, "cert.pem"), os.path.join(certs_dir, "key.pem"))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

url = 'http://localhost:44163/metrics/job/my_job_with_tls_auth', method = 'PUT', timeout = 30
headers = [('Content-Type', 'text/plain; version=0.0.4; charset=utf-8')], data = b'# HELP g help\n# TYPE g gauge\ng 0.0\n'
certfile = '/tmp/prometheus_client-0.22.1/tests/certs/cert.pem', keyfile = '/tmp/prometheus_client-0.22.1/tests/certs/key.pem'
cafile = None, protocol = <_SSLMethod.PROTOCOL_TLS_CLIENT: 16>, insecure_skip_verify = False

    def tls_auth_handler(
            url: str,
            method: str,
            timeout: Optional[float],
            headers: List[Tuple[str, str]],
            data: bytes,
            certfile: str,
            keyfile: str,
            cafile: Optional[str] = None,
            protocol: int = ssl.PROTOCOL_TLS_CLIENT,
            insecure_skip_verify: bool = False,
    ) -> Callable[[], None]:
        """Handler that implements an HTTPS connection with TLS Auth.
    
        The default protocol (ssl.PROTOCOL_TLS_CLIENT) will also enable
        ssl.CERT_REQUIRED and SSLContext.check_hostname by default. This can be
        disabled by setting insecure_skip_verify to True.
    
        Both this handler and the TLS feature on pushgateay are experimental."""
        context = ssl.SSLContext(protocol=protocol)
        if cafile is not None:
            context.load_verify_locations(cafile)
        else:
            context.load_default_certs()
    
        if insecure_skip_verify:
            context.check_hostname = False
            context.verify_mode = ssl.CERT_NONE
    
>       context.load_cert_chain(certfile=certfile, keyfile=keyfile)
E       FileNotFoundError: [Errno 2] No such file or directory

prometheus_client/exposition.py:503: FileNotFoundError
_________________________________________________ TestProcessCollector.test_namespace _________________________________________________

self = <test_process_collector.TestProcessCollector testMethod=test_namespace>

    def test_namespace(self):
        collector = ProcessCollector(proc=self.test_proc, pid=lambda: 26231, registry=self.registry, namespace='n')
        collector._ticks = 100
        collector._pagesize = 4096
    
>       self.assertEqual(17.21, self.registry.get_sample_value('n_process_cpu_seconds_total'))
E       AssertionError: 17.21 != None

tests/test_process_collector.py:30: AssertionError
__________________________________________________ TestProcessCollector.test_working __________________________________________________

self = <test_process_collector.TestProcessCollector testMethod=test_working>

    def test_working(self):
        collector = ProcessCollector(proc=self.test_proc, pid=lambda: 26231, registry=self.registry)
        collector._ticks = 100
        collector._pagesize = 4096
    
>       self.assertEqual(17.21, self.registry.get_sample_value('process_cpu_seconds_total'))
E       AssertionError: 17.21 != None

tests/test_process_collector.py:17: AssertionError
________________________________________________ TestProcessCollector.test_working_584 ________________________________________________

self = <test_process_collector.TestProcessCollector testMethod=test_working_584>

    def test_working_584(self):
        collector = ProcessCollector(proc=self.test_proc, pid=lambda: "584\n", registry=self.registry)
        collector._ticks = 100
        collector._pagesize = 4096
    
>       self.assertEqual(0.0, self.registry.get_sample_value('process_cpu_seconds_total'))
E       AssertionError: 0.0 != None

tests/test_process_collector.py:43: AssertionError
======================================================= short test summary info =======================================================
FAILED tests/test_exposition.py::TestPushGateway::test_push_with_tls_auth_handler - FileNotFoundError: [Errno 2] No such file or directory
FAILED tests/test_process_collector.py::TestProcessCollector::test_namespace - AssertionError: 17.21 != None
FAILED tests/test_process_collector.py::TestProcessCollector::test_working - AssertionError: 17.21 != None
FAILED tests/test_process_collector.py::TestProcessCollector::test_working_584 - AssertionError: 0.0 != None
============================================== 4 failed, 240 passed, 9 skipped in 4.19s ===============================================
@mgorny
Copy link
Author

mgorny commented Jun 3, 2025

This is a regression from b0a6f12 which removed MANIFEST.in.

mgorny added a commit to mgorny/client_python that referenced this issue Jun 3, 2025
Readd parts of `MANIFEST.in` responsible for including the test data
in the source distribution.  Without that, setuptools includes only
`.py` files from the test tree, leading to test failures.

Fixes prometheus#1112
@mgorny mgorny linked a pull request Jun 3, 2025 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant