duplicate top-level keys test
diff --git a/src/client.rs b/src/client.rs
index c3fd668..017d143 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -37,7 +37,12 @@
 //!         Some("rustup/1.4.0".into()),
 //!         None);
 //!
-//!     let mut client = Client::with_root_pinned(&key_ids, Config::default(), local, remote).unwrap();
+//!     let mut client = Client::with_root_pinned(
+//!         &key_ids,
+//!         Config::default(),
+//!         local,
+//!         remote,
+//!     ).unwrap();
 //!     let _ = client.update_local().unwrap();
 //!     let _ = client.update_remote().unwrap();
 //! }
diff --git a/src/metadata.rs b/src/metadata.rs
index e0599c3..5bcee7c 100644
--- a/src/metadata.rs
+++ b/src/metadata.rs
@@ -1994,6 +1994,30 @@
         assert!(json::from_value::<RootMetadata>(root_json).is_err());
     }
 
+    // Refuse to deserialize root metadata if it contains duplicate keys
+    #[test]
+    fn deserialize_json_root_duplicate_keys() {
+        let mut root_json = make_root();
+        let dupe = root_json
+            .as_object()
+            .unwrap()
+            .get("keys")
+            .unwrap()
+            .as_array()
+            .unwrap()
+            [0]
+            .clone();
+        root_json
+            .as_object_mut()
+            .unwrap()
+            .get_mut("keys")
+            .unwrap()
+            .as_array_mut()
+            .unwrap()
+            .push(dupe);
+        assert!(json::from_value::<RootMetadata>(root_json).is_err());
+    }
+
     fn set_threshold(value: &mut json::Value, threshold: i32) {
         match value.as_object_mut() {
             Some(obj) => {