У меня есть более общее требование отслеживать изменения в файлах активов, которые зафиксированы в исходном коде и развернуты внутри двоичных файлов, но сейчас я реализую его в контексте модульного тестирования и сталкиваюсь с потенциальной проблемой на будущее. Прежде чем задать вопрос TLDR, я покажу много контекстной информации.
Сценарий
Некоторые ресурсы приложения загружаются из файлов CSV, сохраненных в Git-репозитории через ClasspathResource
[1], и они могут когда-нибудь измениться. Изменение происходит при фиксации, но для приложения во время выполнения изменение происходит в разных версиях приложения.
Мой тестовый раствор
Я реализовал следующий механизм, чтобы предупредить меня об изменениях в ресурсе:
@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
. Эта конфигурация подходит для работы с исходным кодом.
Так что мне нужно проверить, не изменился ли файл ресурса разумным способом, который позволяет блоку изменять / переинтерпретировать окончания строк. Это особенно верно для приложения времени выполнения, которое будет хранить хэш файла и сравнивать фактический файл активов (который мог измениться), выполняя корректирующие действия при различиях ==> перезагрузки активов.
TL; DR
Учитывая текстовый файл, из которого я могу извлечь и сохранить любой хэш (не только криптографический, я использовал MD5), как я могу сказать, что он изменился независимо от среды, в которой обрабатывается файл, какой может изменить окончания строки?
Примечание
У меня есть требование не использовать систему управления версиями в самом активе (например, первая строка имеет инкрементную версию, поскольку разработчики не смогут корректно обновлять).
[1] Обертывание инструмента для пружинных рамок Class.getResourceAsStream