/* * Copyright Siemens AG, 2013-2015. Part of the SW360 Portal Project. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.eclipse.sw360.fossology.ssh; import org.eclipse.sw360.datahandler.thrift.attachments.AttachmentContent; import org.eclipse.sw360.datahandler.thrift.components.FossologyStatus; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import java.io.InputStream; import java.io.OutputStream; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.sameInstance; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class FossologyUploaderTest { @Mock FossologySshConnector sshConnector; FossologyUploader fossologyUploader; @Before public void setUp() { fossologyUploader = new FossologyUploader(sshConnector); } @After public void tearDown() { verifyNoMoreInteractions(sshConnector); } @Test public void testUploadToFossology() throws Exception { AttachmentContent attachment = mock(AttachmentContent.class); when(attachment.getId()).thenReturn("id"); when(attachment.getFilename()).thenReturn("fileName"); String clearingTeam = "cl"; final InputStream inputStream = mock(InputStream.class); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { final Object[] arguments = invocation.getArguments(); String command = (String) arguments[0]; InputStream input = (InputStream) arguments[1]; OutputStream outputStream = (OutputStream) arguments[2]; assertThat(input, sameInstance(inputStream)); assertThat(command, is("./uploadFromSW360 -i 'id' -g 'cl' -f 'fileName'")); outputStream.write("uploadId=60".getBytes()); return 0; } }).when(sshConnector).runInFossologyViaSsh(anyString(), eq(inputStream), any(OutputStream.class)); final long uploadId = fossologyUploader.uploadToFossology(inputStream, attachment, clearingTeam); verify(sshConnector).runInFossologyViaSsh(anyString(), eq(inputStream), any(OutputStream.class)); assertThat(uploadId, is((long) 60)); } @Test public void testUploadToFossologyWithNonIntReturn() throws Exception { AttachmentContent attachment = mock(AttachmentContent.class); when(attachment.getId()).thenReturn("id"); when(attachment.getFilename()).thenReturn("fileName"); String clearingTeam = "cl"; final InputStream inputStream = mock(InputStream.class); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { OutputStream outputStream = (OutputStream) invocation.getArguments()[2]; outputStream.write("uploadId=60000000000000000".getBytes()); return 0; } }).when(sshConnector).runInFossologyViaSsh(anyString(), eq(inputStream), any(OutputStream.class)); final long uploadId = fossologyUploader.uploadToFossology(inputStream, attachment, clearingTeam); verify(sshConnector).runInFossologyViaSsh(anyString(), eq(inputStream), any(OutputStream.class)); assertThat(uploadId, is((long) -1)); } @Test public void testUploadToFossologyWithBadReturn() throws Exception { AttachmentContent attachment = mock(AttachmentContent.class); when(attachment.getId()).thenReturn("id"); when(attachment.getFilename()).thenReturn("fileName"); String clearingTeam = "cl"; final InputStream inputStream = mock(InputStream.class); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { OutputStream outputStream = (OutputStream) invocation.getArguments()[2]; outputStream.write("error".getBytes()); return 0; } }).when(sshConnector).runInFossologyViaSsh(anyString(), eq(inputStream), any(OutputStream.class)); final long uploadId = fossologyUploader.uploadToFossology(inputStream, attachment, clearingTeam); verify(sshConnector).runInFossologyViaSsh(anyString(), eq(inputStream), any(OutputStream.class)); assertThat(uploadId, is((long) -1)); } @Test public void testUploadToFossologyReportsErrors() throws Exception { AttachmentContent attachment = mock(AttachmentContent.class); when(attachment.getId()).thenReturn("id"); when(attachment.getFilename()).thenReturn("fileName"); String clearingTeam = "cl"; final InputStream inputStream = mock(InputStream.class); doReturn(-1).when(sshConnector).runInFossologyViaSsh(anyString(), eq(inputStream), any(OutputStream.class)); final long uploadId = fossologyUploader.uploadToFossology(inputStream, attachment, clearingTeam); verify(sshConnector).runInFossologyViaSsh(anyString(), eq(inputStream), any(OutputStream.class)); assertThat(uploadId, is((long) -1)); } @Test public void testUploadToFossologyWithEmptyId() throws Exception { AttachmentContent attachment = mock(AttachmentContent.class); when(attachment.getId()).thenReturn(null); when(attachment.getFilename()).thenReturn("fileName"); String clearingTeam = "cl"; final InputStream inputStream = mock(InputStream.class); final long uploadId = fossologyUploader.uploadToFossology(inputStream, attachment, clearingTeam); verify(sshConnector, never()).runInFossologyViaSsh(anyString(), any(InputStream.class), any(OutputStream.class)); assertThat(uploadId, is((long) -1)); } @Test public void testGetStatusInFossology() throws Exception { int uploadId = 42; fossologyUploader = spy(fossologyUploader); String clearingTeam = "team d"; final String output = "output result\nfrom the get status script"; doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { final OutputStream os = (OutputStream) invocation.getArguments()[1]; os.write(output.getBytes()); return 0; } }).when(sshConnector).runInFossologyViaSsh(anyString(), any(OutputStream.class)); FossologyStatus parseResult = FossologyStatus.IN_PROGRESS; doReturn(parseResult).when(fossologyUploader).parseResultStatus(output); FossologyStatus statusInFossology = fossologyUploader.getStatusInFossology(uploadId, clearingTeam); assertThat(statusInFossology, is(parseResult)); verify(fossologyUploader).parseResultStatus(output); verify(sshConnector).runInFossologyViaSsh(anyString(), any(OutputStream.class)); verify(fossologyUploader).getStatusInFossology(uploadId, clearingTeam); } @Test public void testGetStatusInFossologyIsConnectionErrorForServerNotAvailable() throws Exception { int uploadId = 43; String clearingTeam = "team d"; doReturn(1).when(sshConnector).runInFossologyViaSsh(anyString(), any(OutputStream.class)); FossologyStatus statusInFossology = fossologyUploader.getStatusInFossology(uploadId, clearingTeam); assertThat(statusInFossology, is(FossologyStatus.CONNECTION_FAILED)); verify(sshConnector).runInFossologyViaSsh(anyString(), any(OutputStream.class)); } @Test public void testGetStatusInFossologyIsErrorForBadUploadId() throws Exception { assertThat(fossologyUploader.getStatusInFossology(-1, "a"), is(FossologyStatus.ERROR)); } @Test public void testCopyToFossology() throws Exception { when(sshConnector.runInFossologyViaSsh(anyString(), any(InputStream.class))).thenReturn(0); final InputStream content = mock(InputStream.class); boolean success = fossologyUploader.copyToFossology("filename", content, false); assertThat(success, is(true)); verify(sshConnector).runInFossologyViaSsh(eq("cat > 'filename'"), eq(content)); } @Test public void testCopyToFossologyExecutable() throws Exception { when(sshConnector.runInFossologyViaSsh(anyString(), any(InputStream.class))).thenReturn(0); final InputStream content = mock(InputStream.class); boolean success = fossologyUploader.copyToFossology("filename", content, true); assertThat(success, is(true)); verify(sshConnector).runInFossologyViaSsh(eq("cat > 'filename' && chmod u+x 'filename'"), eq(content)); } @Test public void testCopyToFossologyReportsFailure() throws Exception { when(sshConnector.runInFossologyViaSsh(anyString(), any(InputStream.class))).thenReturn(1); final InputStream content = mock(InputStream.class); boolean success = fossologyUploader.copyToFossology("filename", content, false); assertThat(success, is(false)); verify(sshConnector).runInFossologyViaSsh(eq("cat > 'filename'"), eq(content)); } @Test public void testParseResult() { final FossologyStatus fossologyStatus = FossologyStatus.CLOSED; assertThat( fossologyUploader.parseResultStatus("status=" + fossologyStatus), is(fossologyStatus)); } @Test public void testParseResultWithBadStatus() { assertThat( fossologyUploader.parseResultStatus("status=CLOPED"), is(FossologyStatus.CONNECTION_FAILED)); } }