History

[pack] improved test to validate a fix

Sebastian Thiel committed 5 years ago

Commit e3eeeb11 parent 28907372 files · +39 −18Browse files

Unified · Split

2 files
  1. git-pack/src/data/input/lookup_ref_delta_objects.rs +2 −2
  2. git-pack/tests/pack/data/input.rs +37 −16
git-pack/src/data/input/lookup_ref_delta_objects.rs+2−2
@@ -64,11 +64,11 @@ where · 63 unmodified lines
6464 let base_entry = match (self.lookup)(base_id, &mut self.buf) {
6565 Some(obj) => {
6666 let current_pack_offset = entry.pack_offset;
67− let mut entry = match input::Entry::from_data_obj(&obj, entry.pack_offset) {
67+ let mut entry = match input::Entry::from_data_obj(&obj, 0) {
6868 Err(err) => return Some(Err(err)),
6969 Ok(e) => e,
7070 };
71− // entry.pack_offset = self.shift_pack_offset(current_pack_offset);
71+ entry.pack_offset = self.shift_pack_offset(current_pack_offset);
7272 self.inserted_entry_length_at_offset.push(Change {
7373 at_pack_offset: entry.pack_offset,
7474 _change_in_bytes: entry.bytes_in_pack() as i64,
git-pack/tests/pack/data/input.rs+37−16
@@ -1,10 +1,12 @@
11 mod lookup_ref_delta_objects {
2+ use crate::pack::hex_to_id;
23 use git_hash::ObjectId;
34 use git_pack::data::{self, entry::Header, input, LookupRefDeltaObjectsIter};
45
56 const D_A: &[u8] = b"a";
67 const D_B: &[u8] = b"bb";
78 const D_C: &[u8] = b"ccc";
9+ const D_D: &[u8] = b"dddd";
810
911 fn base() -> Header {
1012 Header::Blob
@@ -63,21 +65,25 @@ mod lookup_ref_delta_objects { · 52 unmodified lines
6365
6466 #[test]
6567 fn ref_deltas_have_their_base_injected_if_not_done_before_and_all_future_entries_are_offset() {
66− let first = entry(base(), D_C);
67− let mut inserted = entry(base(), D_B);
68+ let first_id = hex_to_id("0000000000000000000000000000000000000001");
69+ let second_id = hex_to_id("0000000000000000000000000000000000000002");
70+ let first = entry(delta_ref(first_id), D_A);
71+
72+ let inserted_data = D_D;
73+ let mut inserted = entry(base(), inserted_data);
6874 let mut last_entry = entry(base(), D_C);
6975 // todo: let's have an ofs delta point at the altered entry, maybe even last_entry
7076 let input = compute_offsets(vec![
7177 first.clone(),
72− entry(delta_ref(ObjectId::null_sha1()), D_A),
78+ entry(delta_ref(second_id), D_B),
7379 last_entry.clone(),
7480 ]);
7581
7682 let mut calls = 0;
7783 let actual = LookupRefDeltaObjectsIter::new(into_results_iter(input), |_oid, buf| {
7884 calls += 1;
79− buf.resize(D_B.len(), 0);
80− buf.copy_from_slice(&D_B);
85+ buf.resize(inserted_data.len(), 0);
86+ buf.copy_from_slice(inserted_data);
8187 Some(data::Object {
8288 kind: git_object::Kind::Blob,
8389 data: buf.as_slice(),
@@ -87,28 +93,43 @@ mod lookup_ref_delta_objects { · 3 unmodified lines
8793 .collect::<Result<Vec<_>, _>>()
8894 .unwrap();
8995
90− assert_eq!(calls, 1, "there is only one object to replace");
91− assert_eq!(actual.len(), 4, "one object was inserted");
92− assert_eq!(&actual[0], &first, "first object is unchanged");
96+ assert_eq!(calls, 2, "there is only two objects to replace");
97+ assert_eq!(actual.len(), 5, "two object was inserted");
98+
99+ assert_eq!(&actual[0], &inserted, "first object is inserted one");
100+
101+ let altered = &actual[1];
102+ assert_eq!(
103+ extract_delta_offset(&altered.header),
104+ inserted.bytes_in_pack(),
105+ "former first entry is now an offset delta pointing at the item before"
106+ );
107+ assert_eq!(
108+ altered.pack_offset,
109+ inserted.bytes_in_pack(),
110+ "the pack offset was adjusted to accommodate for the inserted object"
111+ );
93112
94− inserted.pack_offset += first.bytes_in_pack();
95− assert_eq!(&actual[1], &inserted, "second object is the inserted one");
113+ inserted.pack_offset = inserted.bytes_in_pack() + altered.bytes_in_pack();
114+ assert_eq!(&actual[2], &inserted, "third object is a newly inserted one, too");
96115
97− let altered = &actual[2];
116+ let first_altered_len = altered.bytes_in_pack();
117+ let altered = &actual[3];
98118 assert_eq!(
99119 extract_delta_offset(&altered.header),
100120 inserted.bytes_in_pack(),
101− "former second entry is now an offset delta pointing at the item before"
121+ "former second entry is now an offset delta pointing at the inserted item before"
102122 );
103123 assert_eq!(
104124 altered.pack_offset,
105− first.bytes_in_pack() + inserted.bytes_in_pack(),
106− "the pack offset was adjusted to accommodate for the first and inserted object"
125+ inserted.bytes_in_pack() + first_altered_len + inserted.bytes_in_pack(),
126+ "the pack offset was adjusted to accommodate for preceding objects"
107127 );
108128
109− last_entry.pack_offset = first.bytes_in_pack() + inserted.bytes_in_pack() + altered.bytes_in_pack();
129+ last_entry.pack_offset =
130+ inserted.bytes_in_pack() + first_altered_len + inserted.bytes_in_pack() + altered.bytes_in_pack();
110131 assert_eq!(
111− &actual[3], &last_entry,
132+ &actual[4], &last_entry,
112133 "the last entry was offset and is otherwise unchanged"
113134 );
114135 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t