From c1bd4a1109003e36ba93fa181a230dcfedd63cb7 Mon Sep 17 00:00:00 2001 From: Danesh Kuruppu Date: Mon, 16 Jun 2025 15:20:57 +0530 Subject: [PATCH 1/8] Remove skipping preprocessed files based on the filename --- .../stdlib/ftp/transport/server/RemoteFileSystemConsumer.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/native/src/main/java/io/ballerina/stdlib/ftp/transport/server/RemoteFileSystemConsumer.java b/native/src/main/java/io/ballerina/stdlib/ftp/transport/server/RemoteFileSystemConsumer.java index d8286bf52..cf4185a2f 100644 --- a/native/src/main/java/io/ballerina/stdlib/ftp/transport/server/RemoteFileSystemConsumer.java +++ b/native/src/main/java/io/ballerina/stdlib/ftp/transport/server/RemoteFileSystemConsumer.java @@ -223,9 +223,6 @@ private void handleDirectory(FileObject[] children) throws FileSystemException { */ private void handleFile(FileObject file) throws FileSystemException { String path = file.getName().getURI(); - if (processed.contains(path)) { - return; - } FileInfo info = new FileInfo(path); info.setFileSize(file.getContent().getSize()); info.setLastModifiedTime(file.getContent().getLastModifiedTime()); From f7e4e0e9299b6de756ce2c4d5650d42f151a04e3 Mon Sep 17 00:00:00 2001 From: Danesh Kuruppu Date: Tue, 17 Jun 2025 23:01:47 +0530 Subject: [PATCH 2/8] Fix test failures --- ballerina/tests/client_endpoint_test.bal | 4 +- ...ure_listener_endpoint_with_caller_test.bal | 126 ++++++++++-------- .../mockServerUtils/MockFtpServer.java | 2 + 3 files changed, 73 insertions(+), 59 deletions(-) diff --git a/ballerina/tests/client_endpoint_test.bal b/ballerina/tests/client_endpoint_test.bal index 927cc5b94..d91bdb611 100644 --- a/ballerina/tests/client_endpoint_test.bal +++ b/ballerina/tests/client_endpoint_test.bal @@ -19,6 +19,7 @@ import ballerina/test; import ballerina/lang.runtime as runtime; import ballerina/lang.'string as strings; import ballerina/log; +import ballerina/file; string filePath = "/home/in/test1.txt"; string nonFittingFilePath = "/home/in/test4.txt"; @@ -266,7 +267,7 @@ isolated function matchStreamContent(stream binary } } return matchedString == fullContent; -} +} @test:Config { dependsOn: [testPutLargeFileContent] @@ -573,4 +574,5 @@ public function cleanTestEnvironment() returns error? { check (remoteServerListener).gracefulStop(); check (anonymousRemoteServerListener).gracefulStop(); check (secureRemoteServerListener).gracefulStop(); + check file:remove(check file:joinPath("tests", "resources", "datafiles", "out"), option = file:RECURSIVE); } diff --git a/ballerina/tests/secure_listener_endpoint_with_caller_test.bal b/ballerina/tests/secure_listener_endpoint_with_caller_test.bal index 69c4499d4..9be3038df 100644 --- a/ballerina/tests/secure_listener_endpoint_with_caller_test.bal +++ b/ballerina/tests/secure_listener_endpoint_with_caller_test.bal @@ -39,84 +39,93 @@ ListenerConfiguration callerListenerConfig = { } }, port: 21213, - pollingInterval: 2, + pollingInterval: 1, + path: "/in", fileNamePattern: "(.*).caller" }; Service callerService = service object { - string addedFilepath = ""; remote function onFileChange(WatchEvent & readonly event, Caller caller) returns error? { - event.addedFiles.forEach(function (FileInfo fileInfo) { - self.addedFilepath = fileInfo.path; - }); - if self.addedFilepath.endsWith("/put.caller") { - stream bStream = check io:fileReadBlocksAsStream(putFilePath, 5); - check caller->put("/put2.caller", bStream); - } else if self.addedFilepath.endsWith("/append.caller") { - stream bStream = check io:fileReadBlocksAsStream(appendFilePath, 7); - check caller->append("/append.caller", bStream); - } else if self.addedFilepath.endsWith("/rename.caller") { - check caller->rename("/rename.caller", "/rename2.caller"); - } else if self.addedFilepath.endsWith("/delete.caller") { - check caller->delete("/delete.caller"); - } else if self.addedFilepath.endsWith("/list.caller") { - fileList = check caller->list("/"); - } else if self.addedFilepath.endsWith("/get.caller") { - stream fileStream = check caller->get("/get.caller"); - fileGetContentCorrect = check matchStreamContent(fileStream, "Put content"); - } else if self.addedFilepath.endsWith("/mkdir.caller") { - check caller->mkdir("/callerDir"); - } else if self.addedFilepath.endsWith("/rmdir.caller") { - check caller->rmdir("/callerDir"); - } else if self.addedFilepath.endsWith("/size.caller") { - fileSize = check caller->size("/size.caller"); - } else if self.addedFilepath.endsWith("/isdirectory.caller") { - isDir = check caller->isDirectory("/callerDir"); + foreach FileInfo fileInfo in event.addedFiles { + string addedFilepath = fileInfo.path; + if addedFilepath.endsWith("/put.caller") { + stream bStream = check io:fileReadBlocksAsStream(putFilePath, 5); + check caller->put("/out/put2.caller", bStream); + check caller->rename("/in/put.caller", "/out/put.caller"); + } else if addedFilepath.endsWith("/append.caller") { + stream bStream = check io:fileReadBlocksAsStream(appendFilePath, 7); + check caller->append("/in/append.caller", bStream); + check caller->rename("/in/append.caller", "/out/append.caller"); + } else if addedFilepath.endsWith("/rename.caller") { + check caller->rename("/in/rename.caller", "/out/rename.caller"); + } else if addedFilepath.endsWith("/delete.caller") { + check caller->delete("/in/delete.caller"); + } else if addedFilepath.endsWith("/list.caller") { + fileList = check caller->list("/in"); + check caller->rename("/in/list.caller", "/out/list.caller"); + } else if addedFilepath.endsWith("/get.caller") { + stream fileStream = check caller->get("/in/get.caller"); + fileGetContentCorrect = check matchStreamContent(fileStream, "Put content"); + check caller->rename("/in/get.caller", "/out/get.caller"); + } else if addedFilepath.endsWith("/mkdir.caller") { + check caller->mkdir("/out/callerDir"); + check caller->rename("/in/mkdir.caller", "/out/mkdir.caller"); + } else if addedFilepath.endsWith("/rmdir.caller") { + check caller->rmdir("/out/callerDir"); + check caller->rename("/in/rmdir.caller", "/out/rmdir.caller"); + } else if addedFilepath.endsWith("/size.caller") { + fileSize = check caller->size("/in/size.caller"); + check caller->rename("/in/size.caller", "/out/size.caller"); + } else if addedFilepath.endsWith("/isdirectory.caller") { + isDir = check caller->isDirectory("/out/callerDir"); + check caller->rename("/in/isdirectory.caller", "/out/isdirectory.caller"); + } } + } }; @test:Config {} public function testFilePutWithCaller() returns error? { stream bStream = check io:fileReadBlocksAsStream(putFilePath, 5); - check (sftpClientEp)->put("/put.caller", bStream); + check (sftpClientEp)->put("/in/put.caller", bStream); runtime:sleep(3); - stream str = check (sftpClientEp)->get("/put2.caller"); + stream str = check (sftpClientEp)->get("/out/put2.caller"); test:assertTrue(check matchStreamContent(str, "Put content")); check str.close(); - check (sftpClientEp)->delete("/put.caller"); - check (sftpClientEp)->delete("/put2.caller"); + check (sftpClientEp)->delete("/out/put2.caller"); + check (sftpClientEp)->delete("/out/put.caller"); } @test:Config {} public function testFileAppendWithCaller() returns error? { stream bStream = check io:fileReadBlocksAsStream(putFilePath, 5); - check (sftpClientEp)->put("/append.caller", bStream); + check (sftpClientEp)->put("/in/append.caller", bStream); runtime:sleep(3); - stream str = check (sftpClientEp)->get("/append.caller"); + stream str = check (sftpClientEp)->get("/out/append.caller"); test:assertTrue(check matchStreamContent(str, "Put contentAppend content")); check str.close(); - check (sftpClientEp)->delete("/append.caller"); + check (sftpClientEp)->delete("/out/append.caller"); } @test:Config {} public function testFileRenameWithCaller() returns error? { stream bStream = check io:fileReadBlocksAsStream(putFilePath, 5); - check (sftpClientEp)->put("/rename.caller", bStream); + check (sftpClientEp)->put("/in/rename.caller", bStream); runtime:sleep(3); - stream str = check (sftpClientEp)->get("/rename2.caller"); + stream str = check (sftpClientEp)->get("/out/rename.caller"); test:assertTrue(check matchStreamContent(str, "Put content")); check str.close(); - check (sftpClientEp)->delete("/rename2.caller"); + check (sftpClientEp)->delete("/out/rename.caller"); } @test:Config {} public function testFileDeleteWithCaller() returns error? { stream bStream = check io:fileReadBlocksAsStream(putFilePath, 5); - check (sftpClientEp)->put("/delete.caller", bStream); + check (sftpClientEp)->put("/in/delete.caller", bStream); runtime:sleep(3); - stream|Error result = (sftpClientEp)->get("/delete.caller"); + stream|Error result = (sftpClientEp)->get("/in/delete.caller"); if result is Error { test:assertTrue(result.message().endsWith("delete.caller not found")); } else { @@ -127,29 +136,30 @@ public function testFileDeleteWithCaller() returns error? { @test:Config {} public function testFileListWithCaller() returns error? { stream bStream = check io:fileReadBlocksAsStream(putFilePath, 5); - check (sftpClientEp)->put("/list.caller", bStream); + check (sftpClientEp)->put("/in/list.caller", bStream); runtime:sleep(3); - test:assertEquals(fileList[0].path, "/list.caller"); - check (sftpClientEp)->delete("/list.caller"); + test:assertEquals(fileList.length(), 1); + test:assertEquals(fileList[0].path, "/in/list.caller"); + check (sftpClientEp)->delete("/out/list.caller"); } @test:Config {} public function testFileGetWithCaller() returns error? { stream bStream = check io:fileReadBlocksAsStream(putFilePath, 5); - check (sftpClientEp)->put("/get.caller", bStream); + check (sftpClientEp)->put("/in/get.caller", bStream); runtime:sleep(3); test:assertTrue(fileGetContentCorrect); - check (sftpClientEp)->delete("/get.caller"); + check (sftpClientEp)->delete("/out/get.caller"); } @test:Config {} public function testMkDirWithCaller() returns error? { stream bStream = check io:fileReadBlocksAsStream(putFilePath, 5); - check (sftpClientEp)->put("/mkdir.caller", bStream); + check (sftpClientEp)->put("/in/mkdir.caller", bStream); runtime:sleep(3); - boolean isDir = check (sftpClientEp)->isDirectory("/callerDir"); + boolean isDir = check (sftpClientEp)->isDirectory("/out/callerDir"); test:assertTrue(isDir); - check (sftpClientEp)->delete("/mkdir.caller"); + check (sftpClientEp)->delete("/out/mkdir.caller"); } @test:Config { @@ -157,10 +167,10 @@ public function testMkDirWithCaller() returns error? { } public function testIsDirectoryWithCaller() returns error? { stream bStream = check io:fileReadBlocksAsStream(putFilePath, 5); - check (sftpClientEp)->put("/isdirectory.caller", bStream); + check (sftpClientEp)->put("/in/isdirectory.caller", bStream); runtime:sleep(3); test:assertTrue(isDir); - check (sftpClientEp)->delete("/isdirectory.caller"); + check (sftpClientEp)->delete("/out/isdirectory.caller"); } @test:Config { @@ -168,24 +178,24 @@ public function testIsDirectoryWithCaller() returns error? { } public function testRmDirWithCaller() returns error? { stream bStream = check io:fileReadBlocksAsStream(putFilePath, 5); - check (sftpClientEp)->put("/rmdir.caller", bStream); + check (sftpClientEp)->put("/in/rmdir.caller", bStream); runtime:sleep(3); - boolean|Error result = (sftpClientEp)->isDirectory("/callerDir"); + boolean|Error result = (sftpClientEp)->isDirectory("/out/callerDir"); if result is Error { - test:assertEquals(result.message(), "/callerDir does not exists to check if it is a directory."); + test:assertEquals(result.message(), "/out/callerDir does not exists to check if it is a directory."); } else { test:assertFail("Expected an error"); } - check (sftpClientEp)->delete("/rmdir.caller"); + check (sftpClientEp)->delete("/out/rmdir.caller"); } @test:Config {} public function testFileSizeWithCaller() returns error? { stream bStream = check io:fileReadBlocksAsStream(putFilePath, 5); - check (sftpClientEp)->put("/size.caller", bStream); + check (sftpClientEp)->put("/in/size.caller", bStream); runtime:sleep(3); test:assertEquals(fileSize, 11); - check (sftpClientEp)->delete("/size.caller"); + check (sftpClientEp)->delete("/out/size.caller"); } @test:Config { @@ -205,8 +215,8 @@ public function testMutableWatchEventWithCaller() returns error? { check 'listener.attach(watchEventService); check 'listener.start(); stream bStream = check io:fileReadBlocksAsStream(putFilePath, 5); - check (sftpClientEp)->put("/" + filename, bStream); + check (sftpClientEp)->put("/in/" + filename, bStream); runtime:sleep(3); test:assertEquals(addedFile, filename); - check (sftpClientEp)->delete("/" + filename); + check (sftpClientEp)->delete("/in/" + filename); } diff --git a/test-utils/src/main/java/io/ballerina/stdlib/ftp/testutils/mockServerUtils/MockFtpServer.java b/test-utils/src/main/java/io/ballerina/stdlib/ftp/testutils/mockServerUtils/MockFtpServer.java index 178a10086..838888411 100644 --- a/test-utils/src/main/java/io/ballerina/stdlib/ftp/testutils/mockServerUtils/MockFtpServer.java +++ b/test-utils/src/main/java/io/ballerina/stdlib/ftp/testutils/mockServerUtils/MockFtpServer.java @@ -207,6 +207,8 @@ public static Object initSftpServer(String resources) throws Exception { sftpServer = SshServer.setUpDefaultServer(); VirtualFileSystemFactory virtualFileSystemFactory = new VirtualFileSystemFactory(homeFolder.getAbsoluteFile().toPath()); + virtualFileSystemFactory.getDefaultHomeDir().resolve("in").toFile().mkdirs(); + virtualFileSystemFactory.getDefaultHomeDir().resolve("out").toFile().mkdirs(); sftpServer.setFileSystemFactory(virtualFileSystemFactory); sftpServer.setHost("localhost"); sftpServer.setPort(port); From a015df32491db77d2e6299de4d17f1a087f1aa28 Mon Sep 17 00:00:00 2001 From: Danesh Kuruppu Date: Tue, 17 Jun 2025 23:12:11 +0530 Subject: [PATCH 3/8] [Automated] Update the native jar versions --- ballerina/Ballerina.toml | 6 +++--- ballerina/CompilerPlugin.toml | 2 +- ballerina/Dependencies.toml | 28 +++++++++++++++++++++++++++- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/ballerina/Ballerina.toml b/ballerina/Ballerina.toml index 683963cf9..7ab291d27 100644 --- a/ballerina/Ballerina.toml +++ b/ballerina/Ballerina.toml @@ -1,7 +1,7 @@ [package] org = "ballerina" name = "ftp" -version = "2.13.1" +version = "2.13.2" authors = ["Ballerina"] keywords = ["FTP", "SFTP", "remote file", "file transfer", "client", "service"] repository = "https://github.com/ballerina-platform/module-ballerina-ftp" @@ -45,5 +45,5 @@ path = "./lib/commons-lang3-3.17.0.jar" [[platform.java21.dependency]] groupId = "io.ballerina.stdlib" artifactId = "ftp-native" -version = "2.13.1" -path = "../native/build/libs/ftp-native-2.13.1.jar" +version = "2.13.2" +path = "../native/build/libs/ftp-native-2.13.2-SNAPSHOT.jar" diff --git a/ballerina/CompilerPlugin.toml b/ballerina/CompilerPlugin.toml index 2206f7832..f4bf20dc7 100644 --- a/ballerina/CompilerPlugin.toml +++ b/ballerina/CompilerPlugin.toml @@ -3,4 +3,4 @@ id = "ftp-compiler-plugin" class = "io.ballerina.stdlib.ftp.plugin.FtpCompilerPlugin" [[dependency]] -path = "../compiler-plugin/build/libs/ftp-compiler-plugin-2.13.1.jar" +path = "../compiler-plugin/build/libs/ftp-compiler-plugin-2.13.2-SNAPSHOT.jar" diff --git a/ballerina/Dependencies.toml b/ballerina/Dependencies.toml index 8dd5d841c..85f84b722 100644 --- a/ballerina/Dependencies.toml +++ b/ballerina/Dependencies.toml @@ -7,11 +7,27 @@ dependencies-toml-version = "2" distribution-version = "2201.12.0" +[[package]] +org = "ballerina" +name = "file" +version = "1.11.0" +scope = "testOnly" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "os"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerina", packageName = "file", moduleName = "file"} +] + [[package]] org = "ballerina" name = "ftp" -version = "2.13.1" +version = "2.13.2" dependencies = [ + {org = "ballerina", name = "file"}, {org = "ballerina", name = "io"}, {org = "ballerina", name = "jballerina.java"}, {org = "ballerina", name = "lang.runtime"}, @@ -143,6 +159,16 @@ dependencies = [ {org = "ballerina", name = "jballerina.java"} ] +[[package]] +org = "ballerina" +name = "os" +version = "1.9.0" +scope = "testOnly" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"} +] + [[package]] org = "ballerina" name = "task" From cadf674c30babec5c12e7bab166425d72f503b4e Mon Sep 17 00:00:00 2001 From: Danesh Kuruppu Date: Tue, 17 Jun 2025 23:22:33 +0530 Subject: [PATCH 4/8] add file library to the test distribution --- build.gradle | 1 + gradle.properties | 1 + 2 files changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index e3089d31c..a05acf8d2 100644 --- a/build.gradle +++ b/build.gradle @@ -76,6 +76,7 @@ subprojects { ballerinaStdLibs "io.ballerina.stdlib:io-ballerina:${stdlibIoVersion}" ballerinaStdLibs "io.ballerina.stdlib:task-ballerina:${stdlibTaskVersion}" ballerinaStdLibs "io.ballerina.stdlib:time-ballerina:${stdlibTimeVersion}" + ballerinaStdLibs "io.ballerina.stdlib:file-ballerina:${stdlibFileVersion}" ballerinaStdLibs "io.ballerina.stdlib:observe-ballerina:${observeVersion}" ballerinaStdLibs "io.ballerina:observe-ballerina:${observeInternalVersion}" } diff --git a/gradle.properties b/gradle.properties index 482f20301..342ded8a4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -34,5 +34,6 @@ stdlibTaskVersion=2.7.0 stdlibLogVersion=2.12.0 stdlibIoVersion=1.8.0 stdlibTimeVersion=2.7.0 +stdlibFileVersion=1.12.0 observeVersion=1.5.0 observeInternalVersion=1.5.0 From 69c5aa5662eedfa7608a254eb4c4d5a84cbf8481 Mon Sep 17 00:00:00 2001 From: Danesh Kuruppu Date: Tue, 17 Jun 2025 23:38:29 +0530 Subject: [PATCH 5/8] [Automated] Update the native jar versions --- ballerina/Dependencies.toml | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/ballerina/Dependencies.toml b/ballerina/Dependencies.toml index 85f84b722..b760c9a2e 100644 --- a/ballerina/Dependencies.toml +++ b/ballerina/Dependencies.toml @@ -7,27 +7,11 @@ dependencies-toml-version = "2" distribution-version = "2201.12.0" -[[package]] -org = "ballerina" -name = "file" -version = "1.11.0" -scope = "testOnly" -dependencies = [ - {org = "ballerina", name = "io"}, - {org = "ballerina", name = "jballerina.java"}, - {org = "ballerina", name = "os"}, - {org = "ballerina", name = "time"} -] -modules = [ - {org = "ballerina", packageName = "file", moduleName = "file"} -] - [[package]] org = "ballerina" name = "ftp" version = "2.13.2" dependencies = [ - {org = "ballerina", name = "file"}, {org = "ballerina", name = "io"}, {org = "ballerina", name = "jballerina.java"}, {org = "ballerina", name = "lang.runtime"}, @@ -159,16 +143,6 @@ dependencies = [ {org = "ballerina", name = "jballerina.java"} ] -[[package]] -org = "ballerina" -name = "os" -version = "1.9.0" -scope = "testOnly" -dependencies = [ - {org = "ballerina", name = "io"}, - {org = "ballerina", name = "jballerina.java"} -] - [[package]] org = "ballerina" name = "task" From eba1094e0d8faa91aa1e8dae721f9fd0d8b5dfd5 Mon Sep 17 00:00:00 2001 From: Danesh Kuruppu Date: Tue, 17 Jun 2025 23:44:10 +0530 Subject: [PATCH 6/8] remove file dependency --- ballerina/tests/client_endpoint_test.bal | 2 -- build.gradle | 1 - changelog.md | 5 +++++ gradle.properties | 1 - 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ballerina/tests/client_endpoint_test.bal b/ballerina/tests/client_endpoint_test.bal index d91bdb611..b2dc7f068 100644 --- a/ballerina/tests/client_endpoint_test.bal +++ b/ballerina/tests/client_endpoint_test.bal @@ -19,7 +19,6 @@ import ballerina/test; import ballerina/lang.runtime as runtime; import ballerina/lang.'string as strings; import ballerina/log; -import ballerina/file; string filePath = "/home/in/test1.txt"; string nonFittingFilePath = "/home/in/test4.txt"; @@ -574,5 +573,4 @@ public function cleanTestEnvironment() returns error? { check (remoteServerListener).gracefulStop(); check (anonymousRemoteServerListener).gracefulStop(); check (secureRemoteServerListener).gracefulStop(); - check file:remove(check file:joinPath("tests", "resources", "datafiles", "out"), option = file:RECURSIVE); } diff --git a/build.gradle b/build.gradle index a05acf8d2..e3089d31c 100644 --- a/build.gradle +++ b/build.gradle @@ -76,7 +76,6 @@ subprojects { ballerinaStdLibs "io.ballerina.stdlib:io-ballerina:${stdlibIoVersion}" ballerinaStdLibs "io.ballerina.stdlib:task-ballerina:${stdlibTaskVersion}" ballerinaStdLibs "io.ballerina.stdlib:time-ballerina:${stdlibTimeVersion}" - ballerinaStdLibs "io.ballerina.stdlib:file-ballerina:${stdlibFileVersion}" ballerinaStdLibs "io.ballerina.stdlib:observe-ballerina:${observeVersion}" ballerinaStdLibs "io.ballerina:observe-ballerina:${observeInternalVersion}" } diff --git a/changelog.md b/changelog.md index e80f66f3c..df61d29e4 100644 --- a/changelog.md +++ b/changelog.md @@ -3,6 +3,11 @@ This file contains all the notable changes done to the Ballerina Email package t The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## unreleased + +### Fixed +- Fix the issue where the FTP listener stops working if the file name is the same. + ## [2.13.1] - 2025-04-23 ### Fixed diff --git a/gradle.properties b/gradle.properties index 342ded8a4..482f20301 100644 --- a/gradle.properties +++ b/gradle.properties @@ -34,6 +34,5 @@ stdlibTaskVersion=2.7.0 stdlibLogVersion=2.12.0 stdlibIoVersion=1.8.0 stdlibTimeVersion=2.7.0 -stdlibFileVersion=1.12.0 observeVersion=1.5.0 observeInternalVersion=1.5.0 From 6b55ba46f512e2a6990688891b965615586da0a3 Mon Sep 17 00:00:00 2001 From: Danesh Kuruppu Date: Wed, 18 Jun 2025 23:27:30 +0530 Subject: [PATCH 7/8] Update ballerina/tests/client_endpoint_test.bal Co-authored-by: Nuvindu Nirmana <63797478+Nuvindu@users.noreply.github.com> --- ballerina/tests/client_endpoint_test.bal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ballerina/tests/client_endpoint_test.bal b/ballerina/tests/client_endpoint_test.bal index b2dc7f068..927cc5b94 100644 --- a/ballerina/tests/client_endpoint_test.bal +++ b/ballerina/tests/client_endpoint_test.bal @@ -266,7 +266,7 @@ isolated function matchStreamContent(stream binary } } return matchedString == fullContent; -} +} @test:Config { dependsOn: [testPutLargeFileContent] From c73611c580fa3bd9f23b0eaec0784a0def9d7896 Mon Sep 17 00:00:00 2001 From: Danesh Kuruppu Date: Wed, 18 Jun 2025 23:30:19 +0530 Subject: [PATCH 8/8] Link the public issue --- changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index df61d29e4..83d96a007 100644 --- a/changelog.md +++ b/changelog.md @@ -6,7 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## unreleased ### Fixed -- Fix the issue where the FTP listener stops working if the file name is the same. +- [Fix the issue where the FTP listener stops working if the file name is the same](https://github.com/ballerina-platform/ballerina-library/issues/8035) ## [2.13.1] - 2025-04-23