You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ji...@apache.org on 2016/01/04 18:28:49 UTC

[5/5] mesos git commit: Moved docker spec tests to a separate file.

Moved docker spec tests to a separate file.

Review: https://reviews.apache.org/r/41843


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/b51a8722
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/b51a8722
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/b51a8722

Branch: refs/heads/master
Commit: b51a8722943c85264655ef1ce4bf0b95219c0ffc
Parents: df2223b
Author: Jie Yu <yu...@gmail.com>
Authored: Fri Jan 1 13:19:01 2016 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Mon Jan 4 09:26:25 2016 -0800

----------------------------------------------------------------------
 src/Makefile.am                                 |   1 +
 src/tests/containerizer/docker_spec_tests.cpp   | 336 +++++++++++++++++++
 .../containerizer/provisioner_docker_tests.cpp  | 328 ------------------
 3 files changed, 337 insertions(+), 328 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/b51a8722/src/Makefile.am
----------------------------------------------------------------------
diff --git a/src/Makefile.am b/src/Makefile.am
index bdac044..e08e867 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1776,6 +1776,7 @@ mesos_tests_SOURCES =						\
   tests/common/recordio_tests.cpp				\
   tests/containerizer/composing_containerizer_tests.cpp		\
   tests/containerizer/docker_containerizer_tests.cpp		\
+  tests/containerizer/docker_spec_tests.cpp			\
   tests/containerizer/docker_tests.cpp				\
   tests/containerizer/external_containerizer_test.cpp		\
   tests/containerizer/isolator_tests.cpp			\

http://git-wip-us.apache.org/repos/asf/mesos/blob/b51a8722/src/tests/containerizer/docker_spec_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/docker_spec_tests.cpp b/src/tests/containerizer/docker_spec_tests.cpp
new file mode 100644
index 0000000..d4ec2cf
--- /dev/null
+++ b/src/tests/containerizer/docker_spec_tests.cpp
@@ -0,0 +1,336 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <gtest/gtest.h>
+
+#include <stout/gtest.hpp>
+#include <stout/json.hpp>
+
+#include "docker/spec.hpp"
+
+namespace spec = docker::spec;
+
+namespace mesos {
+namespace internal {
+namespace tests {
+
+class DockerSpecTest : public ::testing::Test {};
+
+
+TEST_F(DockerSpecTest, ParseV1ImageManifest)
+{
+  Try<JSON::Object> json = JSON::parse<JSON::Object>(
+      R"~(
+      {
+        "container": "7f652467f9e6d1b3bf51172868b9b0c2fa1c711b112f4e987029b1624dd6295f",
+        "parent": "cfa753dfea5e68a24366dfba16e6edf573daa447abf65bc11619c1a98a3aff54",
+        "created": "2015-09-21T20:15:47.866196515Z",
+        "config": {
+          "Hostname": "5f8e0e129ff1",
+          "Entrypoint": null,
+          "Env": null,
+          "OnBuild": null,
+          "OpenStdin": false,
+          "MacAddress": "",
+          "User": "",
+          "VolumeDriver": "",
+          "AttachStderr": false,
+          "AttachStdout": false,
+          "PublishService": "",
+          "NetworkDisabled": false,
+          "StdinOnce": false,
+          "Cmd": [ "sh" ],
+          "WorkingDir": "",
+          "AttachStdin": false,
+          "Volumes": null,
+          "Tty": false,
+          "Domainname": "",
+          "Image": "cfa753dfea5e68a24366dfba16e6edf573daa447abf65bc11619c1a98a3aff54",
+          "Labels": null,
+          "ExposedPorts": null
+        },
+        "container_config": {
+          "Hostname": "5f8e0e129ff1",
+          "Entrypoint": [ "./bin/start" ],
+          "Env": [
+            "LANG=C.UTF-8",
+            "JAVA_VERSION=8u66",
+            "JAVA_DEBIAN_VERSION=8u66-b01-1~bpo8+1",
+            "CA_CERTIFICATES_JAVA_VERSION=20140324"
+          ],
+          "OnBuild": null,
+          "OpenStdin": false,
+          "MacAddress": "",
+          "User": "",
+          "VolumeDriver": "",
+          "AttachStderr": false,
+          "AttachStdout": false,
+          "PublishService": "",
+          "NetworkDisabled": false,
+          "StdinOnce": false,
+          "Cmd": [
+            "/bin/sh",
+            "-c",
+            "#(nop) CMD [\"sh\"]"
+          ],
+          "WorkingDir": "/marathon",
+          "AttachStdin": false,
+          "Volumes": null,
+          "Tty": false,
+          "Domainname": "",
+          "Image": "cfa753dfea5e68a24366dfba16e6edf573daa447abf65bc11619c1a98a3aff54",
+          "Labels": null,
+          "ExposedPorts": null
+        },
+        "architecture": "amd64",
+        "docker_version": "1.8.2",
+        "os": "linux",
+        "id": "d7057cb020844f245031d27b76cb18af05db1cc3a96a29fa7777af75f5ac91a3",
+        "Size": 0
+      })~");
+
+  ASSERT_SOME(json);
+
+  Try<spec::v1::ImageManifest> manifest = spec::v1::parse(json.get());
+  ASSERT_SOME(manifest);
+
+  EXPECT_EQ(
+      "7f652467f9e6d1b3bf51172868b9b0c2fa1c711b112f4e987029b1624dd6295f",
+      manifest.get().container());
+
+  EXPECT_EQ(
+      "cfa753dfea5e68a24366dfba16e6edf573daa447abf65bc11619c1a98a3aff54",
+      manifest.get().parent());
+
+  EXPECT_EQ(
+      "./bin/start",
+      manifest.get().container_config().entrypoint(0));
+
+  EXPECT_EQ(
+      "LANG=C.UTF-8",
+      manifest.get().container_config().env(0));
+
+  EXPECT_EQ(
+      "JAVA_VERSION=8u66",
+      manifest.get().container_config().env(1));
+
+  EXPECT_EQ(
+      "JAVA_DEBIAN_VERSION=8u66-b01-1~bpo8+1",
+      manifest.get().container_config().env(2));
+
+  EXPECT_EQ(
+      "CA_CERTIFICATES_JAVA_VERSION=20140324",
+      manifest.get().container_config().env(3));
+
+  EXPECT_EQ("/bin/sh", manifest.get().container_config().cmd(0));
+  EXPECT_EQ("-c", manifest.get().container_config().cmd(1));
+
+  EXPECT_EQ(
+      "#(nop) CMD [\"sh\"]",
+      manifest.get().container_config().cmd(2));
+
+  EXPECT_EQ("sh", manifest.get().config().cmd(0));
+
+  EXPECT_EQ("1.8.2", manifest.get().docker_version());
+  EXPECT_EQ("amd64", manifest.get().architecture());
+  EXPECT_EQ("linux", manifest.get().os());
+  EXPECT_EQ(0u, manifest.get().size());
+}
+
+
+TEST_F(DockerSpecTest, ParseV2ImageManifest)
+{
+  Try<JSON::Object> json = JSON::parse<JSON::Object>(
+      R"~(
+      {
+        "name": "dmcgowan/test-image",
+        "tag": "latest",
+        "architecture": "amd64",
+        "fsLayers": [
+          { "blobSum": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" },
+          { "blobSum": "sha256:cea0d2071b01b0a79aa4a05ea56ab6fdf3fafa03369d9f4eea8d46ea33c43e5f" },
+          { "blobSum": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" },
+          { "blobSum": "sha256:2a7812e636235448785062100bb9103096aa6655a8f6bb9ac9b13fe8290f66df" }
+        ],
+        "history": [
+          {
+            "v1Compatibility": {
+              "id": "2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea",
+              "parent": "cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff"
+            }
+          },
+          {
+            "v1Compatibility": {
+              "id": "2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea",
+              "parent": "cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff"
+            }
+          },
+          {
+            "v1Compatibility": {
+              "id": "2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea",
+              "parent": "cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff"
+            }
+          },
+          {
+            "v1Compatibility": {
+              "id": "2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea",
+              "parent": "cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff"
+            }
+          }
+        ],
+        "schemaVersion": 1,
+        "signatures": [
+          {
+            "header": {
+              "jwk": {
+                "crv": "P-256",
+                "kid": "LYRA:YAG2:QQKS:376F:QQXY:3UNK:SXH7:K6ES:Y5AU:XUN5:ZLVY:KBYL",
+                "kty": "EC",
+                "x": "Cu_UyxwLgHzE9rvlYSmvVdqYCXY42E9eNhBb0xNv0SQ",
+                "y": "zUsjWJkeKQ5tv7S-hl1Tg71cd-CqnrtiiLxSi6N_yc8"
+              },
+              "alg": "ES256"
+            },
+            "signature": "m3bgdBXZYRQ4ssAbrgj8Kjl7GNgrKQvmCSY-00yzQosKi-8UBrIRrn3Iu5alj82B6u_jNrkGCjEx3TxrfT1rig",
+            "protected": "eyJmb3JtYXRMZW5ndGgiOjYwNjMsImZvcm1hdFRhaWwiOiJDbjAiLCJ0aW1lIjoiMjAxNC0wOS0xMVQxNzoxNDozMFoifQ"
+          }
+        ]
+      })~");
+
+  ASSERT_SOME(json);
+
+  Try<spec::v2::ImageManifest> manifest = spec::v2::parse(json.get());
+  ASSERT_SOME(manifest);
+
+  EXPECT_EQ(manifest.get().name(), "dmcgowan/test-image");
+  EXPECT_EQ(manifest.get().tag(), "latest");
+  EXPECT_EQ(manifest.get().architecture(), "amd64");
+
+  EXPECT_EQ(
+      manifest.get().fslayers(0).blobsum(),
+      "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); // NOLINT(whitespace/line_length)
+
+  EXPECT_EQ(
+      manifest.get().fslayers(1).blobsum(),
+      "sha256:cea0d2071b01b0a79aa4a05ea56ab6fdf3fafa03369d9f4eea8d46ea33c43e5f"); // NOLINT(whitespace/line_length)
+
+  EXPECT_EQ(
+      manifest.get().fslayers(2).blobsum(),
+      "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); // NOLINT(whitespace/line_length)
+
+  EXPECT_EQ(
+      manifest.get().fslayers(3).blobsum(),
+      "sha256:2a7812e636235448785062100bb9103096aa6655a8f6bb9ac9b13fe8290f66df"); // NOLINT(whitespace/line_length)
+
+  EXPECT_EQ(
+      manifest.get().history(1).v1compatibility().id(),
+      "2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea");
+
+  EXPECT_EQ(
+      manifest.get().history(2).v1compatibility().parent(),
+      "cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff");
+
+  EXPECT_EQ(manifest.get().schemaversion(), 1u);
+
+  EXPECT_EQ(
+      manifest.get().signatures(0).header().jwk().kid(),
+      "LYRA:YAG2:QQKS:376F:QQXY:3UNK:SXH7:K6ES:Y5AU:XUN5:ZLVY:KBYL");
+
+  EXPECT_EQ(
+      manifest.get().signatures(0).signature(),
+      "m3bgdBXZYRQ4ssAbrgj8Kjl7GNgrKQvmCSY-00yzQosKi-8UBrIRrn3Iu5alj82B6u_jNrkGCjEx3TxrfT1rig"); // NOLINT(whitespace/line_length)
+}
+
+
+TEST_F(DockerSpecTest, ParseInvalidV2ImageManifest)
+{
+  // This is an invalid manifest. The size of the repeated fields
+  // 'history' and 'fsLayers' must be >= 1. The 'signatures' and
+  // 'schemaVersion' fields are not set.
+  Try<JSON::Object> json = JSON::parse<JSON::Object>(
+      R"~(
+      {
+        "name": "dmcgowan/test-image",
+        "tag": "latest",
+        "architecture": "amd64"
+      })~");
+
+  ASSERT_SOME(json);
+
+  Try<spec::v2::ImageManifest> manifest = spec::v2::parse(json.get());
+  EXPECT_ERROR(manifest);
+}
+
+
+TEST_F(DockerSpecTest, ValidateV2ImageManifestFsLayersNonEmpty)
+{
+  Try<JSON::Object> json = JSON::parse<JSON::Object>(
+    R"~(
+    {
+      "name": "dmcgowan/test-image",
+      "tag": "latest",
+      "architecture": "amd64",
+      "schemaVersion": 1,
+      "signatures": [
+        {
+          "header": {
+            "jwk": {
+              "crv": "P-256",
+              "kid": "LYRA:YAG2:QQKS:376F:QQXY:3UNK:SXH7:K6ES:Y5AU:XUN5:ZLVY:KBYL",
+              "kty": "EC",
+              "x": "Cu_UyxwLgHzE9rvlYSmvVdqYCXY42E9eNhBb0xNv0SQ",
+              "y": "zUsjWJkeKQ5tv7S-hl1Tg71cd-CqnrtiiLxSi6N_yc8"
+            },
+            "alg": "ES256"
+          },
+          "signature": "m3bgdBXZYRQ4ssAbrgj8Kjl7GNgrKQvmCSY-00yzQosKi-8UBrIRrn3Iu5alj82B6u_jNrkGCjEx3TxrfT1rig",
+          "protected": "eyJmb3JtYXRMZW5ndGgiOjYwNjMsImZvcm1hdFRhaWwiOiJDbjAiLCJ0aW1lIjoiMjAxNC0wOS0xMVQxNzoxNDozMFoifQ"
+        }
+      ]
+    })~");
+
+  ASSERT_SOME(json);
+
+  Try<spec::v2::ImageManifest> manifest = spec::v2::parse(json.get());
+  EXPECT_ERROR(manifest);
+}
+
+
+TEST_F(DockerSpecTest, ValidateV2ImageManifestSignaturesNonEmpty)
+{
+  Try<JSON::Object> json = JSON::parse<JSON::Object>(
+    R"~(
+    {
+      "name": "dmcgowan/test-image",
+      "tag": "latest",
+      "architecture": "amd64",
+      "fsLayers": [
+        {
+          "blobSum": "sha256:2a7812e636235448785062100bb9103096aa6655a8f6bb9ac9b13fe8290f66df"
+        }
+      ],
+      "schemaVersion": 1
+    })~");
+
+  ASSERT_SOME(json);
+
+  Try<spec::v2::ImageManifest> manifest = spec::v2::parse(json.get());
+  EXPECT_ERROR(manifest);
+}
+
+} // namespace tests {
+} // namespace internal {
+} // namespace mesos {

http://git-wip-us.apache.org/repos/asf/mesos/blob/b51a8722/src/tests/containerizer/provisioner_docker_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/provisioner_docker_tests.cpp b/src/tests/containerizer/provisioner_docker_tests.cpp
index 2d1b2be..959540f 100644
--- a/src/tests/containerizer/provisioner_docker_tests.cpp
+++ b/src/tests/containerizer/provisioner_docker_tests.cpp
@@ -308,334 +308,6 @@ TEST_F(RegistryTokenTest, NotBeforeInFuture)
 }
 
 
-class DockerSpecTest : public ::testing::Test {};
-
-
-TEST_F(DockerSpecTest, SerializeV1DockerManifest)
-{
-  JSON::Value manifestJson = JSON::parse(
-    "{"
-    "    \"container\": "
-    "\"7f652467f9e6d1b3bf51172868b9b0c2fa1c711b112f4e987029b1624dd6295f\","
-    "    \"parent\": "
-    "\"cfa753dfea5e68a24366dfba16e6edf573daa447abf65bc11619c1a98a3aff54\","
-    "    \"created\": \"2015-09-21T20:15:47.866196515Z\","
-    "    \"config\": {"
-    "        \"Hostname\": \"5f8e0e129ff1\","
-    "        \"Entrypoint\": null,"
-    "        \"Env\": null,"
-    "        \"OnBuild\": null,"
-    "        \"OpenStdin\": false,"
-    "        \"MacAddress\": \"\","
-    "        \"User\": \"\","
-    "        \"VolumeDriver\": \"\","
-    "        \"AttachStderr\": false,"
-    "        \"AttachStdout\": false,"
-    "        \"PublishService\": \"\","
-    "        \"NetworkDisabled\": false,"
-    "        \"StdinOnce\": false,"
-    "        \"Cmd\": ["
-    "            \"sh\""
-    "        ],"
-    "        \"WorkingDir\": \"\","
-    "        \"AttachStdin\": false,"
-    "        \"Volumes\": null,"
-    "        \"Tty\": false,"
-    "        \"Domainname\": \"\","
-    "        \"Image\": "
-    "\"cfa753dfea5e68a24366dfba16e6edf573daa447abf65bc11619c1a98a3aff54\","
-    "        \"Labels\": null,"
-    "        \"ExposedPorts\": null"
-    "    },"
-    "    \"container_config\": {"
-    "        \"Hostname\": \"5f8e0e129ff1\","
-    "        \"Entrypoint\": ["
-    "            \"./bin/start\""
-    "        ],"
-    "        \"Env\": ["
-    "            \"LANG=C.UTF-8\","
-    "            \"JAVA_VERSION=8u66\","
-    "            \"JAVA_DEBIAN_VERSION=8u66-b01-1~bpo8+1\","
-    "            \"CA_CERTIFICATES_JAVA_VERSION=20140324\""
-    "        ],"
-    "        \"OnBuild\": null,"
-    "        \"OpenStdin\": false,"
-    "        \"MacAddress\": \"\","
-    "        \"User\": \"\","
-    "        \"VolumeDriver\": \"\","
-    "        \"AttachStderr\": false,"
-    "        \"AttachStdout\": false,"
-    "        \"PublishService\": \"\","
-    "        \"NetworkDisabled\": false,"
-    "        \"StdinOnce\": false,"
-    "        \"Cmd\": ["
-    "            \"/bin/sh\","
-    "            \"-c\","
-    "            \"#(nop) CMD [\\\"sh\\\"]\""
-    "        ],"
-    "        \"WorkingDir\": \"/marathon\","
-    "        \"AttachStdin\": false,"
-    "        \"Volumes\": null,"
-    "        \"Tty\": false,"
-    "        \"Domainname\": \"\","
-    "        \"Image\": "
-    "\"cfa753dfea5e68a24366dfba16e6edf573daa447abf65bc11619c1a98a3aff54\","
-    "        \"Labels\": null,"
-    "        \"ExposedPorts\": null"
-    "    },"
-    "    \"architecture\": \"amd64\","
-    "    \"docker_version\": \"1.8.2\","
-    "    \"os\": \"linux\","
-    "    \"id\": "
-    "\"d7057cb020844f245031d27b76cb18af05db1cc3a96a29fa7777af75f5ac91a3\","
-    "    \"Size\": 0"
-    "}").get();
-
-  Try<JSON::Object> json = JSON::parse<JSON::Object>(stringify(manifestJson));
-  ASSERT_SOME(json);
-
-  Try<spec::v1::ImageManifest> manifest = spec::v1::parse(json.get());
-  ASSERT_SOME(manifest);
-
-  EXPECT_EQ(
-      "7f652467f9e6d1b3bf51172868b9b0c2fa1c711b112f4e987029b1624dd6295f",
-      manifest.get().container());
-  EXPECT_EQ(
-      "cfa753dfea5e68a24366dfba16e6edf573daa447abf65bc11619c1a98a3aff54",
-      manifest.get().parent());
-
-  EXPECT_EQ(
-      "./bin/start",
-      manifest.get().container_config().entrypoint(0));
-
-  EXPECT_EQ(
-      "LANG=C.UTF-8",
-      manifest.get().container_config().env(0));
-  EXPECT_EQ(
-      "JAVA_VERSION=8u66",
-      manifest.get().container_config().env(1));
-  EXPECT_EQ(
-      "JAVA_DEBIAN_VERSION=8u66-b01-1~bpo8+1",
-      manifest.get().container_config().env(2));
-  EXPECT_EQ(
-      "CA_CERTIFICATES_JAVA_VERSION=20140324",
-      manifest.get().container_config().env(3));
-
-  EXPECT_EQ("/bin/sh", manifest.get().container_config().cmd(0));
-  EXPECT_EQ("-c", manifest.get().container_config().cmd(1));
-  EXPECT_EQ(
-      "#(nop) CMD [\"sh\"]",
-      manifest.get().container_config().cmd(2));
-
-  EXPECT_EQ("sh", manifest.get().config().cmd(0));
-
-  EXPECT_EQ("1.8.2", manifest.get().docker_version());
-  EXPECT_EQ("amd64", manifest.get().architecture());
-  EXPECT_EQ("linux", manifest.get().os());
-  EXPECT_EQ(0u, manifest.get().size());
-}
-
-
-TEST_F(DockerSpecTest, SerializeV2DockerManifest)
-{
-  JSON::Value manifestJson = JSON::parse(
-    "{"
-    "   \"name\": \"dmcgowan/test-image\","
-    "   \"tag\": \"latest\","
-    "   \"architecture\": \"amd64\","
-    "   \"fsLayers\": ["
-    "      {"
-    "         \"blobSum\": "
-  "\"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\""
-    "      },"
-    "      {"
-    "         \"blobSum\": "
-  "\"sha256:cea0d2071b01b0a79aa4a05ea56ab6fdf3fafa03369d9f4eea8d46ea33c43e5f\""
-    "      },"
-    "      {"
-    "         \"blobSum\": "
-  "\"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\""
-    "      },"
-    "      {"
-    "         \"blobSum\": "
-  "\"sha256:2a7812e636235448785062100bb9103096aa6655a8f6bb9ac9b13fe8290f66df\""
-    "      }"
-    "   ],"
-    "   \"history\": ["
-    "      {"
-    "         \"v1Compatibility\": "
-    "           {"
-    "             \"id\": "
-    "\"2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\","
-    "             \"parent\": "
-    "\"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\""
-    "           }"
-    "      },"
-    "      {"
-    "         \"v1Compatibility\": "
-    "           {"
-    "             \"id\": "
-    "\"2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\","
-    "             \"parent\": "
-    "\"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\""
-    "           }"
-    "      },"
-    "      {"
-    "         \"v1Compatibility\": "
-    "           {"
-    "             \"id\": "
-    "\"2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\","
-    "             \"parent\": "
-    "\"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\""
-    "           }"
-    "      },"
-    "      {"
-    "         \"v1Compatibility\": "
-    "           {"
-    "             \"id\": "
-    "\"2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\","
-    "             \"parent\": "
-    "\"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\""
-    "           }"
-    "      }"
-    "   ],"
-    "   \"schemaVersion\": 1,"
-    "   \"signatures\": ["
-    "      {"
-    "         \"header\": {"
-    "            \"jwk\": {"
-    "               \"crv\": \"P-256\","
-    "               \"kid\": "
-    "\"LYRA:YAG2:QQKS:376F:QQXY:3UNK:SXH7:K6ES:Y5AU:XUN5:ZLVY:KBYL\","
-    "               \"kty\": \"EC\","
-    "               \"x\": \"Cu_UyxwLgHzE9rvlYSmvVdqYCXY42E9eNhBb0xNv0SQ\","
-    "               \"y\": \"zUsjWJkeKQ5tv7S-hl1Tg71cd-CqnrtiiLxSi6N_yc8\""
-    "            },"
-    "            \"alg\": \"ES256\""
-    "         },"
-    "         \"signature\": \"m3bgdBXZYRQ4ssAbrgj8Kjl7GNgrKQvmCSY-00yzQosKi-8"
-    "UBrIRrn3Iu5alj82B6u_jNrkGCjEx3TxrfT1rig\","
-    "         \"protected\": \"eyJmb3JtYXRMZW5ndGgiOjYwNjMsImZvcm1hdFRhaWwiOiJ"
-    "DbjAiLCJ0aW1lIjoiMjAxNC0wOS0xMVQxNzoxNDozMFoifQ\""
-    "      }"
-    "   ]"
-    "}").get();
-
-  Try<JSON::Object> json = JSON::parse<JSON::Object>(stringify(manifestJson));
-  ASSERT_SOME(json);
-
-  Try<spec::v2::ImageManifest> manifest = spec::v2::parse(json.get());
-  ASSERT_SOME(manifest);
-
-  EXPECT_EQ(manifest.get().name(), "dmcgowan/test-image");
-  EXPECT_EQ(manifest.get().tag(), "latest");
-  EXPECT_EQ(manifest.get().architecture(), "amd64");
-
-  EXPECT_EQ(manifest.get().fslayers(0).blobsum(),
-    "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
-  EXPECT_EQ(manifest.get().fslayers(1).blobsum(),
-    "sha256:cea0d2071b01b0a79aa4a05ea56ab6fdf3fafa03369d9f4eea8d46ea33c43e5f");
-  EXPECT_EQ(manifest.get().fslayers(2).blobsum(),
-    "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
-  EXPECT_EQ(manifest.get().fslayers(3).blobsum(),
-    "sha256:2a7812e636235448785062100bb9103096aa6655a8f6bb9ac9b13fe8290f66df");
-
-  EXPECT_EQ(manifest.get().history(1).v1compatibility().id(),
-    "2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea");
-  EXPECT_EQ(manifest.get().history(2).v1compatibility().parent(),
-    "cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff");
-
-  EXPECT_EQ(manifest.get().schemaversion(), 1u);
-
-  EXPECT_EQ(manifest.get().signatures(0).header().jwk().kid(),
-    "LYRA:YAG2:QQKS:376F:QQXY:3UNK:SXH7:K6ES:Y5AU:XUN5:ZLVY:KBYL");
-  EXPECT_EQ(manifest.get().signatures(0).signature(),
-    "m3bgdBXZYRQ4ssAbrgj8Kjl7GNgrKQvmCSY-00yzQosKi-8"
-    "UBrIRrn3Iu5alj82B6u_jNrkGCjEx3TxrfT1rig");
-}
-
-// Test invalid JSON object, expecting an error.
-TEST_F(DockerSpecTest, SerializeV2DockerInvalidManifest)
-{
-  // This is an invalid manifest. The repeated fields 'history' and 'fsLayers'
-  // must be >= 1. The 'signatures' and 'schemaVersion' are not set.
-  JSON::Value manifestJson = JSON::parse(
-    "{"
-    "   \"name\": \"dmcgowan/test-image\","
-    "   \"tag\": \"latest\","
-    "   \"architecture\": \"amd64\""
-    "}").get();
-
-  Try<JSON::Object> json = JSON::parse<JSON::Object>(stringify(manifestJson));
-  ASSERT_SOME(json);
-
-
-  Try<spec::v2::ImageManifest> manifest = spec::v2::parse(json.get());
-  EXPECT_ERROR(manifest);
-}
-
-// Test Manifest Validation with empty repeated 'fsLayers' field.
-TEST_F(DockerSpecTest, ValidationV2DockerManifestFsLayersNonEmpty)
-{
-  JSON::Value manifestJson = JSON::parse(
-    "{"
-    "   \"name\": \"dmcgowan/test-image\","
-    "   \"tag\": \"latest\","
-    "   \"architecture\": \"amd64\","
-    "   \"schemaVersion\": 1,"
-    "   \"signatures\": ["
-    "      {"
-    "         \"header\": {"
-    "            \"jwk\": {"
-    "               \"crv\": \"P-256\","
-    "               \"kid\": "
-    "\"LYRA:YAG2:QQKS:376F:QQXY:3UNK:SXH7:K6ES:Y5AU:XUN5:ZLVY:KBYL\","
-    "               \"kty\": \"EC\","
-    "               \"x\": \"Cu_UyxwLgHzE9rvlYSmvVdqYCXY42E9eNhBb0xNv0SQ\","
-    "               \"y\": \"zUsjWJkeKQ5tv7S-hl1Tg71cd-CqnrtiiLxSi6N_yc8\""
-    "            },"
-    "            \"alg\": \"ES256\""
-    "         },"
-    "         \"signature\": \"m3bgdBXZYRQ4ssAbrgj8Kjl7GNgrKQvmCSY-00yzQosKi-8"
-    "UBrIRrn3Iu5alj82B6u_jNrkGCjEx3TxrfT1rig\","
-    "         \"protected\": \"eyJmb3JtYXRMZW5ndGgiOjYwNjMsImZvcm1hdFRhaWwiOiJ"
-    "DbjAiLCJ0aW1lIjoiMjAxNC0wOS0xMVQxNzoxNDozMFoifQ\""
-    "      }"
-    "   ]"
-    "}").get();
-
-  Try<JSON::Object> json = JSON::parse<JSON::Object>(stringify(manifestJson));
-  ASSERT_SOME(json);
-
-  Try<spec::v2::ImageManifest> manifest = spec::v2::parse(json.get());
-  EXPECT_ERROR(manifest);
-}
-
-// Test Manifest Validation with empty repeated 'signatures' field.
-TEST_F(DockerSpecTest, ValidationV2DockerManifestSignaturesNonEmpty)
-{
-  JSON::Value manifestJson = JSON::parse(
-    "{"
-    "   \"name\": \"dmcgowan/test-image\","
-    "   \"tag\": \"latest\","
-    "   \"architecture\": \"amd64\","
-    "   \"fsLayers\": ["
-    "      {"
-    "         \"blobSum\": "
-  "\"sha256:2a7812e636235448785062100bb9103096aa6655a8f6bb9ac9b13fe8290f66df\""
-    "      }"
-    "   ],"
-    "   \"schemaVersion\": 1"
-    "}").get();
-
-  Try<JSON::Object> json = JSON::parse<JSON::Object>(stringify(manifestJson));
-  ASSERT_SOME(json);
-
-  Try<spec::v2::ImageManifest> manifest = spec::v2::parse(json.get());
-  EXPECT_ERROR(manifest);
-}
-
-
 #ifdef USE_SSL_SOCKET
 
 // Test suite for docker registry tests.