diff options
Diffstat (limited to 'config-model/src/main/java/com/yahoo/config/model/test/MockRoot.java')
-rw-r--r-- | config-model/src/main/java/com/yahoo/config/model/test/MockRoot.java | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/test/MockRoot.java b/config-model/src/main/java/com/yahoo/config/model/test/MockRoot.java new file mode 100644 index 00000000000..fa84cf1c7eb --- /dev/null +++ b/config-model/src/main/java/com/yahoo/config/model/test/MockRoot.java @@ -0,0 +1,169 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.config.model.test; + +import com.yahoo.config.ConfigInstance; +import com.yahoo.config.model.ConfigModelRepo; +import com.yahoo.config.application.api.ApplicationPackage; +import com.yahoo.config.model.application.provider.BaseDeployLogger; +import com.yahoo.config.application.api.DeployLogger; +import com.yahoo.config.model.deploy.DeployState; +import com.yahoo.config.model.builder.xml.XmlHelper; +import com.yahoo.config.model.producer.AbstractConfigProducer; +import com.yahoo.config.model.producer.AbstractConfigProducerRoot; +import com.yahoo.text.XML; +import com.yahoo.vespa.model.ConfigProducer; +import com.yahoo.vespa.model.HostSystem; +import com.yahoo.vespa.model.admin.Admin; +import com.yahoo.vespa.model.builder.xml.dom.DomAdminV2Builder; +import com.yahoo.vespa.model.filedistribution.FileDistributionConfigProducer; +import com.yahoo.vespa.model.filedistribution.FileDistributor; +import org.w3c.dom.Document; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import java.io.IOException; +import java.io.StringReader; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Set; + + +/** + * Use for testing. Use as parent for the config producer(s) you want to test, to test + * only a subtree of the producers. + * + * @author gjoranv + */ +public class MockRoot extends AbstractConfigProducerRoot { + private static final long serialVersionUID = 1L; + public static final String MOCKHOST = "mockhost"; + + private HostSystem hostSystem; + + private final DeployState deployState; + private FileDistributor fileDistributor; + private Admin admin; + + public MockRoot() { + this(""); + } + + public MockRoot(String rootConfigId) { + this(rootConfigId, new MockApplicationPackage.Builder().build()); + } + + public MockRoot(String rootConfigId, ApplicationPackage applicationPackage) { + this(rootConfigId, new DeployState.Builder().applicationPackage(applicationPackage).build()); + } + + public MockRoot(String rootConfigId, DeployState deployState) { + super(rootConfigId); + hostSystem = new HostSystem(this, "hostsystem", deployState.getProvisioner()); + this.deployState = deployState; + fileDistributor = new FileDistributor(deployState.getFileRegistry()); + } + + public FileDistributionConfigProducer getFileDistributionConfigProducer() { + return null; + } + + @Override + public ConfigModelRepo configModelRepo() { + return new ConfigModelRepo(); + } + + public Set<String> getConfigIds() { + return Collections.unmodifiableSet(id2producer.keySet()); + } + + @Override + public ConfigInstance.Builder getConfig(ConfigInstance.Builder builder, String configId) { + ConfigProducer cp = id2producer.get(configId); + if (cp == null) return null; + + cp.cascadeConfig(builder); + cp.addUserConfig(builder); + return builder; + } + + @SuppressWarnings("unchecked") + public <T extends ConfigInstance> T getConfig(Class<T> configClass, String configId) { + try { + ConfigInstance.Builder builder = getConfig(getBuilder(configClass).newInstance(), configId); + return configClass.getConstructor(builder.getClass()).newInstance(builder); + } catch (InstantiationException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + public ConfigProducer getProducer(String configId) { + return id2producer.get(configId); + } + + @SuppressWarnings("unchecked") + public static <T extends ConfigInstance> Class<? extends ConfigInstance.Builder> getBuilder(Class<T> configClass) { + for (Class<?> memberClass : configClass.getClasses()) { + if (memberClass.getSimpleName().equals("Builder")) + return (Class<? extends ConfigInstance.Builder>) memberClass; + } + throw new RuntimeException("Missing builder"); + } + + @Override + public DeployState getDeployState() { + return deployState; + } + + public FileDistributor getFileDistributor() { + return fileDistributor; + } + + public HostSystem getHostSystem() { + return hostSystem; + } + + public void addDescendant(String configId, AbstractConfigProducer descendant) { + if (id2producer.containsKey(configId)) { + throw new RuntimeException + ("Config ID '" + configId + "' cannot be reserved by an instance of class '" + + descendant.getClass().getName() + "' since it is already used by an instance of class '" + + id2producer.get(configId).getClass().getName() + "'"); + } + id2producer.put(configId, descendant); + } + + @Override + public void addChild(AbstractConfigProducer abstractConfigProducer) { + super.addChild(abstractConfigProducer); + } + + public final void setAdmin(String xml) { + String servicesXml = + "<?xml version='1.0' encoding='utf-8' ?>" + + "<services>" + xml + "</services>"; + + try { + Document doc = XmlHelper.getDocumentBuilder().parse(new InputSource(new StringReader(servicesXml))); + setAdmin(new DomAdminV2Builder(deployState.getFileRegistry(), false, new ArrayList<>()). + build(this, XML.getChildren(doc.getDocumentElement(), "admin").get(0))); + } catch (SAXException | IOException e) { + throw new RuntimeException(e); + } + } + + public final void setAdmin(Admin admin) { + this.admin = admin; + } + + @Override + public final Admin getAdmin() { + return admin; + } + + @Override + public DeployLogger deployLogger() { + return new BaseDeployLogger(); + } + +} |