package pl.touk.sputnik.processor.sonar;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.sonar.runner.api.EmbeddedRunner;
import pl.touk.sputnik.configuration.Configuration;
import pl.touk.sputnik.configuration.ConfigurationBuilder;
import com.google.common.collect.ImmutableList;
@RunWith(MockitoJUnitRunner.class)
public class SonarRunnerTest {
private static final String PROPERTY_1 = "sonar-property1";
private static final String PROPERTY_2 = "sonar-property2";
private Configuration config;
@Mock
private EmbeddedRunner sonarRunner;
@Before
public void setUp() throws FileNotFoundException {
config = ConfigurationBuilder.initFromResource("test-sonar.properties");
}
@After
public void tearDown() {
new File(PROPERTY_1).delete();
new File(PROPERTY_2).delete();
}
private void writeValidConfigFiles() throws IOException {
FileUtils.writeStringToFile(new File(PROPERTY_1), "sonar.foo=bar");
FileUtils.writeStringToFile(new File(PROPERTY_2), "sonar.bar=bazz");
}
@Test
public void shouldRun() throws IOException {
writeValidConfigFiles();
List<String> files = ImmutableList.of("file");
SonarRunner runner = new SonarRunner(files, sonarRunner, config);
runner.run();
verify(sonarRunner, times(1)).addGlobalProperties(any(Properties.class));
verify(sonarRunner).execute();
}
@Test
public void shouldLoadBaseProperties() throws IOException{
writeValidConfigFiles();
List<String> files = ImmutableList.of("file");
SonarRunner runner = new SonarRunner(files, sonarRunner, config);
Properties properties = runner.loadBaseProperties();
assertThat(properties.getProperty("sonar.foo")).isEqualTo("bar");
assertThat(properties.getProperty("sonar.bar")).isEqualTo("bazz");
}
@Test
public void shouldSetBaseSonarConfig() throws IOException{
writeValidConfigFiles();
List<String> files = ImmutableList.of("first", "second");
SonarRunner runner = new SonarRunner(files, sonarRunner, config);
Properties props = new Properties();
runner.setAdditionalProperties(props);
assertThat(props.getProperty(SonarProperties.INCLUDE_FILES)).contains("first");
assertThat(props.getProperty(SonarProperties.INCLUDE_FILES)).contains("second");
assertThat(StringUtils.split(props.getProperty(SonarProperties.INCLUDE_FILES), ',')).hasSize(2);
assertThat(props.getProperty(SonarProperties.ANALISYS_MODE)).isEqualTo("incremental");
assertThat(props.getProperty(SonarProperties.SCM_ENABLED)).isEqualTo("false");
assertThat(props.getProperty(SonarProperties.SCM_STAT_ENABLED)).isEqualTo("false");
assertThat(props.getProperty(SonarProperties.ISSUEASSIGN_PLUGIN)).isEqualTo("false");
assertThat(props.getProperty(SonarProperties.EXPORT_PATH)).isEqualTo(SonarRunner.OUTPUT_FILE);
assertThat(props.getProperty(SonarProperties.WORKDIR)).isEqualTo(SonarRunner.OUTPUT_DIR);
assertThat(props.getProperty(SonarProperties.PROJECT_BASEDIR)).isEqualTo(".");
}
@Test(expected=IOException.class)
public void shouldThrowWhenNoSonarFiles() throws IOException {
List<String> files = ImmutableList.of("first", "second");
SonarRunner runner = new SonarRunner(files, sonarRunner, config);
runner.loadBaseProperties();
}
}