blob: 55f50d24663ca8ca684d330caebeca692ae7576f [file] [log] [blame]
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~ Licensed to the Apache Software Foundation (ASF) under one
~ or more contributor license agreements. See the NOTICE file
~ distributed with this work for additional information
~ regarding copyright ownership. The ASF licenses this file
~ to you 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.apache.sling.cli.impl.release;
import java.io.IOException;
import org.apache.http.StatusLine;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.sling.cli.impl.Command;
import org.apache.sling.cli.impl.ExecutionMode;
import org.apache.sling.cli.impl.InputOption;
import org.apache.sling.cli.impl.UserInput;
import org.apache.sling.cli.impl.http.HttpClientFactory;
import org.apache.sling.cli.impl.nexus.StagingRepository;
import org.apache.sling.cli.impl.nexus.RepositoryService;
import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
@RunWith(PowerMockRunner.class)
@PowerMockIgnore({
// https://github.com/powermock/powermock/issues/864
"com.sun.org.apache.xerces.*",
"javax.xml.*",
"org.w3c.dom.*"
})
public class UpdateReporterCommandTest {
private CloseableHttpClient client;
@Rule
public final OsgiContext osgiContext = new OsgiContext();
@Before
public void before() throws IOException {
RepositoryService repositoryFinder = mock(RepositoryService.class);
StagingRepository stagingRepository = mock(StagingRepository.class);
when(stagingRepository.getDescription()).thenReturn("Apache Sling CLI 1, Apache Sling CLI 2");
when(repositoryFinder.find(42)).thenReturn(stagingRepository);
HttpClientFactory httpClientFactory = mock(HttpClientFactory.class);
client = mock(CloseableHttpClient.class);
when(httpClientFactory.newClient()).thenReturn(client);
osgiContext.registerService(repositoryFinder);
osgiContext.registerService(httpClientFactory);
}
@Test
@PrepareForTest({LoggerFactory.class})
public void testDryRun() {
mockStatic(LoggerFactory.class);
Logger logger = mock(Logger.class);
when(LoggerFactory.getLogger(UpdateReporterCommand.class)).thenReturn(logger);
UpdateReporterCommand updateReporterCommand = spy(new UpdateReporterCommand());
Whitebox.setInternalState(updateReporterCommand, "repositoryId", 42);
ReusableCLIOptions reusableCLIOptions = mock(ReusableCLIOptions.class);
Whitebox.setInternalState(reusableCLIOptions, "executionMode", ExecutionMode.DRY_RUN);
Whitebox.setInternalState(updateReporterCommand, "reusableCLIOptions", reusableCLIOptions);
osgiContext.registerInjectActivateService(updateReporterCommand);
Command updateReporter = osgiContext.getService(Command.class);
assertTrue("Expected to retrieve the UpdateReporterCommand from the mocked OSGi environment.",
updateReporter instanceof UpdateReporterCommand);
updateReporter.run();
verify(logger).info("The following {} would be added to the Apache Reporter System:", "releases");
verify(logger).info(" - {}", "Apache Sling CLI 1");
verify(logger).info(" - {}", "Apache Sling CLI 2");
verifyNoMoreInteractions(logger);
}
@Test
@PrepareForTest({UserInput.class})
public void testInteractive() throws Exception {
UpdateReporterCommand updateReporterCommand = spy(new UpdateReporterCommand());
Whitebox.setInternalState(updateReporterCommand, "repositoryId", 42);
ReusableCLIOptions reusableCLIOptions = mock(ReusableCLIOptions.class);
Whitebox.setInternalState(reusableCLIOptions, "executionMode", ExecutionMode.INTERACTIVE);
Whitebox.setInternalState(updateReporterCommand, "reusableCLIOptions", reusableCLIOptions);
osgiContext.registerInjectActivateService(updateReporterCommand);
Command updateReporter = osgiContext.getService(Command.class);
assertTrue("Expected to retrieve the UpdateReporterCommand from the mocked OSGi environment.",
updateReporter instanceof UpdateReporterCommand);
CloseableHttpResponse response = mock(CloseableHttpResponse.class);
StatusLine statusLine = mock(StatusLine.class);
mockStatic(UserInput.class);
String question =
"Should the following releases be added to the Apache Reporter System?\n - Apache Sling CLI 1\n - Apache Sling CLI 2\n";
when(UserInput.yesNo(question, InputOption.YES)).thenReturn(InputOption.YES);
when(response.getStatusLine()).thenReturn(statusLine);
when(statusLine.getStatusCode()).thenReturn(200);
when(client.execute(any())).thenReturn(response);
updateReporter.run();
verify(client, times(2)).execute(any());
}
@Test
public void testAuto() throws Exception {
UpdateReporterCommand updateReporterCommand = spy(new UpdateReporterCommand());
Whitebox.setInternalState(updateReporterCommand, "repositoryId", 42);
ReusableCLIOptions reusableCLIOptions = mock(ReusableCLIOptions.class);
Whitebox.setInternalState(reusableCLIOptions, "executionMode", ExecutionMode.AUTO);
Whitebox.setInternalState(updateReporterCommand, "reusableCLIOptions", reusableCLIOptions);
osgiContext.registerInjectActivateService(updateReporterCommand);
Command updateReporter = osgiContext.getService(Command.class);
assertTrue("Expected to retrieve the UpdateReporterCommand from the mocked OSGi environment.",
updateReporter instanceof UpdateReporterCommand);
CloseableHttpResponse response = mock(CloseableHttpResponse.class);
StatusLine statusLine = mock(StatusLine.class);
when(response.getStatusLine()).thenReturn(statusLine);
when(statusLine.getStatusCode()).thenReturn(200);
when(client.execute(any())).thenReturn(response);
updateReporter.run();
verify(client, times(2)).execute(any());
}
}