Skip to content

isValidImageFilename throws java.lang.IllegalArgumentException #596

Open
@annguyen1291

Description

@annguyen1291

In API/src/main/java/org/sikuli/script/Image.java, there is this method

public static boolean isValidImageFilename(String fname) {
    String validEndings = ".png.jpg.jpeg";
    String ending = FilenameUtils.getExtension(fname);
    return !ending.isEmpty() && validEndings.contains(ending.toLowerCase());
}

If the fname contains any forbidden characters (e.g. colon for Windows), the method will throw IllegalArgumentException but there is nothing to catch it. This issue affects commonly used methods like wait, find, click, type, etc. You can reproduce the bug by simply add the follow codes anywhere.

wait("Account Number: ")

I would propose to change the method to the follows.

public static boolean isValidImageFilename(String fname) {
    String validEndings = ".png.jpg.jpeg";
    String ending = "";
    try {
        ending = FilenameUtils.getExtension(fname);
    } catch(IllegalArgumentException e) {
        return false;
    }
    return !ending.isEmpty() && validEndings.contains(ending.toLowerCase());
}

I have created a pull request to fix the issue.
#597

Here is an example of the error log.

PS C:\Users\anguyen\tests.desktop> mvn clean test
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------< SilverLake.SilverLakeTest:desktop >------------------
[INFO] Building desktop 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ desktop ---
[INFO] Deleting C:\Users\anguyen\tests.desktop\target
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ desktop ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\Users\anguyen\tests.desktop\src\main\resources
[INFO]
[INFO] --- compiler:3.11.0:compile (default-compile) @ desktop ---
[INFO] No sources to compile
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ desktop ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 5 resources from src\test\resources to target\test-classes
[INFO]
[INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ desktop ---
[INFO] Changes detected - recompiling the module! :source
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent!
[INFO] Compiling 15 source files with javac [debug target 17] to target\test-classes
[INFO]
[INFO] --- surefire:3.1.2:test (default-test) @ desktop ---
[INFO] Using auto detected provider org.apache.maven.surefire.testng.TestNGProvider
[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running TestSuite
[error] Mouse: not useable (blocked)
Sep 08, 2023 1:35:36 PM io.appium.java_client.remote.AppiumCommandExecutor$1 lambda$0
INFO: Detected dialect: OSS
[log] CLICK on L[61,121]@S(0) (555 msec)
[log] CLICK on L[224,241]@S(0) (549 msec)
[log] CLICK on L[695,230]@S(0) (548 msec)
[log]  TYPE "222600"
[error] Mouse.move(): Mouse not useable (blocked)
java.lang.IllegalArgumentException: NTFS ADS separator (':') in file name is forbidden.
        at org.apache.commons.io.FilenameUtils.indexOfExtension(FilenameUtils.java:737)
        at org.apache.commons.io.FilenameUtils.getExtension(FilenameUtils.java:1057)
        at org.sikuli.script.Image.isValidImageFilename(Image.java:751)
        at org.sikuli.script.Image.createImageValidate(Image.java:737)
        at org.sikuli.script.Image.create(Image.java:662)
        at org.sikuli.script.Element.getImageFromTarget(Element.java:378)
        at org.sikuli.script.Region$RepeatableFind.<init>(Region.java:3040)
        at org.sikuli.script.Region.wait(Region.java:2181)
        at org.sikuli.script.Region.waitText(Region.java:2698)
        at Pages.SikulixBasePage.waitText(SikulixBasePage.java:26)
        at Pages.SilverLake.GeneralLedgerInquiryPage.assertGLDownload(GeneralLedgerInquiryPage.java:62)
        at Tests.SilverLake.GeneralLedgerInquiryTest.createGLDownload(GeneralLedgerInquiryTest.java:14)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139)
        at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:664)
        at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:227)
        at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
        at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:957)
        at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:200)
        at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:148)
        at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
        at org.testng.TestRunner.privateRun(TestRunner.java:848)
        at org.testng.TestRunner.run(TestRunner.java:621)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:443)
        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:437)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:397)
        at org.testng.SuiteRunner.run(SuiteRunner.java:336)
        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1280)
        at org.testng.TestNG.runSuitesLocally(TestNG.java:1200)
        at org.testng.TestNG.runSuites(TestNG.java:1114)
        at org.testng.TestNG.run(TestNG.java:1082)
        at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:308)
        at org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:71)
        at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:113)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
        at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
        at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 80.86 s <<< FAILURE! -- in TestSuite
[ERROR] Tests.SilverLake.GeneralLedgerInquiryTest.createGLDownload -- Time elapsed: 64.19 s <<< FAILURE!
java.lang.NullPointerException: Cannot invoke "org.sikuli.script.Match.grow()" because the return value of "Pages.SilverLake.GeneralLedgerInquiryPage.waitText(String, int)" is null
        at Pages.SilverLake.GeneralLedgerInquiryPage.assertGLDownload(GeneralLedgerInquiryPage.java:62)
        at Tests.SilverLake.GeneralLedgerInquiryTest.createGLDownload(GeneralLedgerInquiryTest.java:14)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139)
        at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:664)
        at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:227)
        at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
        at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:957)
        at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:200)
        at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:148)
        at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
        at org.testng.TestRunner.privateRun(TestRunner.java:848)
        at org.testng.TestRunner.run(TestRunner.java:621)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:443)
        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:437)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:397)
        at org.testng.SuiteRunner.run(SuiteRunner.java:336)
        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1280)
        at org.testng.TestNG.runSuitesLocally(TestNG.java:1200)
        at org.testng.TestNG.runSuites(TestNG.java:1114)
        at org.testng.TestNG.run(TestNG.java:1082)
        at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:308)
        at org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:71)
        at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:113)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
        at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
        at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)

[INFO]
[INFO] Results:
[INFO]
[ERROR] Failures:
[ERROR]   GeneralLedgerInquiryTest.createGLDownload:14 » NullPointer Cannot invoke "org.sikuli.script.Match.grow()" because the return value of "Pages.SilverLake.GeneralLedgerInquiryPage.waitText(String, int)" is null
[INFO]
[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:26 min
[INFO] Finished at: 2023-09-08T13:36:41-05:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.1.2:test (default-test) on project desktop: There are test failures.
[ERROR]
[ERROR] Please refer to C:\Users\anguyen\tests.desktop\target\surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
PS C:\Users\anguyen\tests.desktop>

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions