对于跟踪提交到源代码并部署在二进制文件中的资产文件中的更改,我有一个更一般的要求,但是目前,我正在单元测试环境中实现它,并面临未来的潜在问题。在问TLDR问题之前,我将展示很多上下文信息。
场景
一些应用程序资产是通过ClasspathResource
[1]从提交到git存储库的CSV文件中加载的,它们有时可能会更改。更改跨提交进行,但是对于运行时应用程序,更改跨应用程序的不同版本进行。
我的测试解决方案
我实现了以下机制来提醒我有关资源的更改:
@Before
public void setUp() throws Exception
{
assertEquals("Resource file has changed. Make sure the test reflects the changes in the file and update the checksum", MD5_OF_FILE,
DigestUtils.md5Hex(new ClassPathResource("META-INF/resources/assets.csv").getInputStream()));
}
基本上,我希望单元测试失败,直到我明确编码文件的校验和为止。运行md5sum assets.txt
时,我将结果硬编码到代码中,以便测试知道它们正在使用文件的固定版本。
问题
我在自己的Windows盒子上运行了测试,并且像一个超级按钮一样工作。切换到Linux,我发现它们失败了。我立刻意识到这可能是由于行尾,我完全忘记了。
在特定情况下,Git配置为提交文件LF
,但检出(在Windows中)CRLF
。此配置对于使用源代码是合理的。
因此,我需要检查资产文件是否以一种聪明的方式更改了,该方式允许框更改/重新解释行尾。对于将存储文件哈希并比较实际资产文件(可能已更改),对差异执行纠正措施==>重新加载资产的运行时应用程序而言,尤其如此。
给出一个文本文件,我可以提取并存储任何哈希(不只是密码,我使用了MD5),我如何确定它已无论环境如何发生了变化,哪个可以修改行尾?
注意 我要求不要在资产本身中使用版本控制系统(例如,第一行具有增量版本,因为开发人员将无法正确更新)。
[1] Spring框架工具包装Class.getResourceAsStream
答案 0 :(得分:-1)
一种解决方案可能是将文件规范化为选定的行尾,即始终为CRLF
或始终为LF
,然后根据该规范化内容计算密码哈希。
例如计算md5sum | dos2unix file
并在代码中使用适当的Stream
来动态规范文件