Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[java] Fix SpotBugs bugs in the Selenium manager #14608

Merged
merged 2 commits into from
Nov 15, 2024

Conversation

mk868
Copy link
Contributor

@mk868 mk868 commented Oct 16, 2024

User description

Description

As described in this comment, SpotBugs found some additional bugs in the code.
In this PR I fix part of the found problems.

SpotBugs errors:

M D SF: Switch statement found in org.openqa.selenium.manager.SeleniumManagerOutput$Log.fromJson(JsonInput) where default case is missing  At SeleniumManagerOutput.java:[lines 76-99]
M D NP: Possible null pointer dereference in org.openqa.selenium.manager.SeleniumManager.getBinary() due to return value of called method  Dereferenced at SeleniumManager.java:[line 212]
M B RV: Exceptional return value of java.io.File.mkdirs() ignored in org.openqa.selenium.manager.SeleniumManager.getBinary()  At SeleniumManager.java:[line 212]

Solutions:

  • Add the missing default branch to the switch to skip reading JSON value, this practice is common elsewhere: BiDiSessionStatus#fromJson(JsonInput), ConsoleLogEntry#fromJson(JsonInput), ...
  • Add exclusion for NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE to ignore potential null value from the binary.getParent() call - SpotBugs exclusion for getParent call is common, for example for org.openqa.selenium.firefox.FirefoxBinary
  • Replace path.toFile().mkdirs() with Files.createDirectories(path) - use of Files.createDirectories is common in the code base, so it is consistent

Motivation and Context

Fixing the actual problems is necessary before enabling full SpotBugs analysis, in order to not break the build.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist

  • I have read the contributing document.
  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • I have added tests to cover my changes.
  • All new and existing tests passed.

PR Type

Bug fix


Description

  • Improved error handling in SeleniumManager by replacing mkdirs() with Files.createDirectories().
  • Added a default case to the switch statement in SeleniumManagerOutput.fromJson to handle unexpected JSON values.
  • Updated SpotBugs exclusions to ignore potential null pointer dereference warnings in SeleniumManager.

Changes walkthrough 📝

Relevant files
Bug fix
SeleniumManager.java
Improve directory creation error handling in SeleniumManager

java/src/org/openqa/selenium/manager/SeleniumManager.java

  • Replaced mkdirs() with Files.createDirectories() for better error
    handling.
  • Ensured directories are created before copying files.
  • +1/-1     
    SeleniumManagerOutput.java
    Add default case to switch statement in fromJson                 

    java/src/org/openqa/selenium/manager/SeleniumManagerOutput.java

  • Added a default case to the switch statement in fromJson.
  • Ensured JSON values are skipped if not explicitly handled.
  • +4/-0     
    Configuration changes
    spotbugs-excludes.xml
    Update SpotBugs exclusions for SeleniumManager                     

    java/spotbugs-excludes.xml

  • Added exclusion for NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE.
  • Updated SpotBugs filter to ignore specific null pointer warnings.
  • +5/-0     

    💡 PR-Agent usage: Comment /help "your question" on any pull request to receive relevant information

    Copy link
    Contributor

    PR Reviewer Guide 🔍

    Here are some key observations to aid the review process:

    ⏱️ Estimated effort to review: 2 🔵🔵⚪⚪⚪
    🧪 No relevant tests
    🔒 No security concerns identified
    ⚡ Recommended focus areas for review

    Error Handling
    Verify that the error handling for Files.createDirectories() is sufficient. Consider adding specific exception handling or logging for directory creation failures.

    Switch Statement
    Ensure that the new default case in the switch statement doesn't hide any potential issues. Verify if any important cases are missing or if the default behavior is appropriate for all unhandled cases.

    SpotBugs Exclusion
    Validate if excluding NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE for SeleniumManager is the best approach. Consider if there's a way to handle the potential null value without suppressing the warning.

    Copy link
    Contributor

    PR Code Suggestions ✨

    Explore these optional code suggestions:

    CategorySuggestion                                                                                                                                    Score
    Possible issue
    Add a null check for the input stream to prevent potential NullPointerException

    Consider adding a null check for inputStream before attempting to copy it to avoid
    potential NullPointerException.

    java/src/org/openqa/selenium/manager/SeleniumManager.java [211-214]

     try (InputStream inputStream = this.getClass().getResourceAsStream(binaryPathInJar)) {
    +  if (inputStream == null) {
    +    throw new IOException("Resource not found: " + binaryPathInJar);
    +  }
       Files.createDirectories(binary.getParent());
       Files.copy(inputStream, binary);
     }
    • Apply this suggestion
    Suggestion importance[1-10]: 9

    Why: The suggestion addresses a critical issue by adding a null check for the input stream, which prevents a potential NullPointerException. This enhances the robustness and reliability of the code, especially when dealing with external resources.

    9
    Enhancement
    Use an enum for switch cases to improve type safety and maintainability

    Consider using an enum for the switch cases instead of string literals to improve
    type safety and maintainability.

    java/src/org/openqa/selenium/manager/SeleniumManagerOutput.java [95-105]

    -switch (name) {
    -  case "level":
    +enum LogField {
    +  LEVEL, TIMESTAMP, MESSAGE
    +}
    +
    +switch (LogField.valueOf(name.toUpperCase())) {
    +  case LEVEL:
         level = input.nextString();
         break;
     
    -  case "timestamp":
    +  case TIMESTAMP:
         timestamp = input.nextNumber().longValue();
         break;
     
    -  case "message":
    +  case MESSAGE:
         message = input.nextString();
         break;
     
       default:
         input.skipValue();
         break;
     }
    • Apply this suggestion
    Suggestion importance[1-10]: 7

    Why: Using an enum for switch cases improves type safety and maintainability by reducing the risk of errors from string literals. This suggestion enhances the code's structure and readability, making it easier to manage and extend.

    7

    💡 Need additional feedback ? start a PR chat

    @mk868 mk868 force-pushed the fix-SeleniumManager branch from c4ca319 to c363bd9 Compare October 16, 2024 17:20
    @VietND96 VietND96 requested a review from bonigarcia October 16, 2024 17:22
    @mk868 mk868 force-pushed the fix-SeleniumManager branch from cbb17e4 to 675447a Compare October 22, 2024 11:38
    @mk868 mk868 force-pushed the fix-SeleniumManager branch from 675447a to 6c2a3aa Compare November 14, 2024 08:30
    @mk868 mk868 changed the title [java] Fix SpotBugs bugs in manager [java] Fix SpotBugs bugs in the Selenium manager Nov 14, 2024
    @mk868
    Copy link
    Contributor Author

    mk868 commented Nov 14, 2024

    Hello,

    Are there any updates regarding this PR?
    If necessary, I can split these changes into separate PRs - one for each SpotBugs issue

    @VietND96 VietND96 requested a review from pujagani November 15, 2024 01:50
    @pujagani pujagani removed their request for review November 15, 2024 03:32
    @pujagani
    Copy link
    Contributor

    Hey! I think it looks good to me. There was a failing test for re-running the CI. It should be good to go once that is sorted.

    Copy link
    Member

    @bonigarcia bonigarcia left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    LGTM as well

    @pujagani pujagani merged commit be8fc7e into SeleniumHQ:trunk Nov 15, 2024
    33 of 34 checks passed
    @mk868 mk868 deleted the fix-SeleniumManager branch November 15, 2024 20:48
    jkim2492 pushed a commit to jkim2492/selenium that referenced this pull request Nov 17, 2024
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Projects
    None yet
    Development

    Successfully merging this pull request may close these issues.

    4 participants