base: Test no event for directory touch on Windows

MERGED2026basetesting
2026. 8. 15.parkhojeong 프로필 이미지parkhojeong

Windows에서 재귀적으로 감시 중인 디렉터리를 touch해도
FilePathWatcher 이벤트가 전달되지 않는 동작을 테스트로 검증했습니다.

문제 설명

FilePathWatcherTest.RecursiveWatch는 Windows에서 디렉터리를 touch하는 코드가
실행되지 않아, Windows의 FilePathWatcher 동작을 검증하지 못하고 있었습니다.

Windows의 FilePathWatcher는 디렉터리에 대한 FILE_ACTION_MODIFIED 알림을
필터링하므로, 감시 중인 디렉터리를 touch해도 콜백 이벤트가 발생하지 않아야
합니다.

해결 내용

Windows에서도 감시 중인 디렉터리에 TouchFile()을 호출하도록 테스트를
변경했습니다.

Windows에서는 기대 이벤트를 추가하지 않은 상태로 이벤트 루프를 진행하여,
새로운 콜백 이벤트가 발생하지 않는 것을 검증했습니다.

 // Mac and Win don't generate events for Touch.
-// TODO(crbug.com/40263777): Add explicit expectations for Win.
 // Android TouchFile returns false.
-#if !(BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID))
+#if !BUILDFLAG(IS_ANDROID)
   // Touch "$dir".
   Time access_time;
   ASSERT_TRUE(Time::FromString("Wed, 16 Nov 1994, 00:00:00", &access_time));
   ASSERT_TRUE(TouchFile(dir, access_time, access_time));
-#if !BUILDFLAG(IS_APPLE)
+#if !(BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_WIN))
   // TODO(crbug.com/40263766): Investigate why we're getting two events
   // here from inotify.
   event_expecter.AddExpectedEventForPath(dir);
   event_expecter.AddExpectedEventForPath(dir);
-#endif  // !BUILDFLAG(IS_APPLE)
+#endif  // !(BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_WIN))
   delegate.RunUntilEventsMatch(event_expecter);
   // TODO(crbug.com/40263777): Add a test touching `subdir`.
-#endif  // !(BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID))
+#endif  // !BUILDFLAG(IS_ANDROID)

테스트 방법

Windows에서 다음 테스트를 대상으로 검증했습니다.

base_unittests --gtest_filter=FilePathWatcherTest.RecursiveWatch

Gerrit LUCI dry-run과 제출 전 전체 CQ가 통과했으며, CL은 Chromium main에
병합되었습니다.

배운 점

  • Windows에서 파일 변경 알림이 발생하더라도 FilePathWatcher가 디렉터리에 대한
    FILE_ACTION_MODIFIED 알림을 필터링하여 이벤트가 전달되지 않는다는 점을
    배웠습니다.
  • 비동기 이벤트가 발생하지 않아야 하는 동작은 이벤트 루프를 잠시 실행해 알림이
    처리될 시간을 준 뒤, 기대 이벤트 목록과 실제 수신 이벤트 목록이 일치하는지
    확인하여 테스트할 수 있음을 알게 되었습니다.

참고 자료