P47 실습 검증 결과
검증일: 2026-10-11
실행 환경: CPython 3.12.14 / Linux
검사기: opc_inventory.py 319줄 / Python 표준라이브러리

실행 명령: python -m unittest discover -v
전체 32개 시험: 32개 통과, 실패 0, 오류 0, 건너뜀 0
고정 기대 JSON 비교: 정상 합성 입력 8개 전량 비교 통과
문법 검사: python -m py_compile opc_inventory.py make_fixtures.py test_inventory.py 통과

실제 확인 범위:
- 원본 SHA-256 및 동일바이트 확장자 변경
- content-type 선언/관계 Type/내부 ZIP파트 존재 근거 분리
- 외부 hyperlink/비hyperlink 관계 분리, 외부 Target 내부파트 판정 없음
- 알려진 connections 이름/content-type 출처 분리
- 선언파트 누락 불일치
- 결과 파일 충돌·동일 입력/출력 경로 보존
- ZIP 원본 입력 바이트 변경 없음
- 크기·압축률·항목수 제한, 중복·대소문자·Unicode 정규화 충돌
- 위험·모호한 파트경로 및 패키지 루트 탈출 내부 Target
- 암호화 플래그/복합컨테이너/미지원 압축·인코딩·확장자
- CRC손상/Deflate손상/XML파싱실패/DTD·ENTITY/관계Id중복
- POSIX FIFO 입력을 읽지 않고 보류
- 실행 경계 가드: ZIP extract/extractall, socket.socket, subprocess.Popen, os.system 호출 0
  (가드는 대상 패키지 검사에만 적용. 시험 CLI는 Python 자식 프로세스로 실행)

범위 밖:
- Excel 실제 열림, VBA 바이너리 유효성·실행, 실제 연결 갱신
- 악성·안전·매크로 존재/부재 판정 또는 모든 연결 탐지
- 보안 격리, 절대적인 시간·메모리 한계, 신규 접근권한·보안 변경

외부 Target은 실습용 https://example.invalid/demo 또는 urn:example:external-workbook뿐입니다.
더미 vbaProject.bin은 실제 VBA가 아닙니다. 합성 입력을 Excel로 열어 시험하지 않았습니다.

test_corrupt_deflate_failed_and_cli_exit_two (test_inventory.CorruptDeflateTests.test_corrupt_deflate_failed_and_cli_exit_two) ... ok
test_all_size_limits_deferred (test_inventory.DefensiveTests.test_all_size_limits_deferred) ... ok
test_casefold_collision_deferred (test_inventory.DefensiveTests.test_casefold_collision_deferred) ... ok
test_compound_container_deferred (test_inventory.DefensiveTests.test_compound_container_deferred) ... ok
test_corrupt_crc_failed (test_inventory.DefensiveTests.test_corrupt_crc_failed) ... ok
test_default_declaration_and_presence_are_separate (test_inventory.DefensiveTests.test_default_declaration_and_presence_are_separate) ... ok
test_dtd_and_entities_deferred (test_inventory.DefensiveTests.test_dtd_and_entities_deferred) ... ok
test_duplicate_exact_name_deferred (test_inventory.DefensiveTests.test_duplicate_exact_name_deferred) ... ok
test_duplicate_relationship_id_failed (test_inventory.DefensiveTests.test_duplicate_relationship_id_failed) ... ok
test_encoding_and_namespace_deferred (test_inventory.DefensiveTests.test_encoding_and_namespace_deferred) ... ok
test_encrypted_flag_deferred (test_inventory.DefensiveTests.test_encrypted_flag_deferred) ... ok
test_escaping_internal_target_failed (test_inventory.DefensiveTests.test_escaping_internal_target_failed) ... ok
test_extension_change_preserves_hash_and_evidence (test_inventory.DefensiveTests.test_extension_change_preserves_hash_and_evidence) ... ok
test_high_compression_ratio_deferred (test_inventory.DefensiveTests.test_high_compression_ratio_deferred) ... ok
test_internal_relative_target_and_missing_are_separate (test_inventory.DefensiveTests.test_internal_relative_target_and_missing_are_separate) ... ok
test_known_connections_name_and_content_type_sources_separate (test_inventory.DefensiveTests.test_known_connections_name_and_content_type_sources_separate) ... ok
test_missing_metadata_failed (test_inventory.DefensiveTests.test_missing_metadata_failed) ... ok
test_nonhyperlink_external_has_no_part_presence (test_inventory.DefensiveTests.test_nonhyperlink_external_has_no_part_presence) ... ok
test_nul_filename_deferred (test_inventory.DefensiveTests.test_nul_filename_deferred) ... ok
test_same_input_output_preserves_input (test_inventory.DefensiveTests.test_same_input_output_preserves_input) ... ok
test_scan_has_no_extract_office_or_network_calls (test_inventory.DefensiveTests.test_scan_has_no_extract_office_or_network_calls) ... ok
test_traversal_backslash_percent_and_absolute_deferred (test_inventory.DefensiveTests.test_traversal_backslash_percent_and_absolute_deferred) ... ok
test_unicode_normalization_collision_deferred (test_inventory.DefensiveTests.test_unicode_normalization_collision_deferred) ... ok
test_unsupported_compression_deferred (test_inventory.DefensiveTests.test_unsupported_compression_deferred) ... ok
test_unsupported_extension_is_not_zero (test_inventory.DefensiveTests.test_unsupported_extension_is_not_zero) ... ok
test_xml_parse_failure_failed (test_inventory.DefensiveTests.test_xml_parse_failure_failed) ... ok
test_failure_is_distinct_from_zero (test_inventory.FixtureTests.test_failure_is_distinct_from_zero) ... ok
test_fixed_expected_json_all_fixtures (test_inventory.FixtureTests.test_fixed_expected_json_all_fixtures) ... ok
test_collision_preserves_existing_output (test_inventory.InventoryTests.test_collision_preserves_existing_output) ... ok
test_zero_is_completed_and_has_no_indicators (test_inventory.InventoryTests.test_zero_is_completed_and_has_no_indicators) ... ok
test_named_pipe_is_deferred_without_blocking (test_inventory.RuntimeBoundaryTests.test_named_pipe_is_deferred_without_blocking) ... ok
test_runtime_guards_see_no_extract_network_or_office (test_inventory.RuntimeBoundaryTests.test_runtime_guards_see_no_extract_network_or_office) ... ok

----------------------------------------------------------------------
Ran 32 tests in 0.659s

OK
