#
# 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.
#

[pytest]
junit_family = xunit2
filterwarnings =
  ignore:Deprecated call to `pkg_resources.declare_namespace\('.*'\):DeprecationWarning
  ignore::DeprecationWarning:google.rpc

# Disable class-name-based test discovery.
python_classes =
# Disable function-name-based test discovery.
python_functions =
# Discover tests using filenames.
# See conftest.py for extra collection rules.
python_files = test_*.py *_test.py *_test_py3*.py *_test_it.py

markers =
    uses_gcp_java_expansion_service: collect Cross Language GCP Java transforms test runs
    uses_java_expansion_service: collect Cross Language Java transforms test runs
    uses_python_expansion_service: collect Cross Language Python transforms test runs
    uses_io_java_expansion_service: collect Cross Language IO Java transform test runs (with Kafka bootstrap server)
    xlang_wrapper_generation: collect tests that validate Cross Language wrapper generation
    uses_transform_service: collect Cross Language test runs that uses the Transform Service
    xlang_sql_expansion_service: collect for Cross Language with SQL expansion service test runs
    it_postcommit: collect for post-commit integration test runs
    it_postcommit_sickbay: collect for post-commit sickbay integration test run
    it_validatesrunner: collect for ValidatesRunner integration test runs
    spannerio_it : collect for Spanner IO IT test runs.
    no_sickbay_streaming: run without sickbay-streaming
    no_sickbay_batch: run without sickbay-batch
    it_validatescontainer: collect for ValidatesContainer integration test runs
    it_dataflow_arm: collect for DataflowArm integration test runs
    examples_postcommit: collect for post-commit test examples runs
    sickbay_direct: run without sickbay-direct
    sickbay_spark: run without sickbay-spark
    sickbay_flink: run without sickbay-flink
    sickbay_prism: run without sickbay-prism
    sickbay_dataflow: run without sickbay-dataflow
    # Tests using this marker conflict with the xdist plugin in some way, such
    # as enabling save_main_session.
    no_xdist: run without pytest-xdist plugin
    # We run these tests with multiple major pyarrow versions (BEAM-11211)
    uses_pyarrow: tests that utilize pyarrow in some way.
    # ML tests
    uses_pytorch: tests that utilize pytorch in some way.
    uses_sklearn: tests that utilize scikit-learn in some way.
    uses_tensorflow: tests that utilize tensorflow in some way.
    uses_tft: tests that utilizes tensorflow transforms in some way.
    uses_xgboost: tests that utilize xgboost in some way.
    uses_onnx: tests that utilizes onnx in some way.
    uses_tf: tests that utilize tensorflow.
    uses_transformers: tests that utilize transformers in some way.
    vertex_ai_postcommit: vertex ai postcommits that need additional deps.
    uses_testcontainer: tests that use testcontainers.
    uses_mock_api: tests that uses the mock API cluster.
    uses_feast: tests that uses feast in some way
    gemini_postcommit: gemini postcommits that need additional deps.
    require_docker_in_docker: tests that require running Docker inside Docker (Docker-in-Docker), which is not supported on Beam’s self-hosted runners. Context: https://github.com/apache/beam/pull/35585
    uses_dill: tests that require dill pickle library.

# Default timeout intended for unit tests.
# If certain tests need a different value, please see the docs on how to
# specify: https://github.com/pytest-dev/pytest-timeout/
timeout = 600
