code: def test_proxy_log_artifacts(monkeypatch, tmp_path):
      backend_uri = f"sqlite:///{tmp_path / 'sqlalchemy.db'}"
      port = get_safe_port()
      host = "localhost"
      with subprocess.Popen(
          [
              sys.executable,
              "-m",
              "mlflow",
              "server",
              "--app-name",
              "basic-auth",
              "--backend-store-uri",
              backend_uri,
              "--host",
              host,
              "--port",
              str(port),
              "--workers",
              "1",
              "--dev",
          ]
      ) as prc:
          try:
              url = f"http://{host}:{port}"
              for _ in _wait(url):
                  break
  
              mlflow.set_tracking_uri(url)
              client = MlflowClient(url)
              tmp_file = tmp_path / "test.txt"
              tmp_file.touch()
              username1, password1 = create_user(url)
              with User(username1, password1, monkeypatch):
                  exp_id = client.create_experiment("exp")
                  run = client.create_run(exp_id)
                  client.log_artifact(run.info.run_id, tmp_file)
                  client.list_artifacts(run.info.run_id)
  
              username2, password2 = create_user(url)
              with User(username2, password2, monkeypatch):
                  client.list_artifacts(run.info.run_id)
                  with pytest.raises(
                      requests.HTTPError, match="Permission denied"
                  ):
                      client.log_artifact(run.info.run_id, tmp_file)
  
                  # Ensure that the regular expression captures an experiment ID correctly
                  tmp_file_with_numbers = tmp_path / "123456.txt"
                  tmp_file_with_numbers.touch()
                  with pytest.raises(
                      requests.HTTPError, match="Permission denied"
                  ):
                      client.log_artifact(run.info.run_id, tmp_file)
          finally:
              # Kill the server process to prevent `prc.wait()` (called when exiting the context
              # manager) from waiting forever.
              _kill_all(prc.pid)
  
imports: import subprocess
  import sys
  import time
  from pathlib import Path
  import jwt
  import psutil
  import pytest
  import requests
  import mlflow
  from mlflow import MlflowClient
  from mlflow.environment_variables import MLFLOW_TRACKING_PASSWORD, MLFLOW_TRACKING_USERNAME
  from mlflow.exceptions import MlflowException
  from mlflow.protos.databricks_pb2 import UNAUTHENTICATED, ErrorCode
  from mlflow.utils.os import is_windows
  from tests.helper_functions import random_str
  from tests.server.auth.auth_test_utils import ADMIN_USERNAME, User, create_user
  from tests.tracking.integration_test_utils import _init_server, _send_rest_tracking_post_request, get_safe_port
label_desc: Use image node_id 10 for calling a global function with example usage: test_proxy_log_artifacts(monkeypatch, tmp_path) without return types