Skip to content

Conversation

@roadSurfer
Copy link

@roadSurfer roadSurfer commented Nov 24, 2023

This reverts the change from MENFORCER-364 as this led to a regressions with symbolic links.

The fundamental issue is that there is no clean way to deal with case-sensitivity as OSs can have multuple filesystems mounted that follow different rules. Thus the simple file.exists() is, despite the limitations, probably best. Those requiring more stringent checks writing their own handling.

Following this checklist to help us incorporate your
contribution quickly and easily:

  • Make sure there is a JIRA issue filed
    for the change (usually before you start working on it). Trivial changes like typos do not
    require a JIRA issue. Your pull request should address just this issue, without
    pulling in other changes.
  • Each commit in the pull request should have a meaningful subject line and body.
  • Format the pull request title like [MENFORCER-XXX] - Fixes bug in ApproximateQuantiles,
    where you replace MENFORCER-XXX with the appropriate JIRA issue. Best practice
    is to use the JIRA issue title in the pull request title and in the first line of the
    commit message.
  • Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
  • Run mvn clean verify to make sure basic checks pass. A more thorough check will
    be performed on your pull request automatically.
  • You have run the integration tests successfully (mvn -Prun-its clean verify).

If your pull request is about ~20 lines of code you don't need to sign an
Individual Contributor License Agreement if you are unsure
please ask on the developers list.

To make clear that you license your contribution under
the Apache License Version 2.0, January 2004
you have to acknowledge this by using the following check-box.

@slawekjaranowski
Copy link
Member

Ok, the simple file.exists() should be enough in normal usage ...

I only think - if we don't break and special cases ... but agree more complicated check should be done optionally or by next rule

By the way we can mention in documentation a way how file existence is checked to be clear.

@roadSurfer
Copy link
Author

I have added some words to the affected documentation on case-sensitivity, as well as some explic testing of symbolic links.

@Torbjorn-Svensson
Copy link

Are all the white space changes in the .md files intended?
As far as I know, some of the trailing white spaces are needed in order to not join the lines.

@roadSurfer
Copy link
Author

roadSurfer commented Nov 27, 2023 via email

@roadSurfer
Copy link
Author

That should be the whitepsace issues sorted. I also generated the site locally and it appeared OK to me.

This rule checks that the specified list of files do not exist.


The mounted filesystem(s) will dictate the case-sensitive rules when checking files. If you require checks that your
Copy link
Contributor

Choose a reason for hiding this comment

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

case-sensitivity

Copy link
Author

Choose a reason for hiding this comment

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

Updated



The mounted filesystem(s) will dictate the case-sensitive rules when checking files. If you require checks that your
filesystem(s) do not support (e.g. a case-sensitive check on a case-insensitive filesystem) then you should consider
Copy link
Contributor

Choose a reason for hiding this comment

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

delete "then you should"

Copy link
Author

Choose a reason for hiding this comment

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

Updated


The mounted filesystem(s) will dictate the case-sensitive rules when checking files. If you require checks that your
filesystem(s) do not support (e.g. a case-sensitive check on a case-insensitive filesystem) then you should consider
adding your own custom plugin that meets your specific needs.
Copy link
Contributor

Choose a reason for hiding this comment

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

your own --> a

Copy link
Author

Choose a reason for hiding this comment

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

Updated

This rule checks that the specified list of files exist.


The mounted filesystem(s) will dictate the case-sensitive rules when checking files. If you require checks that your
Copy link
Contributor

Choose a reason for hiding this comment

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

as above

Copy link
Author

Choose a reason for hiding this comment

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

Updated

Copy link
Contributor

Choose a reason for hiding this comment

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

case-sensitivity

Copy link
Author

Choose a reason for hiding this comment

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

Done. Apols.

This rule checks that the specified list of files exist and are within the specified size range.


The mounted filesystem(s) will dictate the case-sensitive rules when checking files. If you require checks that your
Copy link
Contributor

Choose a reason for hiding this comment

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

ditto

Copy link
Author

Choose a reason for hiding this comment

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

Updated

Copy link
Contributor

Choose a reason for hiding this comment

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

case-sensitivity

Copy link
Author

Choose a reason for hiding this comment

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

Done. Apols.

import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import static org.junit.jupiter.api.Assertions.*;
Copy link
Contributor

Choose a reason for hiding this comment

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

project style does not use wildcard imports

Copy link
Author

Choose a reason for hiding this comment

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

Updated, and in TestRequireFilesExist as well

}

@Test
void testFileDoesNotExist() throws EnforcerRuleException, IOException {
Copy link
Contributor

Choose a reason for hiding this comment

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

I don't understand this test. It checks that we create a file, delete it, and then that the file doesn't exist? Consider renamingi

Copy link
Author

@roadSurfer roadSurfer Jan 9, 2025

Choose a reason for hiding this comment

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

This seems to just be a minor variation on the original test code, but I can change the name.
What do you think "testDeletedFileDetected"?
I'll update the symbolic link test to follow a similar format.

There is also "testFileDoesNotExistSatisfyAny", which is original code.

Copy link
Contributor

Choose a reason for hiding this comment

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

yes, renaming is a good idea

Copy link
Author

Choose a reason for hiding this comment

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

Please give me a format of the new method name you'd prefer and I will ensure that all test...Exists and test...DoesNotExist methods are updated in all test classes.
Such a change will affect TestRequireFilesSize, TestRequireFileChecksum TestRequireFilesDontExist, and TestRequireFilesExist; this means touching classes that are unrelated to the bug fix in order to ensure naming consistency.

To be clear, I disagree with this but it is not my project and so I will follow your direction.

Copy link
Contributor

Choose a reason for hiding this comment

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

Don't change other methods not related to this PR. keep the PR focused.

Copy link
Author

Choose a reason for hiding this comment

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

But that means this TestRequireFilesDontExist class will be following a different naming convention to the other classes. I don't follow why that is a good idea, I merely followed the convention that was already in place.

Copy link
Contributor

Choose a reason for hiding this comment

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

Better 9 wrong and 1 right than 10 wrong. That's the fundamental principle.

Copy link
Author

@roadSurfer roadSurfer Jan 29, 2025

Choose a reason for hiding this comment

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

What should the new names be?

  • testFileDoesNotExist -> testDeletedFileDetected
  • testSymbolicLinkDoesNotExist -> testSymbolicLinDeletedDetected
  • testSymbolicLinkTargetDoesNotExist -> testSymbolicLinkTargetDeletedDetected
  • testFileDoesNotExistSatisfyAny -> testDeletedFileDetectedSatisfyAny

Copy link
Contributor

Choose a reason for hiding this comment

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

testSymbolicLinkDeletedDetected (spelling) but otherwise sounds good

Copy link
Author

Choose a reason for hiding this comment

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

Done


linkFile.delete();
rule.execute();
} finally {
Copy link
Contributor

Choose a reason for hiding this comment

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

can we use try with resources for this?

Copy link
Author

Choose a reason for hiding this comment

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

I don;'t think so, isn't that just for autoclosables?

Copy link
Author

Choose a reason for hiding this comment

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

Looking at other tests, it does not seem to be project standard to ensure tests delete files they create; I could just remove the try block entirely in that case.

Copy link
Contributor

Choose a reason for hiding this comment

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

I think the temporary folder rule should take care of that

Copy link
Author

Choose a reason for hiding this comment

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

OK

rule.setFilesList(Collections.singletonList(linkFile));

try {
rule.execute();
Copy link
Contributor

Choose a reason for hiding this comment

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

no exception is a pass?

Copy link
Author

Choose a reason for hiding this comment

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

Correct. This whole class it basically the inverse of TestRequireFilesExist.

boolean checkFile(File file) {
// if we get here and the handle is null, treat it as a success
return file == null ? true : file.exists() && osIndependentNameMatch(file, true);
return file == null ? true : file.exists();
Copy link
Contributor

Choose a reason for hiding this comment

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

IMHO

return file == null || file.exists()

is clearer, but up to you

Copy link
Author

Choose a reason for hiding this comment

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

Old habits die hard. :-)

This rule checks that the specified list of files exist.


The mounted filesystem(s) will dictate the case-sensitive rules when checking files. If you require checks that your
Copy link
Contributor

Choose a reason for hiding this comment

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

case-sensitivity

This rule checks that the specified list of files exist and are within the specified size range.


The mounted filesystem(s) will dictate the case-sensitive rules when checking files. If you require checks that your
Copy link
Contributor

Choose a reason for hiding this comment

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

case-sensitivity


linkFile.delete();
rule.execute();
} finally {
Copy link
Contributor

Choose a reason for hiding this comment

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

I think the temporary folder rule should take care of that


f.delete();

assertFalse(f.exists());
Copy link
Contributor

Choose a reason for hiding this comment

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

I think my confusion is that this is the only assert. It should be changed to an assumeFalse or removed.

Copy link
Author

Choose a reason for hiding this comment

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

This is a quick negative check to ensure the file is detected and the test does not pass by fluke. It is consistent with checks in the other tests (throws an exception with a message).

And I am sorry, but I do no understand how assumeFalse is helpful here. If the file is not detected as being present and an exception thrown with a message, then that should be a hard failure as the rule is not working according to spec.

I can see a mix of checkin/not-checking for an unexpected exception, I can add and explicit check for one and add a fail if you would like? I don't think it would be appropriate to update every test though, just one directly required by this fix.

Copy link
Contributor

Choose a reason for hiding this comment

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

Test setup failure does not mean the test failed. It means the test wasn't run. That's the difference between assume and assert. JUnit reports these two cases differently.

Copy link
Author

Choose a reason for hiding this comment

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

Done

Copy link
Contributor

Choose a reason for hiding this comment

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

The wrong one was changed. Line 122 should be changed or better yet deleted. The point of the test is not whether f.delete() succeeds. You're not testing the delete method in java.io.File.

Copy link
Author

Choose a reason for hiding this comment

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

Done

}

@Test
void testFileDoesNotExist() throws EnforcerRuleException, IOException {
Copy link
Contributor

Choose a reason for hiding this comment

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

yes, renaming is a good idea


Require Files Don't Exist

This rule checks that the specified list of files do not exist.
Copy link
Contributor

Choose a reason for hiding this comment

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

delete "list of"

Copy link
Author

Choose a reason for hiding this comment

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

Done

This rule checks that the specified list of files do not exist.


The mounted filesystem(s) will dictate the case-sensitivity rules when checking files. If checks are required that
Copy link
Contributor

Choose a reason for hiding this comment

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

delete "mounted" and consider getting rid of the parentheses or just changing this to "The filesystem" as is every file is on a single filesystem.

Copy link
Author

Choose a reason for hiding this comment

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

Done


Require Files Exist

This rule checks that the specified list of files exist.
Copy link
Contributor

Choose a reason for hiding this comment

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

ditto

Copy link
Author

Choose a reason for hiding this comment

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

Done


This rule checks that the specified list of files exist and are within the specified size range.

The mounted filesystem(s) will dictate the case-sensitivity rules when checking files. If you require checks that your
Copy link
Contributor

Choose a reason for hiding this comment

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

ditto

Copy link
Author

Choose a reason for hiding this comment

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

Done


// Check the file is detected as being present
EnforcerRuleException e = assertThrows(EnforcerRuleException.class, rule::execute);
assumeFalse(e.getMessage() == null);
Copy link
Contributor

Choose a reason for hiding this comment

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

This should be an assertNotNull

Copy link
Author

Choose a reason for hiding this comment

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

Akready sorted based on earlier comment


f.delete();

assertFalse(f.exists());
Copy link
Contributor

Choose a reason for hiding this comment

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

The wrong one was changed. Line 122 should be changed or better yet deleted. The point of the test is not whether f.delete() succeeds. You're not testing the delete method in java.io.File.

rule.setFilesList(Collections.singletonList(linkFile));
// Check the link is detected as being present
EnforcerRuleException e = assertThrows(EnforcerRuleException.class, rule::execute);
assumeFalse(e.getMessage() == null);
Copy link
Contributor

Choose a reason for hiding this comment

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

assertNotNull

Copy link
Author

Choose a reason for hiding this comment

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

Done


// Check the target is detected as being present
EnforcerRuleException e = assertThrows(EnforcerRuleException.class, rule::execute);
assumeFalse(e.getMessage() == null);
Copy link
Contributor

Choose a reason for hiding this comment

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

assertNotNull

Copy link
Author

Choose a reason for hiding this comment

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

Done

try {
rule.execute();
fail("Should have received an exception");
} catch (Exception e) {
Copy link
Contributor

Choose a reason for hiding this comment

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

which exception should be thrown here? Be specific.

Copy link
Author

Choose a reason for hiding this comment

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

Done

@jira-importer
Copy link

Resolve #501

1 similar comment
@jira-importer
Copy link

Resolve #501

@slawekjaranowski slawekjaranowski added the waiting-for-feedback Waiting for 90 days until issues or pull request will be closed label Jun 17, 2025
@github-actions
Copy link

This pull request is stale because it has been waiting for feedback for 60 days. Remove the stale label or comment on this PR, or it will be automatically closed in 30 days.

@github-actions github-actions bot added the Stale label Aug 17, 2025
@github-actions
Copy link

This pull request has been closed because no response was received within 90 days.

@github-actions github-actions bot closed this Sep 17, 2025
@jemischi
Copy link

Please finish this patch-request. :)

@github-actions github-actions bot removed waiting-for-feedback Waiting for 90 days until issues or pull request will be closed Stale labels Jan 13, 2026
@roadSurfer
Copy link
Author

Please finish this patch-request. :)

As far as I am aware, I made good all the required changes. I do not believe it is for me to mark things as "Resolved" but for the person who raised the issue or another team member.

@slawekjaranowski - Who are you awaiting feedback from? I do not believe it to be me.

@elharo elharo reopened this Jan 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants