/** * Copyright (C) 2013 Red Hat, Inc. (jdcasey@commonjava.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.commonjava.maven.cartographer.ftest; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.commonjava.cartographer.Cartographer; import org.commonjava.cartographer.INTERNAL.graph.discover.SourceManagerImpl; import org.commonjava.cartographer.boot.Options; import org.commonjava.cartographer.client.ClientCartographer; import org.commonjava.propulsor.boot.BootOptions; import org.commonjava.propulsor.boot.BootStatus; import org.commonjava.propulsor.boot.Booter; import org.commonjava.util.jhttpc.HttpFactory; import org.commonjava.util.jhttpc.auth.MemoryPasswordManager; import org.commonjava.util.jhttpc.auth.PasswordManager; import org.commonjava.util.jhttpc.model.SiteConfig; import org.commonjava.util.jhttpc.model.SiteConfigBuilder; import org.commonjava.util.jhttpc.util.UrlUtils; import org.junit.Assert; import org.junit.rules.TemporaryFolder; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.util.ServiceLoader; import java.util.function.Consumer; import static org.commonjava.maven.cartographer.ftest.testutil.TestFileUtils.readResource; import static org.commonjava.maven.cartographer.ftest.testutil.TestFileUtils.writeConfigFile; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import org.jboss.weld.environment.se.WeldContainer; public class LocalTestDriver implements CartoTCKDriver { public static final String MAIN_CONF = "main.conf"; public static final String TEST_MAIN_CONF = "test-main.conf"; private Options options; private BootStatus bootStatus; private Booter booter; private PasswordManager passwordManager; private HttpFactory httpFactory; private SiteConfig siteConfig; private TemporaryFolder temp = new TemporaryFolder(); private Cartographer carto; private SourceManagerImpl sourceManager; private Consumer<File> configurator = defaultConfigWriter(); public Consumer<File> defaultConfigWriter() { return (configDir)->writeConfigFile( configDir, MAIN_CONF, readResource( TEST_MAIN_CONF ) ); } public void setConfigurator( Consumer<File> configurator ) { this.configurator = configurator; } @Override public Cartographer start( TemporaryFolder temp ) throws Exception { sourceManager = new SourceManagerImpl(); temp.create(); File homeDir = temp.newFolder( "carto-home" ); File configDir = new File( homeDir, "etc" ); configDir.mkdirs(); configurator.accept( configDir ); final ServiceLoader<BootOptions> loader = ServiceLoader.load( BootOptions.class ); final BootOptions opts = loader.iterator() .next(); options = (Options) opts; options.setPort( -1 ); options.setHomeDir( homeDir.getAbsolutePath() ); // Should not need this; the configurator should be smart enough to try ${carto.home}/etc/main.conf on its own. // options.setConfig( new File( configDir, MAIN_CONF ).getAbsolutePath() ); booter = new Booter(); bootStatus = booter.start( options ); if ( bootStatus == null ) { fail( "No boot status" ); } Throwable t = bootStatus.getError(); if ( t != null ) { throw new RuntimeException( "Failed to start Cartographer test server.", t ); } assertThat( bootStatus.isSuccess(), equalTo( true ) ); WeldContainer container = booter.getContainer(); sourceManager = container.instance().select( SourceManagerImpl.class ).get(); passwordManager = new MemoryPasswordManager(); siteConfig = new SiteConfigBuilder( "local-test", formatUrl().toString() ).withRequestTimeoutSeconds( 30 ).build(); httpFactory = new HttpFactory( passwordManager ); carto = new ClientCartographer( siteConfig, httpFactory ); return carto; } @Override public void stop() throws Exception { if ( booter != null && bootStatus != null && bootStatus.isSuccess() ) { booter.stop(); } temp.delete(); if ( carto != null ) { carto.close(); } } @Override public void createRepoAlias( String alias, String repoResource ) throws Exception { System.out.println( "Aliasing 'test' to: " + repoResource ); sourceManager.withAlias( "test", repoResource ); } public HttpFactory getHttpFactory() throws Exception { return httpFactory; } public SiteConfig getSiteConfig() throws Exception { return siteConfig; } public PasswordManager getPasswordManager() throws Exception { return passwordManager; } private String formatUrl( String... pathParts ) throws MalformedURLException { checkStarted(); return UrlUtils.buildUrl( String.format( "http://localhost:%d/api", getPort() ), pathParts ); } private void checkStarted() { if ( booter == null || bootStatus == null || !bootStatus.isSuccess() ) { throw new RuntimeException( "Cannot execute; Cartographer test server is not running." ); } } private int getPort() { checkStarted(); return options.getPort(); } }