@@ -103,6 +103,65 @@ def test_doctor_reports_missing_feature_payload_object(git_repo):
103103 assert "missing_feature_payload_object" in _codes (report , level = "error" )
104104
105105
106+ def test_doctor_reports_corrupt_feature_payload_object (git_repo ):
107+ from rgit .doctor import run_doctor
108+
109+ store = Store .init (git_repo )
110+ fid = store .add_feature (_cap ())
111+ payload_hash = store .conn .execute (
112+ "SELECT payload_hash FROM features WHERE id=?" , (fid ,)
113+ ).fetchone ()["payload_hash" ]
114+ _object_path (store , payload_hash ).write_bytes (b"[]" )
115+
116+ report = run_doctor (store )
117+
118+ assert report ["ok" ] is False
119+ assert "corrupt_feature_payload_object" in _codes (report , level = "error" )
120+ assert "malformed_feature_payload_json" not in _codes (report )
121+
122+
123+ def test_doctor_hashes_the_same_feature_payload_bytes_it_parses (
124+ git_repo , monkeypatch
125+ ):
126+ from rgit .doctor import run_doctor
127+
128+ store = Store .init (git_repo )
129+ fid = store .add_feature (_cap ())
130+ payload_hash = store .conn .execute (
131+ "SELECT payload_hash FROM features WHERE id=?" , (fid ,)
132+ ).fetchone ()["payload_hash" ]
133+ real_get = store .objects .get
134+
135+ def tamper_before_read (digest ):
136+ _object_path (store , payload_hash ).write_bytes (b"[]" )
137+ return real_get (digest )
138+
139+ monkeypatch .setattr (store .objects , "get" , tamper_before_read )
140+
141+ report = run_doctor (store )
142+
143+ assert report ["ok" ] is False
144+ assert "corrupt_feature_payload_object" in _codes (report , level = "error" )
145+ assert "malformed_feature_payload_json" not in _codes (report )
146+
147+
148+ def test_doctor_reports_feature_payload_read_race (git_repo , monkeypatch ):
149+ from rgit .doctor import run_doctor
150+
151+ store = Store .init (git_repo )
152+ store .add_feature (_cap ())
153+
154+ def deny_read (digest ):
155+ raise PermissionError ("simulated read race" )
156+
157+ monkeypatch .setattr (store .objects , "get" , deny_read )
158+
159+ report = run_doctor (store )
160+
161+ assert report ["ok" ] is False
162+ assert "unreadable_feature_payload_object" in _codes (report , level = "error" )
163+
164+
106165def test_doctor_reports_missing_run_artifact_object (git_repo ):
107166 from rgit .doctor import run_doctor
108167
@@ -116,6 +175,20 @@ def test_doctor_reports_missing_run_artifact_object(git_repo):
116175 assert "missing_run_artifact_object" in _codes (report , level = "error" )
117176
118177
178+ def test_doctor_reports_corrupt_run_artifact_object (git_repo ):
179+ from rgit .doctor import run_doctor
180+
181+ store = Store .init (git_repo )
182+ artifact_hash = store .objects .put (b"artifact" )
183+ _run (store , artifact = artifact_hash )
184+ _object_path (store , artifact_hash ).write_bytes (b"tampered" )
185+
186+ report = run_doctor (store )
187+
188+ assert report ["ok" ] is False
189+ assert "corrupt_run_artifact_object" in _codes (report , level = "error" )
190+
191+
119192def test_doctor_reports_missing_proposal_diff_object (git_repo ):
120193 from rgit .doctor import run_doctor
121194
@@ -129,6 +202,50 @@ def test_doctor_reports_missing_proposal_diff_object(git_repo):
129202 assert "missing_proposal_diff_object" in _codes (report , level = "error" )
130203
131204
205+ def test_doctor_reports_corrupt_proposal_diff_object (git_repo ):
206+ from rgit .doctor import run_doctor
207+
208+ store = Store .init (git_repo )
209+ diff_ref = store .objects .put (b"diff" )
210+ _proposal (store , diff = diff_ref )
211+ _object_path (store , diff_ref ).write_bytes (b"tampered" )
212+
213+ report = run_doctor (store )
214+
215+ assert report ["ok" ] is False
216+ assert "corrupt_proposal_diff_object" in _codes (report , level = "error" )
217+
218+
219+ def test_doctor_reports_invalid_object_reference_without_path_lookup (git_repo ):
220+ from rgit .doctor import run_doctor
221+
222+ store = Store .init (git_repo )
223+ _run (store , artifact = "../outside" )
224+
225+ report = run_doctor (store )
226+
227+ assert report ["ok" ] is False
228+ assert "invalid_run_artifact_reference" in _codes (report , level = "error" )
229+
230+
231+ def test_doctor_reports_unreadable_object (git_repo , monkeypatch ):
232+ from rgit .doctor import run_doctor
233+
234+ store = Store .init (git_repo )
235+ artifact_hash = store .objects .put (b"artifact" )
236+ _run (store , artifact = artifact_hash )
237+
238+ def deny_read (digest ):
239+ raise PermissionError ("simulated unreadable object" )
240+
241+ monkeypatch .setattr (store .objects , "verify" , deny_read )
242+
243+ report = run_doctor (store )
244+
245+ assert report ["ok" ] is False
246+ assert "unreadable_run_artifact_object" in _codes (report , level = "error" )
247+
248+
132249def test_doctor_reports_malformed_proposal_candidates_json (git_repo ):
133250 from rgit .doctor import run_doctor
134251
0 commit comments