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

Fix and extend Geotiff IFD handling to allow all integer types #1341

Merged
merged 4 commits into from
May 7, 2024

Conversation

WeatherGod
Copy link
Contributor

@WeatherGod WeatherGod commented May 6, 2024

Description of Changes

PR Checklist

  • Link to any issues that the PR addresses
  • Add labels
  • Open as a draft PR
    until ready for review
  • Make sure GitHub tests pass
  • Mark PR as "Ready for Review"

* Follows specs from pg. 15-16 of v6.0 TIFF:
  https://www.itu.int/itudoc/itu-t/com16/tiff-fx/docs/tiff6.pdf
* Added roundtrip tests of the private Geotiff method via reflection
* This does reveal an existing API flaw that will cause
  overflow of large unsigned integers
@WeatherGod
Copy link
Contributor Author

Was talking with a colleague about how I couldn't test private methods, which was needed to properly test out the fixes to read/writeIntValue, when they pointed me to Java reflection, which I never knew about.

Copy link
Member

@tdrwenski tdrwenski left a comment

Choose a reason for hiding this comment

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

Thanks for this PR @WeatherGod! I just had a comment about the use of reflection and some very minor style issues in the tests.

ByteOrder byteOrder = ByteOrder.BIG_ENDIAN;
buffer.order(byteOrder);

Method writeMethod =
Copy link
Member

Choose a reason for hiding this comment

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

I personally don't like this reflection solution for testing private methods. First, in general, private methods should not be tested, though I understand that in practice some classes would need big refactors to make the public API unit testable. Second, I think it makes the test harder to read. And finally, if someone were to rename writeIntValue, the compiler would not catch an issue here, you would just get NoSuchMethodException.

Is there any reasonable way to test the public API of GeoTiff instead? I am not as familiar with the code, so I am not sure how feasible this is. If not, I propose to make the method writeIntValue package private so you can test it without reflection. Also not a perfect solution, but I think it is slightly nicer.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Coming from python, the idea that one shouldn't test private methods is completely foreign to me. Unfortunately, with the way the GeoTiff class is designed, it would be difficult to not only construct the many geotiffs instances with the appropriate data types and ranges, but to then subsequently test that it was encoded correctly. The test would have a huge amount of unrelated setup that would make the test difficult to read and understand.

I am totally fine with changing it to be package private. We could even go a step further and make them static as they do not interact with any class members.

cdm/misc/src/test/java/ucar/nc2/geotiff/TestIFDEntry.java Outdated Show resolved Hide resolved
cdm/misc/src/test/java/ucar/nc2/geotiff/TestIFDEntry.java Outdated Show resolved Hide resolved
cdm/misc/src/test/java/ucar/nc2/geotiff/TestIFDEntry.java Outdated Show resolved Hide resolved
WeatherGod and others added 2 commits May 7, 2024 14:31
* This allows us to drop reflection in the TestIFDEntry tests
* Simplifies the test setup and execution
Copy link
Member

@tdrwenski tdrwenski left a comment

Choose a reason for hiding this comment

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

Looks good! Thanks!

@tdrwenski tdrwenski merged commit b05e193 into Unidata:maint-5.x May 7, 2024
10 checks passed
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.

None yet

2 participants