@ParameterizedTest
    @ValueSource(strings = {"zk", "kraft"})
    public void testTopicWithCollidingCharDeletionAndCreateAgain(String quorum) throws Exception {
        // create the topic with colliding chars
        String topicWithCollidingChar = "test.a";
        TestUtils.createTopicWithAdmin(adminClient, topicWithCollidingChar, scalaBrokers, scalaControllers, defaultNumPartitions, defaultReplicationFactor,
                scala.collection.immutable.Map$.MODULE$.empty(), new Properties()
        );
        // delete the topic
        TopicCommand.TopicCommandOptions deleteOpts = buildTopicCommandOptionsWithBootstrap("--delete", "--topic", topicWithCollidingChar);

        if (!isKRaftTest()) {
            String deletePath = kafka.zk.DeleteTopicsTopicZNode.path(topicWithCollidingChar);
            assertFalse(zkClient().pathExists(deletePath), "Delete path for topic shouldn't exist before deletion.");
        }
        topicService.deleteTopic(deleteOpts);
        TestUtils.verifyTopicDeletion(zkClientOrNull(), topicWithCollidingChar, 1, brokers());
        assertDoesNotThrow(() -> TestUtils.createTopicWithAdmin(adminClient, topicWithCollidingChar, scalaBrokers, scalaControllers, defaultNumPartitions, defaultReplicationFactor,
                scala.collection.immutable.Map$.MODULE$.empty(), new Properties()
        ), "Should be able to create a topic with colliding chars after deletion.");
    }
Implementations must override this method to return a set of KafkaConfigs. This method will be invoked for every
test and should not reuse previous configurations unless they select their ports randomly when servers are started.

Note the replica fetch max bytes is set to `1` in order to throttle the rate of replication for test
`testDescribeUnderReplicatedPartitionsWhenReassignmentIsInProgress`.
tools/src/test/java/org/apache/kafka/tools/TopicCommandIntegrationTest.java