code: def test_args() -> None:
      from bokeh.util.strings import nice_join
  
      assert bcss.Serve.args == (
          (
              "--port",
              Argument(
                  metavar="PORT",
                  type=int,
                  help="Port to listen on",
                  default=DEFAULT_SERVER_PORT,
              ),
          ),
          (
              "--address",
              Argument(
                  metavar="ADDRESS",
                  type=str,
                  help="Address to listen on",
                  default=None,
              ),
          ),
          (
              "--unix-socket",
              Argument(
                  metavar="UNIX-SOCKET",
                  type=str,
                  help="Unix socket to bind. Network options such as port, address, ssl options are incompatible with unix socket",
                  default=None,
              ),
          ),
          (
              "--log-level",
              Argument(
                  metavar="LOG-LEVEL",
                  action="store",
                  default=None,
                  choices=(*bcss.LOGLEVELS, "None"),
                  help=f"One of: {nice_join(bcss.LOGLEVELS)}",
              ),
          ),
          (
              "--log-format",
              Argument(
                  metavar="LOG-FORMAT",
                  action="store",
                  default=bcss.DEFAULT_LOG_FORMAT,
                  help=f"A standard Python logging format string (default: {bcss.DEFAULT_LOG_FORMAT!r})".replace(
                      "%", "%%"
                  ),
              ),
          ),
          (
              "--log-file",
              Argument(
                  metavar="LOG-FILE",
                  action="store",
                  default=None,
                  help="A filename to write logs to, or None to write to the standard stream (default: None)",
              ),
          ),
          (
              "--use-config",
              Argument(
                  metavar="CONFIG",
                  type=str,
                  help="Use a YAML config file for settings",
                  default=None,
              ),
          ),
          (
              "files",
              Argument(
                  metavar="DIRECTORY-OR-SCRIPT",
                  nargs="*",
                  help="The app directories or scripts to serve (serve empty document if not specified)",
                  default=None,
              ),
          ),
          (
              "--args",
              Argument(
                  metavar="COMMAND-LINE-ARGS",
                  nargs=argparse.REMAINDER,
                  help="Command line arguments remaining to passed on to the application handler. "
                  "NOTE: if this argument precedes DIRECTORY-OR-SCRIPT then some other argument, e.g. "
                  "--show, must be placed before the directory or script. ",
              ),
          ),
          (
              "--dev",
              Argument(
                  metavar="FILES-TO-WATCH",
                  action="store",
                  default=None,
                  type=str,
                  nargs="*",
                  help="Enable live reloading during app development. "
                  "By default it watches all *.py *.html *.css *.yaml files "
                  "in the app directory tree. Additional files can be passed "
                  "as arguments. "
                  "NOTE: if this argument precedes DIRECTORY-OR-SCRIPT then some other argument, e.g "
                  "--show, must be placed before the directory or script. "
                  "NOTE: This setting only works with a single app. "
                  "It also restricts the number of processes to 1. "
                  "NOTE FOR WINDOWS USERS : this option must be invoked using "
                  "'python -m bokeh'. If not Tornado will fail to restart the "
                  "server",
              ),
          ),
          (
              "--show",
              Argument(
                  action="store_true",
                  help="Open server app(s) in a browser",
              ),
          ),
          (
              "--allow-websocket-origin",
              Argument(
                  metavar="HOST[:PORT]",
                  action="append",
                  type=str,
                  help="Public hostnames which may connect to the Bokeh websocket "
                  "With unix socket, the websocket origin restrictions should be enforced by the proxy.",
              ),
          ),
          (
              "--prefix",
              Argument(
                  metavar="PREFIX",
                  type=str,
                  help="URL prefix for Bokeh server URLs",
                  default=None,
              ),
          ),
          (
              "--ico-path",
              Argument(
                  metavar="ICO_PATH",
                  type=str,
                  help="Path to a .ico file to use as the favicon.ico, or 'none' to "
                  "disable favicon.ico support. If unset, a default Bokeh .ico "
                  "file will be used",
                  default=None,
              ),
          ),
          (
              "--keep-alive",
              Argument(
                  metavar="MILLISECONDS",
                  type=int,
                  help="How often to send a keep-alive ping to clients, 0 to disable.",
                  default=None,
              ),
          ),
          (
              "--check-unused-sessions",
              Argument(
                  metavar="MILLISECONDS",
                  type=int,
                  help="How often to check for unused sessions",
                  default=None,
              ),
          ),
          (
              "--unused-session-lifetime",
              Argument(
                  metavar="MILLISECONDS",
                  type=int,
                  help="How long unused sessions last",
                  default=None,
              ),
          ),
          (
              "--stats-log-frequency",
              Argument(
                  metavar="MILLISECONDS",
                  type=int,
                  help="How often to log stats",
                  default=None,
              ),
          ),
          (
              "--mem-log-frequency",
              Argument(
                  metavar="MILLISECONDS",
                  type=int,
                  help="How often to log memory usage information",
                  default=None,
              ),
          ),
          (
              "--use-xheaders",
              Argument(
                  action="store_true",
                  help="Prefer X-headers for IP/protocol information",
              ),
          ),
          (
              "--ssl-certfile",
              Argument(
                  metavar="CERTFILE",
                  action="store",
                  default=None,
                  help="Absolute path to a certificate file for SSL termination",
              ),
          ),
          (
              "--ssl-keyfile",
              Argument(
                  metavar="KEYFILE",
                  action="store",
                  default=None,
                  help="Absolute path to a private key file for SSL termination",
              ),
          ),
          (
              "--session-ids",
              Argument(
                  metavar="MODE",
                  action="store",
                  default=None,
                  choices=bcss.SESSION_ID_MODES,
                  help=f"One of: {nice_join(bcss.SESSION_ID_MODES)}",
              ),
          ),
          (
              "--auth-module",
              Argument(
                  metavar="AUTH_MODULE",
                  action="store",
                  default=None,
                  help="Absolute path to a Python module that implements auth hooks",
              ),
          ),
          (
              "--enable-xsrf-cookies",
              Argument(
                  action="store_true",
                  default=False,
                  help="Whether to enable Tornado support for XSRF cookies. All "
                  "PUT, POST, or DELETE handlers must be properly instrumented "
                  "when this setting is enabled.",
              ),
          ),
          (
              "--exclude-headers",
              Argument(
                  action="store",
                  default=None,
                  nargs="+",
                  help="A list of request headers to exclude from the session "
                  "context (by default all headers are included).",
              ),
          ),
          (
              "--exclude-cookies",
              Argument(
                  action="store",
                  default=None,
                  nargs="+",
                  help="A list of request cookies to exclude from the session "
                  "context (by default all cookies are included).",
              ),
          ),
          (
              "--include-headers",
              Argument(
                  action="store",
                  default=None,
                  nargs="+",
                  help="A list of request headers to make available in the session "
                  "context (by default all headers are included).",
              ),
          ),
          (
              "--include-cookies",
              Argument(
                  action="store",
                  default=None,
                  nargs="+",
                  help="A list of request cookies to make available in the session "
                  "context (by default all cookies are included).",
              ),
          ),
          (
              "--cookie-secret",
              Argument(
                  metavar="COOKIE_SECRET",
                  action="store",
                  default=None,
                  help="Configure to enable getting/setting secure cookies",
              ),
          ),
          (
              "--index",
              Argument(
                  metavar="INDEX",
                  action="store",
                  default=None,
                  help="Path to a template to use for the site index",
              ),
          ),
          (
              "--disable-index",
              Argument(
                  action="store_true",
                  help="Do not use the default index on the root path",
              ),
          ),
          (
              "--disable-index-redirect",
              Argument(
                  action="store_true",
                  help="Do not redirect to running app from root path",
              ),
          ),
          (
              "--num-procs",
              Argument(
                  metavar="N",
                  action="store",
                  help="Number of worker processes for an app. Using "
                  "0 will autodetect number of cores (defaults to 1)",
                  default=1,
                  type=int,
              ),
          ),
          (
              "--session-token-expiration",
              Argument(
                  metavar="N",
                  action="store",
                  help="Duration in seconds that a new session token "
                  "is valid for session creation. After the expiry "
                  "time has elapsed, the token will not be able "
                  "create a new session (defaults to  seconds).",
                  default=300,
                  type=int,
              ),
          ),
          (
              "--websocket-max-message-size",
              Argument(
                  metavar="BYTES",
                  action="store",
                  help="Set the Tornado websocket_max_message_size value "
                  "(default: 20MB)",
                  default=20 * 1024 * 1024,
                  type=int,
              ),
          ),
          (
              "--websocket-compression-level",
              Argument(
                  metavar="LEVEL",
                  action="store",
                  help="Set the Tornado WebSocket compression_level",
                  default=None,
                  type=int,
              ),
          ),
          (
              "--websocket-compression-mem-level",
              Argument(
                  metavar="LEVEL",
                  action="store",
                  help="Set the Tornado WebSocket compression mem_level",
                  default=None,
                  type=int,
              ),
          ),
          (
              "--glob",
              Argument(
                  action="store_true",
                  help="Process all filename arguments as globs",
              ),
          ),
      )
  
imports: from __future__ import annotations
  import pytest
  import argparse
  import contextlib
  import os.path
  import re
  import socket
  import subprocess
  import sys
  import time
  from os.path import join, split
  from pathlib import Path
  from queue import Empty, Queue
  from threading import Thread
  import requests
  import requests_unixsocket
  from bokeh.command.subcommand import Argument
  from bokeh.resources import DEFAULT_SERVER_PORT
  from tests.support.util.env import envset
  import bokeh.command.subcommands.serve
label_desc: Use image node_id 4 for calling a global function with example usage: test_args() without return types