| 
					
				 | 
			
			
				@@ -3,6 +3,7 @@ import pytest 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from ..crypto.key import PlaintextKey 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from ..repository import Repository 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from ..repoobj import RepoObj, RepoObj1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ..compress import LZ4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @pytest.fixture 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -34,9 +35,8 @@ def test_format_parse_roundtrip(key): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     assert data == got_data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     edata = repo_objs.extract_crypted_data(cdata) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    compressor = repo_objs.compressor 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     key = repo_objs.key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    assert edata.startswith(bytes((key.TYPE, compressor.ID[0], compressor.level))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert edata.startswith(bytes((key.TYPE,))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def test_format_parse_roundtrip_borg1(key):  # legacy 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -57,3 +57,39 @@ def test_format_parse_roundtrip_borg1(key):  # legacy 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     compressor = repo_objs.compressor 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     key = repo_objs.key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     assert edata.startswith(bytes((key.TYPE, compressor.ID[0], compressor.level))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def test_borg1_borg2_transition(key): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # borg transfer reads borg 1.x repo objects (without decompressing them), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # writes borg 2 repo objects (giving already compressed data to avoid compression). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    meta = {}  # borg1 does not support this kind of metadata 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    data = b"foobar" * 10 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    len_data = len(data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    repo_objs1 = RepoObj1(key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    id = repo_objs1.id_hash(data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    borg1_cdata = repo_objs1.format(id, meta, data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    meta1, compr_data1 = repo_objs1.parse(id, borg1_cdata, decompress=False)  # borg transfer avoids (de)compression 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # in borg 1, we can only get this metadata after decrypting the whole chunk (and we do not have "size" here): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert meta1["ctype"] == LZ4.ID[0]  # default compression 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert meta1["clevel"] == 0xFF  # lz4 does not know levels (yet?) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert meta1["csize"] < len_data  # lz4 should make it smaller 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    repo_objs2 = RepoObj(key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # note: as we did not decompress, we do not have "size" and we need to get it from somewhere else. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # here, we just use len_data. for borg transfer, we also know the size from another metadata source. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    borg2_cdata = repo_objs2.format( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        id, meta1, compr_data1[2:], compress=False, size=len_data, ctype=meta1["ctype"], clevel=meta1["clevel"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    meta2, data2 = repo_objs2.parse(id, borg2_cdata) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert data2 == data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert meta2["ctype"] == LZ4.ID[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert meta2["clevel"] == 0xFF 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert meta2["csize"] == meta1["csize"] - 2  # borg2 does not store the type/level bytes there 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert meta2["size"] == len_data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    meta2 = repo_objs2.parse_meta(id, borg2_cdata) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # now, in borg 2, we have nice and separately decrypted metadata (no need to decrypt the whole chunk): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert meta2["ctype"] == LZ4.ID[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert meta2["clevel"] == 0xFF 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert meta2["csize"] == meta1["csize"] - 2  # borg2 does not store the type/level bytes there 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert meta2["size"] == len_data 
			 |