// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.container.di; import com.google.inject.Guice; import com.yahoo.component.ComponentSpecification; import com.yahoo.config.FileReference; import com.yahoo.container.bundle.BundleInstantiationSpecification; import com.yahoo.container.di.ContainerTest.ComponentTakingConfig; import com.yahoo.container.di.componentgraph.core.ComponentGraph; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.io.TempDir; import org.osgi.framework.Bundle; import java.io.File; import java.util.Collection; import java.util.Set; import static java.util.Collections.emptySet; /** * @author Tony Vaagenes * @author gjoranv * @author ollivir */ public class ContainerTestBase { private ComponentGraph componentGraph; protected DirConfigSource dirConfigSource = null; @TempDir File tmpDir; @BeforeEach public void setup() { dirConfigSource = new DirConfigSource(tmpDir, "ContainerTest-"); } @AfterEach public void cleanup() { dirConfigSource.cleanup(); } @BeforeEach public void createGraph() { componentGraph = new ComponentGraph(0); } public void complete() { try { Container container = new Container(new CloudSubscriberFactory(dirConfigSource.configSource()), dirConfigSource.configId(), new ContainerTest.TestDeconstructor(), new Osgi() { @SuppressWarnings("unchecked") @Override public Class resolveClass(BundleInstantiationSpecification spec) { try { return (Class) Class.forName(spec.classId.getName()); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } @Override public Set useApplicationBundles(Collection bundles) { return emptySet(); } @Override public Bundle getBundle(ComponentSpecification spec) { throw new UnsupportedOperationException("getBundle not supported."); } }); Container.ComponentGraphResult result = container.waitForNextGraphGeneration(this.componentGraph, Guice.createInjector(), true); result.oldComponentsCleanupTask().run(); this.componentGraph = result.newGraph(); } catch (Exception e) { throw new RuntimeException(e); } } public T getInstance(Class componentClass) { return componentGraph.getInstance(componentClass); } protected void writeBootstrapConfigs(ComponentEntry... componentEntries) { dirConfigSource.writeConfig("platform-bundles", ""); dirConfigSource.writeConfig("application-bundles", ""); StringBuilder components = new StringBuilder(); for (int i = 0; i < componentEntries.length; i++) { components.append(componentEntries[i].asConfig(i)); components.append('\n'); } dirConfigSource.writeConfig("components", String.format("components[%s]\n%s", componentEntries.length, components)); } protected void writeBootstrapConfigs(String componentId, Class classId) { writeBootstrapConfigs(new ComponentEntry(componentId, classId)); } protected void writeBootstrapConfigs(String componentId) { writeBootstrapConfigs(componentId, ComponentTakingConfig.class); } protected void writeBootstrapConfigs() { writeBootstrapConfigs(ComponentTakingConfig.class.getName(), ComponentTakingConfig.class); } protected class ComponentEntry { private final String componentId; private final Class classId; ComponentEntry(String componentId, Class classId) { this.componentId = componentId; this.classId = classId; } String asConfig(int position) { return "\n" + // "components[" + position + "].id \"" + componentId + "\"\n" + // "components[" + position + "].classId \"" + classId.getName() + "\"\n" + // "components[" + position + "].configId \"" + dirConfigSource.configId() + "\"\n" + // ""; } } }