code: def test_spark_udf_signature_validator_udf_invalid_base_data_source(
      data_source_name, data_source_unique_id, error_pattern
  ):
      class TestInValidCustomDataSource(BaseDataSource):
          data_source_name = None
          data_source_unique_id = None
  
          def read_data(self, spark, params) -> DataFrame:
              return None
  
      test_data_source = TestInValidCustomDataSource()
      test_data_source.data_source_name = data_source_name
      test_data_source.data_source_unique_id = data_source_unique_id
  
      fp_config = tdh.create_fp_config(inputs=[test_data_source])
  
      def udf(input_data_source, params, spark):
          return None
  
      with pytest.raises(ValueError, match=error_pattern):
          BaseDataSourceValidator().validate(udf, fp_config)
  
file_path: sagemaker-python-sdk/tests/unit/sagemaker/feature_store/feature_processor/test_validation.py
imports: from __future__ import absolute_import
  from typing import Callable
  from pyspark.sql import DataFrame
  import pytest
  import test_data_helpers
  import string
  import random
  from mock import Mock
  from sagemaker.feature_store.feature_processor._validation import SparkUDFSignatureValidator, Validator, ValidatorChain, BaseDataSourceValidator
  from sagemaker.feature_store.feature_processor._data_source import BaseDataSource
label_desc: Use image node_id 7 for calling a global function with example usage: test_spark_udf_signature_validator_udf_invalid_base_data_source(data_source_name, data_source_unique_id, error_pattern) and returns: None, None