code: def testCalculateSplitsFingerprint(self):
      split1 = os.path.join(self._input_base_path, "split1", "data")
      io_utils.write_string_file(split1, "testing")
      os.utime(split1, (0, 1))
      split2 = os.path.join(self._input_base_path, "split2", "data")
      io_utils.write_string_file(split2, "testing2")
      os.utime(split2, (0, 3))
  
      splits = [
          example_gen_pb2.Input.Split(name="s1", pattern="split1/*"),
          example_gen_pb2.Input.Split(name="s2", pattern="split2/*"),
      ]
      (
          fingerprint,
          span,
          version,
      ) = utils.calculate_splits_fingerprint_span_and_version(
          self._input_base_path, splits
      )
      self.assertEqual(
          fingerprint,
          "split:s1,num_files:1,total_bytes:7,xor_checksum:1,sum_checksum:1\n"
          "split:s2,num_files:1,total_bytes:8,xor_checksum:3,sum_checksum:3",
      )
      self.assertEqual(span, 0)
      self.assertIsNone(version)
  
imports: import os
  import re
  import tensorflow
  from tfx.components.example_gen import utils
  from tfx.dsl.io import fileio
  from tfx.orchestration import data_types
  from tfx.proto import example_gen_pb2
  from tfx.proto import range_config_pb2
  from tfx.utils import io_utils
  from tfx.utils import json_utils
label_desc: Use image node_id 8 for calling the UtilsTest obj's underlying member method code with example usage: obj.testCalculateSplitsFingerprint() without return types