aboutsummaryrefslogtreecommitdiff
path: root/other/java/client/src
diff options
context:
space:
mode:
Diffstat (limited to 'other/java/client/src')
-rw-r--r--other/java/client/src/test/java/seaweedfs/client/FilerClientIntegrationTest.java323
-rw-r--r--other/java/client/src/test/java/seaweedfs/client/SeaweedStreamIntegrationTest.java417
2 files changed, 740 insertions, 0 deletions
diff --git a/other/java/client/src/test/java/seaweedfs/client/FilerClientIntegrationTest.java b/other/java/client/src/test/java/seaweedfs/client/FilerClientIntegrationTest.java
new file mode 100644
index 000000000..1015653bd
--- /dev/null
+++ b/other/java/client/src/test/java/seaweedfs/client/FilerClientIntegrationTest.java
@@ -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());
+ }
+}
diff --git a/other/java/client/src/test/java/seaweedfs/client/SeaweedStreamIntegrationTest.java b/other/java/client/src/test/java/seaweedfs/client/SeaweedStreamIntegrationTest.java
new file mode 100644
index 000000000..f384e059f
--- /dev/null
+++ b/other/java/client/src/test/java/seaweedfs/client/SeaweedStreamIntegrationTest.java
@@ -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));
+ }
+}
+