Skip to content

Fix some internal errors in filters from invalid input.#1476

Merged
dylanahsmith merged 1 commit intomasterfrom
improve-std-filter-permutation-test
Feb 24, 2022
Merged

Fix some internal errors in filters from invalid input.#1476
dylanahsmith merged 1 commit intomasterfrom
improve-std-filter-permutation-test

Conversation

@dylanahsmith
Copy link
Copy Markdown
Contributor

Problem

While reviewing #1422 I noticed that StandardFilters#test_all_filters_never_raise_non_liquid_exception was doing a lot of redundant work and started to change it to make it more scalable and general. In the process, I noticed that it also wasn't passing in a default argument, which prevented it from finding some code paths that could result in internal errors.

Solution

I used Array#repeated_permutation in StandardFilters#test_all_filters_never_raise_non_liquid_exception so it would test permutations in proportion to the arity of the filter. If the filter method takes optional arguments, then pass in an optional argument in addition to the required arguments.

This uncovered a few errors:

  • there were a some ary.first.respond_to?(:[]) checks which assumed the array had elements of a homogenous type, which could result in an internal error if the first argument responded to [] but a following one didn't. I added a rescue NoMethodError to handle these errors.
  • Sorting could have an error from comparing incompatible types. I added a fast path for elements that are comparable and added an extra else case for when neither incomparable items are nil to explicitly raise a liquid error.

Note that I haven't actually checked if these internal errors are happening in practice.

nil
end
end
(@filters.public_methods - Object.public_methods).each do |method|
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think you could use public_methods(false) to only get the methods on the receiver:

Suggested change
(@filters.public_methods - Object.public_methods).each do |method|
@filters.public_methods(false).each do |method|

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@filters.public_methods(false) would return [] since @filters is an instance of a class that includes the StandardFilters module. However, we could use StandardFilters.public_instance_methods(false) to get those methods directly. I tested (@filters.public_methods - Object.public_instance_methods) == StandardFilters.public_instance_methods(false) locally and it returns true

These fixes came from improving the corresponding test, so these might not
actually be causing problems in practice.
@dylanahsmith dylanahsmith force-pushed the improve-std-filter-permutation-test branch from 37850fc to 0912f68 Compare February 24, 2022 14:16
@dylanahsmith dylanahsmith merged commit 0d5e01a into master Feb 24, 2022
@dylanahsmith dylanahsmith deleted the improve-std-filter-permutation-test branch February 24, 2022 14:17
mtasaka added a commit to mtasaka/liquid that referenced this pull request Nov 26, 2023
Ruby returns 0 (not nil) for nil <=> nil, i.e. nil and nil are judged
as equal for comparison, and so returns nil_safe_compare .
ref: Shopify#1476

To make the behavior of nil_safe_casecmp consistent with
nil_safe_compare , change nil_safe_casecmp so that comparison between
nil <=> nil return 0 (equal).

Also change testsuite to reflect this change.

Fixes Shopify#1759 .
mtasaka added a commit to mtasaka/liquid that referenced this pull request Dec 15, 2023
Ruby returns 0 (not nil) for nil <=> nil, i.e. nil and nil are judged
as equal for comparison, and so returns nil_safe_compare .
ref: Shopify#1476

To make the behavior of nil_safe_casecmp consistent with
nil_safe_compare , change nil_safe_casecmp so that comparison between
nil <=> nil return 0 (equal).

Also change testsuite to reflect this change.

Fixes Shopify#1759 .
andrykonchin pushed a commit to andrykonchin/liquid that referenced this pull request Feb 24, 2025
Ruby returns 0 (not nil) for nil <=> nil, i.e. nil and nil are judged
as equal for comparison, and so returns nil_safe_compare .
ref: Shopify#1476

To make the behavior of nil_safe_casecmp consistent with
nil_safe_compare , change nil_safe_casecmp so that comparison between
nil <=> nil return 0 (equal).

Also change testsuite to reflect this change.

Fixes Shopify#1759 .
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.

2 participants