OSSCA Chromium

기여 목록 / 8425749

FSA: Test sandboxed writer cleanup after quota errors

ContenttestMerged

샌드박스 파일 writer에서 할당량 부족으로 쓰기가 실패한 뒤 연결이 끊기면 기존 파일 내용이 보존되고 swap 파일이 삭제되는지 검증하도록 테스트를 보강했습니다.

문제 설명

기존 QuotaError 테스트는 쓰기 실패 후 writer를 Close()했습니다. 닫기는 비어 있는 swap 파일을 원본 파일에 반영하므로, 실제로 오류 후 renderer가 writer의 Mojo 연결을 끊을 때 브라우저 프로세스 writer가 수행하는 정리 경로를 검증하지 못했습니다.

또한 테스트 헬퍼가 쓰기 결과의 상태 코드만 반환해 구체적인 파일 오류를 확인할 수 없었습니다. 부분 쓰기 뒤 할당량이 소진되는 경우에는 기록된 바이트 수와 아직 반영되지 않은 swap 파일의 내용도 확인해야 했습니다.

해결 내용

  1. 구체적인 쓰기 오류 보존

    WriteStreamSync()와 WriteSync()가 FileSystemAccessErrorPtr 전체를 반환하도록 변경했습니다. 기존 테스트는 이 결과의 status를 읽고, 할당량 테스트는 file_error가 base::File::FILE_ERROR_NO_SPACE인지 직접 확인합니다.

  2. 연결 해제 시 정리 경로 검증

    대상 파일에 original을 미리 기록한 뒤 할당량을 제한합니다. 쓰기가 실패하면 Close() 대신 remote_.reset()으로 writer의 Mojo 연결을 끊고, 핸들이 무효화될 때까지 기다립니다. 이후 원본 내용이 original 그대로이며 swap 파일이 삭제되었는지 검사합니다.

  3. 부분 쓰기 뒤 실패 검증

    새 QuotaErrorAfterPartialWrite 테스트는 기존 사용량에 2바이트만 더 쓸 수 있도록 할당량을 설정합니다. 3바이트 abc를 쓰면 2바이트가 기록되고 FILE_ERROR_NO_SPACE가 반환되는지 확인합니다. 연결을 끊기 전 swap 파일에는 ab가 있지만 원본에는 original이 남아 있고, 연결 해제 후에는 swap 파일이 없어지는지 검증합니다.

변경 파일은 content/browser/file_system_access/file_system_access_file_writer_impl_unittest.cc 하나입니다. 제품 코드의 동작은 변경하지 않았습니다.

테스트 방법

  • QuotaError는 쓰기 오류가 FILE_ERROR_NO_SPACE이고 기록된 바이트 수가 0인지 확인합니다. writer 연결 해제 후 원본 내용 보존과 swap 파일 삭제도 확인합니다.
  • QuotaErrorAfterPartialWrite는 2바이트만 기록된 상태에서 할당량 오류가 발생하는지, 반영되지 않은 ab가 swap 파일에만 있는지, 연결 해제 후 원본과 swap 파일이 올바르게 정리되는지 확인합니다.
  • 기존 writer 테스트도 헬퍼의 새 반환값에서 status를 읽도록 갱신했습니다.
  • Gerrit 기록상 Patch Set 1과 2의 CQ dry run이 통과했습니다. 최종 변경은 2026년 9월 29일 Chromium main에 반영되었습니다(refs/heads/main@{#1706528}).

위 테스트 결과는 패치와 Gerrit 기록을 기준으로 정리했으며, 보고서 작성 과정에서 Chromium 테스트를 별도로 실행하지는 않았습니다.

배운 점

  • 쓰기 실패 후 Close()와 연결 해제는 서로 다른 정리 경로를 실행하므로, 재현하려는 동작에 맞게 테스트해야 합니다.
  • 상태 코드만 확인하면 할당량 부족의 구체적인 원인을 놓칠 수 있습니다. 파일 오류와 실제 기록된 바이트 수도 함께 검증해야 합니다.
  • swap 파일에 일부 내용이 기록되어도 커밋되지 않았다면 기존 파일은 유지되어야 합니다. 오류 전후의 두 파일을 모두 검사하면 이 조건을 확인할 수 있습니다.

참고 자료