public GoConfigHolder loadConfigHolder(final String content, Callback callback) throws Exception {
        CruiseConfig configForEdit;
        CruiseConfig config;
        LOGGER.debug("[Config Save] Loading config holder");
        configForEdit = deserializeConfig(content);
        if (callback != null) callback.call(configForEdit);
        config = preprocessAndValidate(configForEdit);

        return new GoConfigHolder(config, configForEdit);
    }
@Test
    void shouldAllowOnlyOneTimerOnAPipeline() {
        String content = configWithPipeline(
                """
                        <pipeline name='pipeline1'>
                            <timer>1 1 1 * * ? *</timer>
                            <timer>2 2 2 * * ? *</timer>
                            <materials>
                              <svn url ='svnurl'/>
                            </materials>
                          <stage name='mingle'>
                            <jobs>
                              <job name='cardlist'><tasks><exec command='echo'><runif status='passed' /></exec></tasks></job>
                            </jobs>
                          </stage>
                        </pipeline>""", CONFIG_SCHEMA_VERSION);

        assertThatThrownBy(() -> xmlLoader.loadConfigHolder(content))
            .as("XSD should not allow duplicate timer in pipeline")
            .hasMessageContaining("Invalid content was found starting with element 'timer'.");
    }