--- /dev/null
+/*
+ * Copyright (C) The Arvados Authors. All rights reserved.
+ *
+ * SPDX-License-Identifier: AGPL-3.0 OR Apache-2.0
+ *
+ */
+
+package org.arvados.client.logic.collection;
+
+import org.arvados.client.exception.ArvadosClientException;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.List;
+
+import static junit.framework.TestCase.fail;
+
+public class ManifestDecoderTest {
+
+ private ManifestDecoder manifestDecoder = new ManifestDecoder();
+
+ private static final String ONE_LINE_MANIFEST_TEXT = ". " +
+ "eff999f3b5158331eb44a9a93e3b36e1+67108864+Aad3839bea88bce22cbfe71cf4943de7dab3ea52a@5826180f " +
+ "db141bfd11f7da60dce9e5ee85a988b8+34038725+Ae8f48913fed782cbe463e0499ab37697ee06a2f8@5826180f " +
+ "0:101147589:rna.SRR948778.bam" +
+ "\\n";
+
+ private static final String MULTIPLE_LINES_MANIFEST_TEXT = ". " +
+ "930625b054ce894ac40596c3f5a0d947+33 " +
+ "0:0:a 0:0:b 0:33:output.txt\n" +
+ "./c d41d8cd98f00b204e9800998ecf8427e+0 0:0:d";
+
+ private static final String MANIFEST_TEXT_WITH_INVALID_FIRST_PATH_COMPONENT = "a" + ONE_LINE_MANIFEST_TEXT;
+
+
+ @Test
+ public void allLocatorsAndFileTokensAreExtractedFromSimpleManifest() {
+
+ List<ManifestStream> actual = manifestDecoder.decode(ONE_LINE_MANIFEST_TEXT);
+
+ // one manifest stream
+ Assert.assertEquals(1, actual.size());
+
+ ManifestStream manifest = actual.get(0);
+ // two locators
+ Assert.assertEquals(2, manifest.getKeepLocators().size());
+ // one file token
+ Assert.assertEquals(1, manifest.getFileTokens().size());
+
+ }
+
+ @Test
+ public void allLocatorsAndFileTokensAreExtractedFromComplexManifest() {
+
+ List<ManifestStream> actual = manifestDecoder.decode(MULTIPLE_LINES_MANIFEST_TEXT);
+
+ // two manifest streams
+ Assert.assertEquals(2, actual.size());
+
+ // first stream - 1 locator and 3 file tokens
+ ManifestStream firstManifestStream = actual.get(0);
+ Assert.assertEquals(1, firstManifestStream.getKeepLocators().size());
+ Assert.assertEquals(3, firstManifestStream.getFileTokens().size());
+
+ // second stream - 1 locator and 1 file token
+ ManifestStream secondManifestStream = actual.get(1);
+ Assert.assertEquals(1, secondManifestStream.getKeepLocators().size());
+ Assert.assertEquals(1, secondManifestStream.getFileTokens().size());
+ }
+
+ @Test
+ public void manifestTextWithInvalidStreamNameThrowsException() {
+
+ try {
+ List<ManifestStream> actual = manifestDecoder.decode(MANIFEST_TEXT_WITH_INVALID_FIRST_PATH_COMPONENT);
+ fail();
+ } catch (ArvadosClientException e) {
+ Assert.assertEquals("Invalid first path component (expecting \".\")", e.getMessage());
+ }
+
+ }
+
+ @Test
+ public void emptyManifestTextThrowsException() {
+ String emptyManifestText = null;
+
+ try {
+ List<ManifestStream> actual = manifestDecoder.decode(emptyManifestText);
+ fail();
+ } catch (ArvadosClientException e) {
+ Assert.assertEquals("Manifest text cannot be empty.", e.getMessage());
+ }
+
+ emptyManifestText = "";
+ try {
+ List<ManifestStream> actual = manifestDecoder.decode(emptyManifestText);
+ fail();
+ } catch (ArvadosClientException e) {
+ Assert.assertEquals("Manifest text cannot be empty.", e.getMessage());
+ }
+
+ }
+
+
+
+
+
+}