This is an automated email from the ASF dual-hosted git repository.
thenatog pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new c19d6a0db1 NIFI-10407 Improved reliability of GetSmbFileTest
c19d6a0db1 is described below
commit c19d6a0db15588a89f79c1e0ff8650270d77c94c
Author: exceptionfactory <[email protected]>
AuthorDate: Mon Aug 29 14:40:21 2022 -0500
NIFI-10407 Improved reliability of GetSmbFileTest
- Changed TestRunner.run() to avoid clearing internal cache between runs
- Updated Mockito usage with annotations
Signed-off-by: Nathan Gough <[email protected]>
This closes #6346.
---
.../apache/nifi/processors/smb/GetSmbFileTest.java | 98 ++++++++++++----------
1 file changed, 55 insertions(+), 43 deletions(-)
diff --git
a/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/test/java/org/apache/nifi/processors/smb/GetSmbFileTest.java
b/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/test/java/org/apache/nifi/processors/smb/GetSmbFileTest.java
index 83e6e03bd1..da209a06bb 100644
---
a/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/test/java/org/apache/nifi/processors/smb/GetSmbFileTest.java
+++
b/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/test/java/org/apache/nifi/processors/smb/GetSmbFileTest.java
@@ -30,11 +30,14 @@ import com.hierynomus.smbj.session.Session;
import com.hierynomus.smbj.share.DiskShare;
import com.hierynomus.smbj.share.File;
import org.apache.nifi.flowfile.attributes.CoreAttributes;
+import org.apache.nifi.util.MockFlowFile;
import org.apache.nifi.util.TestRunner;
import org.apache.nifi.util.TestRunners;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.mockito.MockitoAnnotations;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -44,35 +47,39 @@ import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anySet;
import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+@ExtendWith(MockitoExtension.class)
public class GetSmbFileTest {
private TestRunner testRunner;
+ @Mock
private SMBClient smbClient;
+
+ @Mock
private Connection connection;
+
+ @Mock
private Session session;
+
+ @Mock
private DiskShare diskShare;
private final static String HOSTNAME = "host";
private final static String SHARE = "share";
private final static String DIRECTORY = "nifi\\input";
- private final static String DOMAIN = "";
private final static String USERNAME = "user";
private final static String PASSWORD = "pass";
private void setupSmbProcessor() throws IOException {
- smbClient = mock(SMBClient.class);
- connection = mock(Connection.class);
- session = mock(Session.class);
- diskShare = mock(DiskShare.class);
-
when(smbClient.connect(any(String.class))).thenReturn(connection);
when(connection.authenticate(any(AuthenticationContext.class))).thenReturn(session);
when(session.connectShare(SHARE)).thenReturn(diskShare);
@@ -81,9 +88,6 @@ public class GetSmbFileTest {
testRunner.setProperty(GetSmbFile.HOSTNAME, HOSTNAME);
testRunner.setProperty(GetSmbFile.SHARE, SHARE);
testRunner.setProperty(GetSmbFile.DIRECTORY, DIRECTORY);
- if (!DOMAIN.isEmpty()) {
- testRunner.setProperty(GetSmbFile.DOMAIN, DOMAIN);
- }
testRunner.setProperty(GetSmbFile.USERNAME, USERNAME);
testRunner.setProperty(GetSmbFile.PASSWORD, PASSWORD);
@@ -95,7 +99,7 @@ public class GetSmbFileTest {
private FileIdBothDirectoryInformation mockFile(String path, String
filename, String fileContent, long fileAttributes) {
File smbfile = mock(File.class);
final String fullpath = path + "\\" + filename;
- when(diskShare.openFile(
+ lenient().when(diskShare.openFile(
eq(fullpath),
anySet(),
anySet(),
@@ -103,26 +107,26 @@ public class GetSmbFileTest {
any(SMB2CreateDisposition.class),
anySet()
)).thenReturn(smbfile);
- when(smbfile.getFileName()).thenReturn(filename);
+ lenient().when(smbfile.getFileName()).thenReturn(filename);
if (fileContent != null) {
InputStream is = new
ByteArrayInputStream(fileContent.getBytes(StandardCharsets.UTF_8));
- when(smbfile.getInputStream()).thenReturn(is);
+ lenient().when(smbfile.getInputStream()).thenReturn(is);
}
FileIdBothDirectoryInformation fdInfo =
mock(FileIdBothDirectoryInformation.class);
- when(fdInfo.getFileName()).thenReturn(filename);
- when(fdInfo.getFileAttributes()).thenReturn(fileAttributes);
+ lenient().when(fdInfo.getFileName()).thenReturn(filename);
+ lenient().when(fdInfo.getFileAttributes()).thenReturn(fileAttributes);
FileAllInformation fileAllInfo = mock(FileAllInformation.class);
FileTime fileTime = FileTime.ofEpochMillis(0);
FileBasicInformation fileBasicInfo = new
FileBasicInformation(fileTime, fileTime, fileTime, fileTime, 0);
FileStandardInformation fileStandardInformation =
mock(FileStandardInformation.class);
- when(smbfile.getFileInformation()).thenReturn(fileAllInfo);
- when(fileAllInfo.getBasicInformation()).thenReturn(fileBasicInfo);
-
when(fileAllInfo.getStandardInformation()).thenReturn(fileStandardInformation);
- when(fileStandardInformation.getEndOfFile()).thenReturn((long) 0);
+ lenient().when(smbfile.getFileInformation()).thenReturn(fileAllInfo);
+
lenient().when(fileAllInfo.getBasicInformation()).thenReturn(fileBasicInfo);
+
lenient().when(fileAllInfo.getStandardInformation()).thenReturn(fileStandardInformation);
+
lenient().when(fileStandardInformation.getEndOfFile()).thenReturn((long) 0);
return fdInfo;
}
@@ -146,24 +150,23 @@ public class GetSmbFileTest {
private FileIdBothDirectoryInformation mockDir(String path,
List<FileIdBothDirectoryInformation> files) {
final String[] fileSplits = path.split("\\\\");
final String filename = fileSplits[fileSplits.length - 1];
- when(diskShare.folderExists(path)).thenReturn(true);
- when(diskShare.list(path)).thenReturn(files);
+ lenient().when(diskShare.folderExists(path)).thenReturn(true);
+ lenient().when(diskShare.list(path)).thenReturn(files);
FileIdBothDirectoryInformation fdInfo =
mock(FileIdBothDirectoryInformation.class);
- when(fdInfo.getFileName()).thenReturn(filename);
-
when(fdInfo.getFileAttributes()).thenReturn(FileAttributes.FILE_ATTRIBUTE_DIRECTORY.getValue());
+ lenient().when(fdInfo.getFileName()).thenReturn(filename);
+
lenient().when(fdInfo.getFileAttributes()).thenReturn(FileAttributes.FILE_ATTRIBUTE_DIRECTORY.getValue());
return fdInfo;
}
@BeforeEach
public void init() throws IOException {
testRunner = TestRunners.newTestRunner(GetSmbFile.class);
- MockitoAnnotations.initMocks(this);
setupSmbProcessor();
}
@Test
- public void testOpenFileCalled() throws IOException {
+ public void testOpenFileCalled() {
FileIdBothDirectoryInformation file1 = mockFile(DIRECTORY,
"file1.txt", "abc");
mockDir(DIRECTORY, new ArrayList<FileIdBothDirectoryInformation>(){{
add(file1);
@@ -174,7 +177,7 @@ public class GetSmbFileTest {
}
@Test
- public void testHiddenFile() throws IOException {
+ public void testHiddenFile() {
testRunner.setProperty(GetSmbFile.IGNORE_HIDDEN_FILES, "true");
FileIdBothDirectoryInformation file1 = mockFile(DIRECTORY,
"file1.txt", "abc", FileAttributes.FILE_ATTRIBUTE_HIDDEN.getValue());
FileIdBothDirectoryInformation file2 = mockFile(DIRECTORY,
"file2.txt", "abc", FileAttributes.FILE_ATTRIBUTE_NORMAL.getValue());
@@ -188,7 +191,7 @@ public class GetSmbFileTest {
}
@Test
- public void testFileFilter() throws IOException {
+ public void testFileFilter() {
testRunner.setProperty(GetSmbFile.FILE_FILTER, "file[0-9]\\.txt");
mockDir(DIRECTORY, new ArrayList<FileIdBothDirectoryInformation>(){{
add(mockFile(DIRECTORY, "something_else.txt", "abc"));
@@ -203,7 +206,7 @@ public class GetSmbFileTest {
}
@Test
- public void testNonRecurse() throws IOException {
+ public void testNonRecurse() {
testRunner.setProperty(GetSmbFile.RECURSE, "false");
String subdir = DIRECTORY + "\\subdir1";
mockDir(DIRECTORY, new ArrayList<FileIdBothDirectoryInformation>(){{
@@ -222,7 +225,7 @@ public class GetSmbFileTest {
}
@Test
- public void testRecurse() throws IOException {
+ public void testRecurse() {
testRunner.setProperty(GetSmbFile.RECURSE, "true");
String subdir = DIRECTORY + "\\subdir1";
mockDir(DIRECTORY, new ArrayList<FileIdBothDirectoryInformation>(){{
@@ -242,7 +245,7 @@ public class GetSmbFileTest {
}
@Test
- public void testPathFilter() throws IOException {
+ public void testPathFilter() {
testRunner.setProperty(GetSmbFile.RECURSE, "true");
testRunner.setProperty(GetSmbFile.PATH_FILTER, ".*\\\\subdir[0-9]");
String subdir1 = DIRECTORY + "\\subdir1";
@@ -269,24 +272,33 @@ public class GetSmbFileTest {
}
@Test
- public void testBatchSize() throws IOException {
- int batchSize = 10;
+ public void testBatchSize() {
+ final int batchSize = 10;
+ final int totalSize = batchSize * 2;
testRunner.setProperty(GetSmbFile.BATCH_SIZE,
Integer.toString(batchSize));
- List<FileIdBothDirectoryInformation> fileList = new
ArrayList<FileIdBothDirectoryInformation>();
- for (int i=0; i<batchSize*2; i++) {
- fileList.add(mockFile(DIRECTORY, "file" + i + ".txt",
Integer.toString(i)));
+
+ final List<FileIdBothDirectoryInformation> files = new ArrayList<>();
+ final String fileNamePrefix = "file-";
+ for (int i = 0; i < totalSize; i++) {
+ files.add(mockFile(DIRECTORY, fileNamePrefix + i,
Integer.toString(i)));
}
- mockDir(DIRECTORY, fileList);
+ mockDir(DIRECTORY, files);
- testRunner.run();
+ // Avoid stopping on finish and run initialization
+ testRunner.run(1, false, true);
testRunner.assertTransferCount(GetSmbFile.REL_SUCCESS, batchSize);
- testRunner.run();
- testRunner.assertTransferCount(GetSmbFile.REL_SUCCESS, batchSize*2);
- List<String> queuedFileNames =
testRunner.getFlowFilesForRelationship(GetSmbFile.REL_SUCCESS).stream()
- .map(f -> f.getAttribute(CoreAttributes.FILENAME.key()))
+ // Stop on finish and skip initialization to avoid clearing internal
queue of files
+ testRunner.run(1, true, false);
+ testRunner.assertTransferCount(GetSmbFile.REL_SUCCESS, totalSize);
+
+ final List<MockFlowFile> flowFiles =
testRunner.getFlowFilesForRelationship(GetSmbFile.REL_SUCCESS);
+ final List<String> flowFileNames = flowFiles.stream()
+ .map(flowFile ->
flowFile.getAttribute(CoreAttributes.FILENAME.key()))
.collect(Collectors.toList());
- for (int i=0; i<batchSize*2; i++) {
- queuedFileNames.contains("file" + i + ".txt");
+
+ for (int i = 0; i < totalSize; i++) {
+ final String flowFileName = flowFileNames.get(0);
+ assertTrue(flowFileNames.contains(flowFileName),
String.format("FlowFile Name [%s] not found", flowFileName));
}
}
}