code: def test_tags(self):
      self.spark.clearTags()
      self.spark.addTag("a")
      self.assertEqual(self.spark.getTags(), {"a"})
      self.spark.addTag("b")
      self.spark.removeTag("a")
      self.assertEqual(self.spark.getTags(), {"b"})
      self.spark.addTag("c")
      self.spark.clearTags()
      self.assertEqual(self.spark.getTags(), set())
      self.spark.clearTags()
  
imports: import threading
  import time
  import unittest
  from typing import Optional
  from pyspark import InheritableThread, inheritable_thread_target
  from pyspark.sql.connect.client import ChannelBuilder
  from pyspark.sql.connect.session import SparkSession
  from pyspark.testing.connectutils import should_test_connect
label_desc: Use image node_id 1 for calling the JobCancellationTests obj's underlying member method code with example usage: obj.test_tags() without return types