blob: 793c5a54d91f5a30055963f4e9629d6a8a62a264 [file] [log] [blame]
Matthias Andreas Benkardb5d657a2022-02-03 21:14:30 +01001// SPDX-FileCopyrightText: © 2021 Matthias Andreas Benkard <code@mail.matthias.benkard.de>
2//
3// SPDX-License-Identifier: LGPL-3.0-or-later
4
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +01005package eu.mulk.jgvariant.ostree;
6
7import static org.junit.jupiter.api.Assertions.assertAll;
8import static org.junit.jupiter.api.Assertions.assertEquals;
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +01009
10import com.adelean.inject.resources.junit.jupiter.GivenBinaryResource;
11import com.adelean.inject.resources.junit.jupiter.TestWithResources;
12import eu.mulk.jgvariant.core.Signature;
13import eu.mulk.jgvariant.core.Variant;
14import java.nio.ByteBuffer;
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +010015import java.util.*;
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010016import org.junit.jupiter.api.Test;
17
18@TestWithResources
Matthias Andreas Benkard91dbd742022-10-17 19:38:56 +020019@SuppressWarnings({
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +010020 "DoubleBraceInitialization",
Matthias Andreas Benkard91dbd742022-10-17 19:38:56 +020021 "ImmutableListOf1",
22 "ImmutableMapOf1",
23 "initialization.field.uninitialized",
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +010024 "NullAway",
Matthias Andreas Benkard91dbd742022-10-17 19:38:56 +020025})
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010026class OstreeDecoderTest {
27
28 @GivenBinaryResource("/ostree/summary")
29 byte[] summaryBytes;
30
31 @GivenBinaryResource(
32 "/ostree/objects/3d/3b3329dca38871f29aeda1bf5854d76c707fa269759a899d0985c91815fe6f.commit")
33 byte[] commitBytes;
34
35 @GivenBinaryResource(
36 "/ostree/objects/14/c9b958ac59df4979095a3485b4da5a045fe8737ffdba8cfbfff24988b238f7.dirtree")
37 byte[] dirTreeBytes;
38
39 @GivenBinaryResource(
40 "/ostree/objects/48/cc6a2ecdab284b9d1e5b0e875c905866ff32f65ee1e857df0e691285d6f14c.dirmeta")
41 byte[] dirMetaBytes;
42
43 @GivenBinaryResource("/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI/superblock")
44 byte[] deltaSuperblockBytes;
45
46 @GivenBinaryResource("/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI/0")
47 byte[] deltaPartPayloadBytes;
48
49 @Test
Matthias Andreas Benkard91dbd742022-10-17 19:38:56 +020050 void summaryDecoder() {
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010051 var decoder = Summary.decoder();
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +010052 var input = ByteBuffer.wrap(summaryBytes);
53 var summary = decoder.decode(input);
Matthias Andreas Benkardf66fc182023-12-10 11:37:30 +010054
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010055 assertAll(
56 () ->
57 assertEquals(
58 List.of(
59 new Summary.Entry(
60 "mulkos/1.x/amd64",
61 new Summary.Entry.Value(
62 214,
63 Checksum.ofHex(
64 "66ff167ff35ce87daac817447a9490a262ee75f095f017716a6eb1a9d9eb3350"),
65 new Metadata(
Matthias Andreas Benkard329168c2021-12-28 01:20:05 +010066 Map.of(
67 "ostree.commit.timestamp",
68 new Variant(Signature.parse("t"), 1640537170L)))))),
Matthias Andreas Benkardf66fc182023-12-10 11:37:30 +010069 summary.entries()),
70 () ->
71 assertEquals(
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +010072 new LinkedHashMap<String, Variant>() {
73 {
74 put("ostree.summary.mode", new Variant(Signature.parse("s"), "bare"));
75 put(
76 "ostree.summary.last-modified",
77 new Variant(Signature.parse("t"), 1640537300L));
78 put(
79 "ostree.summary.tombstone-commits",
80 new Variant(Signature.parse("b"), false));
81 put(
82 "ostree.static-deltas",
83 new Variant(
84 Signature.parse("a{sv}"),
85 new LinkedHashMap<String, Variant>() {
86 {
87 put(
88 "3d3b3329dca38871f29aeda1bf5854d76c707fa269759a899d0985c91815fe6f-66ff167ff35ce87daac817447a9490a262ee75f095f017716a6eb1a9d9eb3350",
89 new Variant(
90 Signature.parse("ay"),
91 bytesOfHex(
92 "03738040e28e7662e9c9d2599c530ea974e642c9f87e6c00cbaa39a0cdac8d44")));
93 put(
94 "31c8835d5c9d2c6687a50091c85142d1b2d853ff416a9fb81b4ee30754510d52",
95 new Variant(
96 Signature.parse("ay"),
97 bytesOfHex(
98 "f481144629474bd88c106e45ac405ebd75b324b0655af1aec14b31786ae1fd61")));
99 put(
100 "31c8835d5c9d2c6687a50091c85142d1b2d853ff416a9fb81b4ee30754510d52-3d3b3329dca38871f29aeda1bf5854d76c707fa269759a899d0985c91815fe6f",
101 new Variant(
102 Signature.parse("ay"),
103 bytesOfHex(
104 "2c6a07bc1cf4d7ce7d00f82d7d2d6d156fd0e31d476851b46dc2306b181b064a")));
105 }
106 }));
107 put("ostree.summary.indexed-deltas", new Variant(Signature.parse("b"), true));
108 }
109 },
Matthias Andreas Benkardf66fc182023-12-10 11:37:30 +0100110 summary.metadata().fields()));
111
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +0100112 var encoded = decoder.encode(summary);
Matthias Andreas Benkarddf853ef2023-12-10 20:29:35 +0100113
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +0100114 input.rewind();
115 assertEquals(input, encoded);
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +0100116 }
117
118 @Test
Matthias Andreas Benkard91dbd742022-10-17 19:38:56 +0200119 void commitDecoder() {
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +0100120 var decoder = Commit.decoder();
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +0100121 var input = ByteBuffer.wrap(commitBytes);
122 var commit = decoder.decode(input);
123
124 var encoded = decoder.encode(commit);
Matthias Andreas Benkarddf853ef2023-12-10 20:29:35 +0100125
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +0100126 input.rewind();
127 assertEquals(input, encoded);
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +0100128 }
129
130 @Test
Matthias Andreas Benkard91dbd742022-10-17 19:38:56 +0200131 void dirTreeDecoder() {
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +0100132 var decoder = DirTree.decoder();
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +0100133 var input = ByteBuffer.wrap(dirTreeBytes);
134 var dirTree = decoder.decode(input);
135
136 var encoded = decoder.encode(dirTree);
Matthias Andreas Benkarddf853ef2023-12-10 20:29:35 +0100137
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +0100138 input.rewind();
139 assertEquals(input, encoded);
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +0100140 }
141
142 @Test
Matthias Andreas Benkard91dbd742022-10-17 19:38:56 +0200143 void dirMetaDecoder() {
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +0100144 var decoder = DirMeta.decoder();
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +0100145 var input = ByteBuffer.wrap(dirMetaBytes);
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +0100146 var dirMeta = decoder.decode(ByteBuffer.wrap(dirMetaBytes));
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +0100147
148 var encoded = decoder.encode(dirMeta);
Matthias Andreas Benkarddf853ef2023-12-10 20:29:35 +0100149
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +0100150 input.rewind();
151 assertEquals(input, encoded);
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +0100152 }
153
154 @Test
Matthias Andreas Benkard91dbd742022-10-17 19:38:56 +0200155 void superblockDecoder() {
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +0100156 var decoder = DeltaSuperblock.decoder();
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +0100157 var input = ByteBuffer.wrap(deltaSuperblockBytes);
158 var deltaSuperblock = decoder.decode(input);
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +0100159
160 var encoded = decoder.encode(deltaSuperblock);
Matthias Andreas Benkarddf853ef2023-12-10 20:29:35 +0100161
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +0100162 input.rewind();
163 assertEquals(input, encoded);
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +0100164 }
165
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +0100166 @Test
Matthias Andreas Benkard91dbd742022-10-17 19:38:56 +0200167 void partPayloadDecoder() {
Matthias Andreas Benkardc981cde2021-12-30 20:37:39 +0100168 var superblockDecoder = DeltaSuperblock.decoder();
169 var superblock = superblockDecoder.decode(ByteBuffer.wrap(deltaSuperblockBytes));
170
171 var decoder = DeltaPartPayload.decoder(superblock.entries().get(0));
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +0100172 var input = ByteBuffer.wrap(deltaPartPayloadBytes);
173 var deltaPartPayload = decoder.decode(input);
Matthias Andreas Benkardc981cde2021-12-30 20:37:39 +0100174
Matthias Andreas Benkardc442ebe2023-12-10 17:58:38 +0100175 var encoded = decoder.encode(deltaPartPayload);
176 var decodedAgain = decoder.decode(encoded);
177 assertEquals(deltaPartPayload, decodedAgain);
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +0100178 }
Matthias Andreas Benkardf66fc182023-12-10 11:37:30 +0100179
180 private static List<Byte> bytesOfHex(String hex) {
181 var bytes = HexFormat.of().parseHex(hex);
182 var byteObjects = new Byte[bytes.length];
183 Arrays.setAll(byteObjects, i -> bytes[i]);
184 return Arrays.asList(byteObjects);
185 }
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +0100186}