/*******************************************************************************
* Copyright (c) 2015 IBM Corp.
*
* 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 com.ibm.ws.lars.upload.cli;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.junit.After;
import org.junit.Test;
import com.ibm.ws.repository.common.enums.ResourceType;
import com.ibm.ws.repository.common.enums.Visibility;
import com.ibm.ws.repository.connections.ProductDefinition;
import com.ibm.ws.repository.connections.RestRepositoryConnection;
import com.ibm.ws.repository.exceptions.RepositoryBackendException;
import com.ibm.ws.repository.exceptions.RepositoryBackendIOException;
import com.ibm.ws.repository.exceptions.RepositoryBackendRequestFailureException;
import com.ibm.ws.repository.exceptions.RepositoryBadDataException;
import com.ibm.ws.repository.exceptions.RepositoryResourceDeletionException;
import com.ibm.ws.repository.resources.RepositoryResource;
import com.ibm.ws.repository.resources.internal.EsaResourceImpl;
import com.ibm.ws.repository.transport.exceptions.RequestFailureException;
import mockit.Mock;
import mockit.MockUp;
public class DeleteTest {
private final ByteArrayOutputStream baos = new ByteArrayOutputStream();
private final PrintStream output = new PrintStream(baos);
private InputStream input = new ByteArrayInputStream(new byte[0]);
private Main tested = new Main(input, output);
@After
public void tearDown() {
output.close();
}
@Test
public void testNoUrl() {
// Should throw an exception and print out a help message
try {
tested.run(new String[] { "--delete" });
} catch (ClientException e) {
assertEquals("Unexpected exception message", Main.MISSING_URL, e.getMessage());
String outputString = baos.toString();
assertTrue("The expected help output wasn't produced, was:\n" + outputString, TestUtils.checkForHelpMessage(outputString));
return;
}
fail("The expected client exception was not thrown");
}
@Test
public void testDeleteNone() {
try {
tested.run(new String[] { "--delete", "--url=http://foobar" });
} catch (ClientException e) {
assertEquals("Unexpected exception message", Main.NO_IDS_FOR_DELETE, e.getMessage());
String outputString = baos.toString();
assertTrue("The expected help output wasn't produced, was:\n" + outputString, TestUtils.checkForHelpMessage(outputString));
return;
}
fail("The expected ClientException was not thrown");
}
@Test
public void testDeleteNonExistent() throws ClientException {
new MockUp<RestRepositoryConnection>() {
@Mock
public RepositoryResource getResource(String id) throws RepositoryBackendException, RepositoryBadDataException {
URL url = null;
try {
url = new URL("http://localhost");
} catch (MalformedURLException e1) {
// shouldn't happen
}
RequestFailureException e = new RequestFailureException(404, "not found", url, "not found");
throw new RepositoryBackendRequestFailureException(e, null);
}
};
tested.run(new String[] { "--delete", "--url=http://localhost:9080", "9999" });
String output = baos.toString();
assertTrue("Expected message was missing. Output was:\n" + output, output.contains("Asset 9999 not deleted"));
}
@Test
public void testDelete() throws ClientException {
new MockUp<RestRepositoryConnection>() {
@Mock
public RepositoryResource getResource(String id) throws RepositoryBackendException, RepositoryBadDataException {
RepositoryResource deleteable = new EsaResourceImpl(null) {
@Override
public void delete() throws RepositoryResourceDeletionException {
return;
}
};
return deleteable;
}
};
tested.run(new String[] { "--delete", "--url=http://localhost:9080", "9999" });
String output = baos.toString();
assertTrue("Expected message was missing. Output was:\n" + output, output.contains("Deleted asset 9999"));
}
@Test
public void testMixedDelete() throws ClientException {
new MockUp<RestRepositoryConnection>() {
@Mock
public RepositoryResource getResource(String id) throws RepositoryBackendException, RepositoryBadDataException {
if (id.equals("1234")) {
URL url = null;
try {
url = new URL("http://localhost");
} catch (MalformedURLException e1) {
// shouldn't happen
}
RequestFailureException e = new RequestFailureException(404, "not found", url, "not found");
throw new RepositoryBackendRequestFailureException(e, null);
}
RepositoryResource deleteable = new EsaResourceImpl(null) {
@Override
public void delete() throws RepositoryResourceDeletionException {
return;
}
};
return deleteable;
}
};
tested.run(new String[] { "--delete", "--url=http://localhost:9080", "9999", "1234", "abcdef" });
String output = baos.toString();
assertTrue("Expected message was missing. Output was:\n" + output, output.contains("Deleted asset 9999"));
assertTrue("Expected message was missing. Output was:\n" + output, output.contains("Asset 1234 not deleted"));
assertTrue("Expected message was missing. Output was:\n" + output, output.contains("Deleted asset abcdef"));
}
@Test
public void testDeleteNetworkErrorOnRetrieve() {
new MockUp<RestRepositoryConnection>() {
@Mock
public RepositoryResource getResource(String id) throws RepositoryBackendException, RepositoryBadDataException {
throw new RepositoryBackendIOException("The network isn't there!", null);
}
};
try {
tested.run(new String[] { "--delete", "--noPrompts", "--url=http://localhost:9080", "9999" });
} catch (ClientException e) {
String output = baos.toString();
assertTrue("Expected message was missing. Output was:\n" + output, output.contains("Asset 9999 not deleted"));
assertTrue("Expected message was missing. Output was:\n" + output, output.contains(Main.CONNECTION_PROBLEM));
assertTrue("Unexpected message in output. Output was:\n" + output, !output.contains("Deleted asset 9999"));
return;
}
fail("The expected ClientException wasn't thrown");
}
@Test
public void testDeleteServerErrorOnRetrieve() {
new MockUp<RestRepositoryConnection>() {
@Mock
public RepositoryResource getResource(String id) throws RepositoryBackendException, RepositoryBadDataException {
URL url = null;
try {
url = new URL("http://localhost");
} catch (MalformedURLException e1) {
// shouldn't happen
}
RequestFailureException e = new RequestFailureException(500, "Internal Server error", url, "Internal Server error");
throw new RepositoryBackendRequestFailureException(e, null);
}
};
try {
tested.run(new String[] { "--delete", "--url=http://localhost:9080", "9999" });
} catch (ClientException e) {
String output = baos.toString();
assertTrue("Expected message was missing. Output was:\n" + output, output.contains("Asset 9999 not deleted"));
assertTrue("Expected message was missing. Output was:\n" + output, output.contains(Main.SERVER_ERROR));
assertTrue("Unexpected message in output. Output was:\n" + output, !output.contains("Deleted asset 9999"));
return;
}
fail("The expected ClientException wasn't thrown");
}
@Test
public void testDeleteServerErrorOnDelete() {
new MockUp<RestRepositoryConnection>() {
@Mock
public RepositoryResource getResource(String id) throws RepositoryBackendException, RepositoryBadDataException {
RepositoryResource deleteable = new EsaResourceImpl(null) {
@Override
public void delete() throws RepositoryResourceDeletionException {
throw new RepositoryResourceDeletionException("The network is gone!", getId());
}
};
return deleteable;
}
};
try {
tested.run(new String[] { "--delete", "--noPrompts", "--url=http://localhost:9080", "9999" });
} catch (ClientException e) {
String output = baos.toString();
assertTrue("Expected message was missing. Output was:\n" + output, !output.contains("Deleted asset 9999"));
assertTrue("Expected message was missing. Output was:\n" + output, output.contains("Asset 9999 not deleted"));
return;
}
fail("The expected ClientException wasn't thrown");
}
@Test
public void testFindAndDelete() throws ClientException {
new MockUp<RestRepositoryConnection>() {
@Mock
public Collection<? extends RepositoryResource> findResources(String searchTerm, Collection<ProductDefinition> productDefinitions,
Collection<ResourceType> types,
Visibility visibility) throws RepositoryBackendException {
RepositoryResource deleteable = new EsaResourceImpl(null) {
@Override
public void delete() throws RepositoryResourceDeletionException {
return;
}
};
List<RepositoryResource> rs = Arrays.asList(new RepositoryResource[] { deleteable });
return rs;
}
@Mock
public RepositoryResource getResource(String id) throws RepositoryBackendException, RepositoryBadDataException {
RepositoryResource deleteable = new EsaResourceImpl(null) {
@Override
public void delete() throws RepositoryResourceDeletionException {
DeleteTest.this.deleteCalled = true;
return;
}
};
return deleteable;
}
};
DeleteTest.this.deleteCalled = false;
tested.run(new String[] { "--findAndDelete", "--noPrompts", "--url=http://localhost:9080", "admin" });
String output = baos.toString();
assertTrue("Expected message was missing. Output was:\n" + output, output.contains("Deleted asset null"));
assertTrue("Delete not called", deleteCalled);
}
@Test
public void testFindAndDeletePromptN() throws ClientException {
new MockUp<RestRepositoryConnection>() {
@Mock
public Collection<? extends RepositoryResource> findResources(String searchTerm, Collection<ProductDefinition> productDefinitions,
Collection<ResourceType> types,
Visibility visibility) throws RepositoryBackendException {
RepositoryResource deleteable = new EsaResourceImpl(null) {
@Override
public void delete() throws RepositoryResourceDeletionException {
DeleteTest.this.deleteCalled = true;
return;
}
};
List<RepositoryResource> rs = Arrays.asList(new RepositoryResource[] { deleteable });
return rs;
}
@Mock
public RepositoryResource getResource(String id) throws RepositoryBackendException, RepositoryBadDataException {
RepositoryResource deleteable = new EsaResourceImpl(null) {
@Override
public void delete() throws RepositoryResourceDeletionException {
DeleteTest.this.deleteCalled = true;
return;
}
};
return deleteable;
}
};
String sysIn = "n" + System.lineSeparator();
input = new ByteArrayInputStream(sysIn.getBytes());
tested = new Main(input, output);
DeleteTest.this.deleteCalled = false;
tested.run(new String[] { "--findAndDelete", "--url=http://localhost:9080", "admin" });
String output = baos.toString();
assertTrue("Expected message was missing. Output was:\n" + output, output.contains("Delete asset null null (y/N)?"));
assertFalse("Delete called", deleteCalled);
}
Boolean deleteCalled = false;
@Test
public void testFindAndDeletePromptY() throws ClientException {
deleteCalled = false;
new MockUp<RestRepositoryConnection>() {
@Mock
public Collection<? extends RepositoryResource> findResources(String searchTerm, Collection<ProductDefinition> productDefinitions,
Collection<ResourceType> types,
Visibility visibility) throws RepositoryBackendException {
RepositoryResource deleteable = new EsaResourceImpl(null) {
@Override
public void delete() throws RepositoryResourceDeletionException {
DeleteTest.this.deleteCalled = true;
return;
}
};
List<RepositoryResource> rs = Arrays.asList(new RepositoryResource[] { deleteable });
return rs;
}
@Mock
public RepositoryResource getResource(String id) throws RepositoryBackendException, RepositoryBadDataException {
RepositoryResource deleteable = new EsaResourceImpl(null) {
@Override
public void delete() throws RepositoryResourceDeletionException {
DeleteTest.this.deleteCalled = true;
return;
}
};
return deleteable;
}
};
String sysIn = "y" + System.lineSeparator();
input = new ByteArrayInputStream(sysIn.getBytes());
tested = new Main(input, output);
tested.run(new String[] { "--findAndDelete", "--url=http://localhost:9080", "admin" });
String output = baos.toString();
assertTrue("Expected message was missing. Output was:\n" + output, output.contains("Delete asset null null (y/N)?"));
assertTrue("Delete not called", deleteCalled);
}
@Test
public void testFindAndDeletePromptNull() throws ClientException {
new MockUp<RestRepositoryConnection>() {
@Mock
public Collection<? extends RepositoryResource> findResources(String searchTerm, Collection<ProductDefinition> productDefinitions,
Collection<ResourceType> types,
Visibility visibility) throws RepositoryBackendException {
RepositoryResource deleteable = new EsaResourceImpl(null) {
@Override
public void delete() throws RepositoryResourceDeletionException {
DeleteTest.this.deleteCalled = true;
return;
}
};
List<RepositoryResource> rs = Arrays.asList(new RepositoryResource[] { deleteable });
return rs;
}
@Mock
public RepositoryResource getResource(String id) throws RepositoryBackendException, RepositoryBadDataException {
RepositoryResource deleteable = new EsaResourceImpl(null) {
@Override
public void delete() throws RepositoryResourceDeletionException {
DeleteTest.this.deleteCalled = true;
return;
}
};
return deleteable;
}
};
deleteCalled = false;
String sysIn = System.lineSeparator(); // No input, just hit enter
input = new ByteArrayInputStream(sysIn.getBytes());
tested = new Main(input, output);
tested.run(new String[] { "--findAndDelete", "--url=http://localhost:9080", "admin" });
String output = baos.toString();
assertTrue("Expected message was missing. Output was:\n" + output, output.contains("Delete asset null null (y/N)?"));
assertFalse("Delete called", deleteCalled);
}
@Test
public void testFindAndDeletePromptRandom() throws ClientException {
new MockUp<RestRepositoryConnection>() {
@Mock
public Collection<? extends RepositoryResource> findResources(String searchTerm, Collection<ProductDefinition> productDefinitions,
Collection<ResourceType> types,
Visibility visibility) throws RepositoryBackendException {
RepositoryResource deleteable = new EsaResourceImpl(null) {
@Override
public void delete() throws RepositoryResourceDeletionException {
DeleteTest.this.deleteCalled = true;
return;
}
};
List<RepositoryResource> rs = Arrays.asList(new RepositoryResource[] { deleteable });
return rs;
}
@Mock
public RepositoryResource getResource(String id) throws RepositoryBackendException, RepositoryBadDataException {
RepositoryResource deleteable = new EsaResourceImpl(null) {
@Override
public void delete() throws RepositoryResourceDeletionException {
DeleteTest.this.deleteCalled = true;
return;
}
};
return deleteable;
}
};
deleteCalled = false;
String sysIn = "xyz" + System.lineSeparator();
input = new ByteArrayInputStream(sysIn.getBytes());
tested = new Main(input, output);
tested.run(new String[] { "--findAndDelete", "--url=http://localhost:9080", "admin" });
String output = baos.toString();
assertTrue("Expected message was missing. Output was:\n" + output, output.contains("Delete asset null null (y/N)?"));
assertFalse("Delete called", deleteCalled);
}
}