chore(deps): bump org.apache.hadoop:hadoop-common from 3.2.4 to 3.4.0 in /other/java/hdfs3 (#7512)
* chore(deps): bump org.apache.hadoop:hadoop-common in /other/java/hdfs3 Bumps org.apache.hadoop:hadoop-common from 3.2.4 to 3.4.0. --- updated-dependencies: - dependency-name: org.apache.hadoop:hadoop-common dependency-version: 3.4.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> * add java client unit tests * Update dependency-reduced-pom.xml * add java integration tests * fix * fix buffer --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: chrislu <chris.lu@gmail.com>
This commit is contained in:
@@ -0,0 +1,323 @@
|
||||
package seaweedfs.client;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Integration tests for FilerClient.
|
||||
*
|
||||
* These tests verify FilerClient operations against a running SeaweedFS filer
|
||||
* instance.
|
||||
*
|
||||
* Prerequisites:
|
||||
* - SeaweedFS master, volume server, and filer must be running
|
||||
* - Default ports: filer HTTP 8888, filer gRPC 18888
|
||||
*
|
||||
* To run tests:
|
||||
* export SEAWEEDFS_TEST_ENABLED=true
|
||||
* mvn test -Dtest=FilerClientIntegrationTest
|
||||
*/
|
||||
public class FilerClientIntegrationTest {
|
||||
|
||||
private FilerClient filerClient;
|
||||
private static final String TEST_ROOT = "/test-client-integration";
|
||||
private static final boolean TESTS_ENABLED = "true".equalsIgnoreCase(System.getenv("SEAWEEDFS_TEST_ENABLED"));
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
if (!TESTS_ENABLED) {
|
||||
return;
|
||||
}
|
||||
|
||||
filerClient = new FilerClient("localhost", 18888);
|
||||
|
||||
// Clean up any existing test directory
|
||||
if (filerClient.exists(TEST_ROOT)) {
|
||||
filerClient.rm(TEST_ROOT, true, true);
|
||||
}
|
||||
|
||||
// Create test root directory
|
||||
filerClient.mkdirs(TEST_ROOT, 0755);
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() throws Exception {
|
||||
if (!TESTS_ENABLED || filerClient == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// Clean up test directory
|
||||
if (filerClient.exists(TEST_ROOT)) {
|
||||
filerClient.rm(TEST_ROOT, true, true);
|
||||
}
|
||||
} finally {
|
||||
filerClient.shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMkdirs() {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testDir = TEST_ROOT + "/testdir";
|
||||
boolean success = filerClient.mkdirs(testDir, 0755);
|
||||
|
||||
assertTrue("Directory creation should succeed", success);
|
||||
assertTrue("Directory should exist", filerClient.exists(testDir));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTouch() {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testFile = TEST_ROOT + "/testfile.txt";
|
||||
boolean success = filerClient.touch(testFile, 0644);
|
||||
|
||||
assertTrue("Touch should succeed", success);
|
||||
assertTrue("File should exist", filerClient.exists(testFile));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testExists() {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
assertTrue("Root should exist", filerClient.exists("/"));
|
||||
assertTrue("Test root should exist", filerClient.exists(TEST_ROOT));
|
||||
assertFalse("Non-existent path should not exist",
|
||||
filerClient.exists(TEST_ROOT + "/nonexistent"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testListEntries() {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
// Create some test files and directories
|
||||
filerClient.touch(TEST_ROOT + "/file1.txt", 0644);
|
||||
filerClient.touch(TEST_ROOT + "/file2.txt", 0644);
|
||||
filerClient.mkdirs(TEST_ROOT + "/subdir", 0755);
|
||||
|
||||
List<FilerProto.Entry> entries = filerClient.listEntries(TEST_ROOT);
|
||||
|
||||
assertNotNull("Entries should not be null", entries);
|
||||
assertEquals("Should have 3 entries", 3, entries.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testListEntriesWithPrefix() {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
// Create test files
|
||||
filerClient.touch(TEST_ROOT + "/test1.txt", 0644);
|
||||
filerClient.touch(TEST_ROOT + "/test2.txt", 0644);
|
||||
filerClient.touch(TEST_ROOT + "/other.txt", 0644);
|
||||
|
||||
List<FilerProto.Entry> entries = filerClient.listEntries(TEST_ROOT, "test", "", 100, false);
|
||||
|
||||
assertNotNull("Entries should not be null", entries);
|
||||
assertEquals("Should have 2 entries starting with 'test'", 2, entries.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteFile() {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testFile = TEST_ROOT + "/deleteme.txt";
|
||||
filerClient.touch(testFile, 0644);
|
||||
|
||||
assertTrue("File should exist before delete", filerClient.exists(testFile));
|
||||
|
||||
boolean success = filerClient.rm(testFile, false, true);
|
||||
|
||||
assertTrue("Delete should succeed", success);
|
||||
assertFalse("File should not exist after delete", filerClient.exists(testFile));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteDirectoryRecursive() {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testDir = TEST_ROOT + "/deletedir";
|
||||
filerClient.mkdirs(testDir, 0755);
|
||||
filerClient.touch(testDir + "/file.txt", 0644);
|
||||
|
||||
assertTrue("Directory should exist", filerClient.exists(testDir));
|
||||
assertTrue("File should exist", filerClient.exists(testDir + "/file.txt"));
|
||||
|
||||
boolean success = filerClient.rm(testDir, true, true);
|
||||
|
||||
assertTrue("Delete should succeed", success);
|
||||
assertFalse("Directory should not exist after delete", filerClient.exists(testDir));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRename() {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String srcFile = TEST_ROOT + "/source.txt";
|
||||
String dstFile = TEST_ROOT + "/destination.txt";
|
||||
|
||||
filerClient.touch(srcFile, 0644);
|
||||
assertTrue("Source file should exist", filerClient.exists(srcFile));
|
||||
|
||||
boolean success = filerClient.mv(srcFile, dstFile);
|
||||
|
||||
assertTrue("Rename should succeed", success);
|
||||
assertFalse("Source file should not exist after rename", filerClient.exists(srcFile));
|
||||
assertTrue("Destination file should exist after rename", filerClient.exists(dstFile));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetEntry() {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testFile = TEST_ROOT + "/getentry.txt";
|
||||
filerClient.touch(testFile, 0644);
|
||||
|
||||
FilerProto.Entry entry = filerClient.lookupEntry(TEST_ROOT, "getentry.txt");
|
||||
|
||||
assertNotNull("Entry should not be null", entry);
|
||||
assertEquals("Entry name should match", "getentry.txt", entry.getName());
|
||||
assertFalse("Entry should not be a directory", entry.getIsDirectory());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetEntryForDirectory() {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testDir = TEST_ROOT + "/testsubdir";
|
||||
filerClient.mkdirs(testDir, 0755);
|
||||
|
||||
FilerProto.Entry entry = filerClient.lookupEntry(TEST_ROOT, "testsubdir");
|
||||
|
||||
assertNotNull("Entry should not be null", entry);
|
||||
assertEquals("Entry name should match", "testsubdir", entry.getName());
|
||||
assertTrue("Entry should be a directory", entry.getIsDirectory());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateAndListNestedDirectories() {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String nestedPath = TEST_ROOT + "/level1/level2/level3";
|
||||
boolean success = filerClient.mkdirs(nestedPath, 0755);
|
||||
|
||||
assertTrue("Nested directory creation should succeed", success);
|
||||
assertTrue("Nested directory should exist", filerClient.exists(nestedPath));
|
||||
|
||||
// Verify each level exists
|
||||
assertTrue("Level 1 should exist", filerClient.exists(TEST_ROOT + "/level1"));
|
||||
assertTrue("Level 2 should exist", filerClient.exists(TEST_ROOT + "/level1/level2"));
|
||||
assertTrue("Level 3 should exist", filerClient.exists(nestedPath));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMultipleFilesInDirectory() {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testDir = TEST_ROOT + "/multifiles";
|
||||
filerClient.mkdirs(testDir, 0755);
|
||||
|
||||
// Create 10 files
|
||||
for (int i = 0; i < 10; i++) {
|
||||
filerClient.touch(testDir + "/file" + i + ".txt", 0644);
|
||||
}
|
||||
|
||||
List<FilerProto.Entry> entries = filerClient.listEntries(testDir);
|
||||
|
||||
assertNotNull("Entries should not be null", entries);
|
||||
assertEquals("Should have 10 files", 10, entries.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRenameDirectory() {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String srcDir = TEST_ROOT + "/sourcedir";
|
||||
String dstDir = TEST_ROOT + "/destdir";
|
||||
|
||||
filerClient.mkdirs(srcDir, 0755);
|
||||
filerClient.touch(srcDir + "/file.txt", 0644);
|
||||
|
||||
boolean success = filerClient.mv(srcDir, dstDir);
|
||||
|
||||
assertTrue("Directory rename should succeed", success);
|
||||
assertFalse("Source directory should not exist", filerClient.exists(srcDir));
|
||||
assertTrue("Destination directory should exist", filerClient.exists(dstDir));
|
||||
assertTrue("File should exist in destination", filerClient.exists(dstDir + "/file.txt"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLookupNonExistentEntry() {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
FilerProto.Entry entry = filerClient.lookupEntry(TEST_ROOT, "nonexistent.txt");
|
||||
|
||||
assertNull("Entry for non-existent file should be null", entry);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmptyDirectory() {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String emptyDir = TEST_ROOT + "/emptydir";
|
||||
filerClient.mkdirs(emptyDir, 0755);
|
||||
|
||||
List<FilerProto.Entry> entries = filerClient.listEntries(emptyDir);
|
||||
|
||||
assertNotNull("Entries should not be null", entries);
|
||||
assertTrue("Empty directory should have no entries", entries.isEmpty());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,417 @@
|
||||
package seaweedfs.client;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Arrays;
|
||||
import java.util.Random;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Integration tests for SeaweedInputStream and SeaweedOutputStream.
|
||||
*
|
||||
* These tests verify stream operations against a running SeaweedFS instance.
|
||||
*
|
||||
* Prerequisites:
|
||||
* - SeaweedFS master, volume server, and filer must be running
|
||||
* - Default ports: filer HTTP 8888, filer gRPC 18888
|
||||
*
|
||||
* To run tests:
|
||||
* export SEAWEEDFS_TEST_ENABLED=true
|
||||
* mvn test -Dtest=SeaweedStreamIntegrationTest
|
||||
*/
|
||||
public class SeaweedStreamIntegrationTest {
|
||||
|
||||
private FilerClient filerClient;
|
||||
private static final String TEST_ROOT = "/test-stream-integration";
|
||||
private static final boolean TESTS_ENABLED =
|
||||
"true".equalsIgnoreCase(System.getenv("SEAWEEDFS_TEST_ENABLED"));
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
if (!TESTS_ENABLED) {
|
||||
return;
|
||||
}
|
||||
|
||||
filerClient = new FilerClient("localhost", 18888);
|
||||
|
||||
// Clean up any existing test directory
|
||||
if (filerClient.exists(TEST_ROOT)) {
|
||||
filerClient.rm(TEST_ROOT, true, true);
|
||||
}
|
||||
|
||||
// Create test root directory
|
||||
filerClient.mkdirs(TEST_ROOT, 0755);
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() throws Exception {
|
||||
if (!TESTS_ENABLED || filerClient == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// Clean up test directory
|
||||
if (filerClient.exists(TEST_ROOT)) {
|
||||
filerClient.rm(TEST_ROOT, true, true);
|
||||
}
|
||||
} finally {
|
||||
filerClient.shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWriteAndReadSmallFile() throws IOException {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testPath = TEST_ROOT + "/small.txt";
|
||||
String testContent = "Hello, SeaweedFS!";
|
||||
|
||||
// Write file
|
||||
SeaweedOutputStream outputStream = new SeaweedOutputStream(filerClient, testPath);
|
||||
outputStream.write(testContent.getBytes(StandardCharsets.UTF_8));
|
||||
outputStream.close();
|
||||
|
||||
// Verify file exists
|
||||
assertTrue("File should exist", filerClient.exists(testPath));
|
||||
|
||||
// Read file
|
||||
FilerProto.Entry entry = filerClient.lookupEntry(
|
||||
SeaweedOutputStream.getParentDirectory(testPath),
|
||||
SeaweedOutputStream.getFileName(testPath)
|
||||
);
|
||||
assertNotNull("Entry should not be null", entry);
|
||||
|
||||
SeaweedInputStream inputStream = new SeaweedInputStream(filerClient, testPath, entry);
|
||||
byte[] buffer = new byte[testContent.length()];
|
||||
int bytesRead = inputStream.read(buffer);
|
||||
inputStream.close();
|
||||
|
||||
assertEquals("Should read all bytes", testContent.length(), bytesRead);
|
||||
assertEquals("Content should match", testContent, new String(buffer, StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWriteAndReadLargeFile() throws IOException {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testPath = TEST_ROOT + "/large.bin";
|
||||
int fileSize = 10 * 1024 * 1024; // 10 MB
|
||||
|
||||
// Generate random data
|
||||
byte[] originalData = new byte[fileSize];
|
||||
new Random(42).nextBytes(originalData); // Use seed for reproducibility
|
||||
|
||||
// Write file
|
||||
SeaweedOutputStream outputStream = new SeaweedOutputStream(filerClient, testPath);
|
||||
outputStream.write(originalData);
|
||||
outputStream.close();
|
||||
|
||||
// Verify file exists
|
||||
assertTrue("File should exist", filerClient.exists(testPath));
|
||||
|
||||
// Read file
|
||||
FilerProto.Entry entry = filerClient.lookupEntry(
|
||||
SeaweedOutputStream.getParentDirectory(testPath),
|
||||
SeaweedOutputStream.getFileName(testPath)
|
||||
);
|
||||
assertNotNull("Entry should not be null", entry);
|
||||
|
||||
SeaweedInputStream inputStream = new SeaweedInputStream(filerClient, testPath, entry);
|
||||
|
||||
// Read file in chunks to handle large files properly
|
||||
byte[] readData = new byte[fileSize];
|
||||
int totalRead = 0;
|
||||
int bytesRead;
|
||||
byte[] buffer = new byte[8192]; // Read in 8KB chunks
|
||||
|
||||
while ((bytesRead = inputStream.read(buffer)) > 0) {
|
||||
System.arraycopy(buffer, 0, readData, totalRead, bytesRead);
|
||||
totalRead += bytesRead;
|
||||
}
|
||||
inputStream.close();
|
||||
|
||||
assertEquals("Should read all bytes", fileSize, totalRead);
|
||||
assertArrayEquals("Content should match", originalData, readData);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWriteInChunks() throws IOException {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testPath = TEST_ROOT + "/chunked.txt";
|
||||
String[] chunks = {"First chunk. ", "Second chunk. ", "Third chunk."};
|
||||
|
||||
// Write file in chunks
|
||||
SeaweedOutputStream outputStream = new SeaweedOutputStream(filerClient, testPath);
|
||||
for (String chunk : chunks) {
|
||||
outputStream.write(chunk.getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
outputStream.close();
|
||||
|
||||
// Read and verify
|
||||
FilerProto.Entry entry = filerClient.lookupEntry(
|
||||
SeaweedOutputStream.getParentDirectory(testPath),
|
||||
SeaweedOutputStream.getFileName(testPath)
|
||||
);
|
||||
|
||||
SeaweedInputStream inputStream = new SeaweedInputStream(filerClient, testPath, entry);
|
||||
byte[] buffer = new byte[1024];
|
||||
int bytesRead = inputStream.read(buffer);
|
||||
inputStream.close();
|
||||
|
||||
String expected = String.join("", chunks);
|
||||
String actual = new String(buffer, 0, bytesRead, StandardCharsets.UTF_8);
|
||||
|
||||
assertEquals("Content should match", expected, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReadWithOffset() throws IOException {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testPath = TEST_ROOT + "/offset.txt";
|
||||
String testContent = "0123456789ABCDEFGHIJ";
|
||||
|
||||
// Write file
|
||||
SeaweedOutputStream outputStream = new SeaweedOutputStream(filerClient, testPath);
|
||||
outputStream.write(testContent.getBytes(StandardCharsets.UTF_8));
|
||||
outputStream.close();
|
||||
|
||||
// Read with offset
|
||||
FilerProto.Entry entry = filerClient.lookupEntry(
|
||||
SeaweedOutputStream.getParentDirectory(testPath),
|
||||
SeaweedOutputStream.getFileName(testPath)
|
||||
);
|
||||
|
||||
SeaweedInputStream inputStream = new SeaweedInputStream(filerClient, testPath, entry);
|
||||
inputStream.seek(10); // Skip first 10 bytes
|
||||
|
||||
byte[] buffer = new byte[10];
|
||||
int bytesRead = inputStream.read(buffer);
|
||||
inputStream.close();
|
||||
|
||||
assertEquals("Should read 10 bytes", 10, bytesRead);
|
||||
assertEquals("Should read from offset", "ABCDEFGHIJ",
|
||||
new String(buffer, StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReadPartial() throws IOException {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testPath = TEST_ROOT + "/partial.txt";
|
||||
String testContent = "The quick brown fox jumps over the lazy dog";
|
||||
|
||||
// Write file
|
||||
SeaweedOutputStream outputStream = new SeaweedOutputStream(filerClient, testPath);
|
||||
outputStream.write(testContent.getBytes(StandardCharsets.UTF_8));
|
||||
outputStream.close();
|
||||
|
||||
// Read partial
|
||||
FilerProto.Entry entry = filerClient.lookupEntry(
|
||||
SeaweedOutputStream.getParentDirectory(testPath),
|
||||
SeaweedOutputStream.getFileName(testPath)
|
||||
);
|
||||
|
||||
SeaweedInputStream inputStream = new SeaweedInputStream(filerClient, testPath, entry);
|
||||
|
||||
// Read only "quick brown"
|
||||
inputStream.seek(4);
|
||||
byte[] buffer = new byte[11];
|
||||
int bytesRead = inputStream.read(buffer);
|
||||
inputStream.close();
|
||||
|
||||
assertEquals("Should read 11 bytes", 11, bytesRead);
|
||||
assertEquals("Should read partial content", "quick brown",
|
||||
new String(buffer, StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmptyFile() throws IOException {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testPath = TEST_ROOT + "/empty.txt";
|
||||
|
||||
// Write empty file
|
||||
SeaweedOutputStream outputStream = new SeaweedOutputStream(filerClient, testPath);
|
||||
outputStream.close();
|
||||
|
||||
// Verify file exists
|
||||
assertTrue("File should exist", filerClient.exists(testPath));
|
||||
|
||||
// Read empty file
|
||||
FilerProto.Entry entry = filerClient.lookupEntry(
|
||||
SeaweedOutputStream.getParentDirectory(testPath),
|
||||
SeaweedOutputStream.getFileName(testPath)
|
||||
);
|
||||
assertNotNull("Entry should not be null", entry);
|
||||
|
||||
SeaweedInputStream inputStream = new SeaweedInputStream(filerClient, testPath, entry);
|
||||
byte[] buffer = new byte[100];
|
||||
int bytesRead = inputStream.read(buffer);
|
||||
inputStream.close();
|
||||
|
||||
assertEquals("Should read 0 bytes from empty file", -1, bytesRead);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOverwriteFile() throws IOException {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testPath = TEST_ROOT + "/overwrite.txt";
|
||||
String originalContent = "Original content";
|
||||
String newContent = "New content that overwrites the original";
|
||||
|
||||
// Write original file
|
||||
SeaweedOutputStream outputStream = new SeaweedOutputStream(filerClient, testPath);
|
||||
outputStream.write(originalContent.getBytes(StandardCharsets.UTF_8));
|
||||
outputStream.close();
|
||||
|
||||
// Overwrite file
|
||||
outputStream = new SeaweedOutputStream(filerClient, testPath);
|
||||
outputStream.write(newContent.getBytes(StandardCharsets.UTF_8));
|
||||
outputStream.close();
|
||||
|
||||
// Read and verify
|
||||
FilerProto.Entry entry = filerClient.lookupEntry(
|
||||
SeaweedOutputStream.getParentDirectory(testPath),
|
||||
SeaweedOutputStream.getFileName(testPath)
|
||||
);
|
||||
|
||||
SeaweedInputStream inputStream = new SeaweedInputStream(filerClient, testPath, entry);
|
||||
byte[] buffer = new byte[1024];
|
||||
int bytesRead = inputStream.read(buffer);
|
||||
inputStream.close();
|
||||
|
||||
String actual = new String(buffer, 0, bytesRead, StandardCharsets.UTF_8);
|
||||
assertEquals("Should have new content", newContent, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMultipleReads() throws IOException {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testPath = TEST_ROOT + "/multireads.txt";
|
||||
String testContent = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
|
||||
// Write file
|
||||
SeaweedOutputStream outputStream = new SeaweedOutputStream(filerClient, testPath);
|
||||
outputStream.write(testContent.getBytes(StandardCharsets.UTF_8));
|
||||
outputStream.close();
|
||||
|
||||
// Read in multiple small chunks
|
||||
FilerProto.Entry entry = filerClient.lookupEntry(
|
||||
SeaweedOutputStream.getParentDirectory(testPath),
|
||||
SeaweedOutputStream.getFileName(testPath)
|
||||
);
|
||||
|
||||
SeaweedInputStream inputStream = new SeaweedInputStream(filerClient, testPath, entry);
|
||||
|
||||
StringBuilder result = new StringBuilder();
|
||||
byte[] buffer = new byte[5];
|
||||
int bytesRead;
|
||||
while ((bytesRead = inputStream.read(buffer)) > 0) {
|
||||
result.append(new String(buffer, 0, bytesRead, StandardCharsets.UTF_8));
|
||||
}
|
||||
inputStream.close();
|
||||
|
||||
assertEquals("Should read entire content", testContent, result.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBinaryData() throws IOException {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testPath = TEST_ROOT + "/binary.bin";
|
||||
byte[] binaryData = new byte[256];
|
||||
for (int i = 0; i < 256; i++) {
|
||||
binaryData[i] = (byte) i;
|
||||
}
|
||||
|
||||
// Write binary file
|
||||
SeaweedOutputStream outputStream = new SeaweedOutputStream(filerClient, testPath);
|
||||
outputStream.write(binaryData);
|
||||
outputStream.close();
|
||||
|
||||
// Read and verify
|
||||
FilerProto.Entry entry = filerClient.lookupEntry(
|
||||
SeaweedOutputStream.getParentDirectory(testPath),
|
||||
SeaweedOutputStream.getFileName(testPath)
|
||||
);
|
||||
|
||||
SeaweedInputStream inputStream = new SeaweedInputStream(filerClient, testPath, entry);
|
||||
byte[] readData = new byte[256];
|
||||
int bytesRead = inputStream.read(readData);
|
||||
inputStream.close();
|
||||
|
||||
assertEquals("Should read all bytes", 256, bytesRead);
|
||||
assertArrayEquals("Binary data should match", binaryData, readData);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFlush() throws IOException {
|
||||
if (!TESTS_ENABLED) {
|
||||
System.out.println("Skipping test - SEAWEEDFS_TEST_ENABLED not set");
|
||||
return;
|
||||
}
|
||||
|
||||
String testPath = TEST_ROOT + "/flush.txt";
|
||||
String testContent = "Content to flush";
|
||||
|
||||
// Write file with flush
|
||||
SeaweedOutputStream outputStream = new SeaweedOutputStream(filerClient, testPath);
|
||||
outputStream.write(testContent.getBytes(StandardCharsets.UTF_8));
|
||||
outputStream.flush(); // Explicitly flush
|
||||
outputStream.close();
|
||||
|
||||
// Verify file was written
|
||||
assertTrue("File should exist after flush", filerClient.exists(testPath));
|
||||
|
||||
// Read and verify
|
||||
FilerProto.Entry entry = filerClient.lookupEntry(
|
||||
SeaweedOutputStream.getParentDirectory(testPath),
|
||||
SeaweedOutputStream.getFileName(testPath)
|
||||
);
|
||||
|
||||
SeaweedInputStream inputStream = new SeaweedInputStream(filerClient, testPath, entry);
|
||||
byte[] buffer = new byte[testContent.length()];
|
||||
int bytesRead = inputStream.read(buffer);
|
||||
inputStream.close();
|
||||
|
||||
assertEquals("Content should match", testContent,
|
||||
new String(buffer, 0, bytesRead, StandardCharsets.UTF_8));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user