base: Test no event when symlink target dir is created on Linux/ChromeOS
Linux와 ChromeOS에서 존재하지 않는 파일을 심볼릭 링크 경로로 감시할 때,
링크의 대상 디렉터리만 생성하면 FilePathWatcher 이벤트가 발생하지 않는 동작을
테스트로 명시했습니다.
문제 설명
FilePathWatcherTest.LinkedDirectoryPart2는 다음 순서로 심볼릭 링크가 포함된
경로의 감시 동작을 검증합니다.
- 아직 존재하지 않는
dir을 가리키는 심볼릭 링크dir.lnk를 만듭니다. - 존재하지 않는
dir.lnk/file을 감시합니다. - 링크의 대상 디렉터리인
dir을 만듭니다. - 이후
dir/file의 생성, 수정, 삭제 이벤트를 확인합니다.
기존 테스트에는 3번에서 이벤트가 발생하지 않아야 한다는 TODO만 있었고,
실제 검증은 없었습니다.
Linux와 ChromeOS의 inotify 구현은 감시 경로의 중간 디렉터리가 생성되면 watch
목록을 갱신하지만, 사용자 콜백은 최종 감시 대상이 존재할 때만 호출합니다.
if (target_changed || (change_on_target_path && deleted) ||
(change_on_target_path && created && PathExists(target_))) {
// ...
callback_.Run(...);
}이 시점에는 target_인 dir.lnk/file이 아직 존재하지 않으므로PathExists(target_)가 거짓이며 이벤트가 보고되지 않습니다.
해결 내용
TODO 주석을 SpinAndExpectNoEvents() 호출로 교체하여 대상 디렉터리 생성 뒤
콜백 이벤트가 발생하지 않는 동작을 명시적으로 검증했습니다.
ASSERT_TRUE(CreateDirectory(dir));
-// TODO(crbug.com/40263777): Expect that no events are fired.
+delegate.SpinAndExpectNoEvents();SpinAndExpectNoEvents()는 비동기 이벤트가 도착할 시간을 주기 위해 이벤트 루프를
잠시 실행한 뒤, delegate가 받은 이벤트 목록이 비어 있는지 확인합니다.
이어지는 파일 생성, 수정, 삭제 검증은 그대로 유지되어 대상 디렉터리를 만든 뒤
watch 목록이 정상적으로 재구성되고 실제 대상 파일의 변경은 계속 보고되는 것도
확인합니다.
테스트 방법
Ubuntu 22.04에서 다음 단위 테스트를 실행해 통과하는 것을 확인했습니다.
base_unittests --gtest_filter=FilePathWatcherTest.LinkedDirectoryPart2Gerrit LUCI dry run과 제출 전 전체 CQ도 통과했으며, CL은 Chromium main에
병합되었습니다.
배운 점
- inotify watch 목록의 갱신과 사용자에게 전달되는 변경 이벤트는 별개의 동작이며,
중간 경로가 생성되어 watch가 재구성되더라도 최종 감시 대상이 없으면 콜백이
발생하지 않을 수 있음을 배웠습니다. - 이벤트가 없어야 하는 비동기 동작은 즉시 목록을 검사하는 대신 이벤트가 처리될
시간을 준 뒤 수신 목록이 비어 있는지 검증해야 안정적으로 테스트할 수 있음을
배웠습니다. - 기존 TODO를 제거할 때는 단순히 현재 구현을 확인하는 데 그치지 않고, 이후 동작
변경을 감지할 수 있는 회귀 테스트로 기대 동작을 남겨야 함을 배웠습니다.