root chain update
diff --git a/src/client.rs b/src/client.rs
index 32fa253..839d945 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -547,3 +547,113 @@
         }
     }
 }
+
+#[cfg(test)]
+mod test {
+    use super::*;
+    use chrono::prelude::*;
+    use crypto::{PrivateKey, SignatureScheme};
+    use interchange::JsonDataInterchange;
+    use metadata::{RootMetadata, SignedMetadata, RoleDefinition, MetadataPath, MetadataVersion};
+    use repository::EphemeralRepository;
+
+    lazy_static! {
+        static ref KEYS: Vec<PrivateKey> = {
+            let keys: &[&[u8]] = &[
+                include_bytes!("../tests/ed25519/ed25519-1.pk8.der"),
+                include_bytes!("../tests/ed25519/ed25519-2.pk8.der"),
+                include_bytes!("../tests/ed25519/ed25519-3.pk8.der"),
+                include_bytes!("../tests/ed25519/ed25519-4.pk8.der"),
+                include_bytes!("../tests/ed25519/ed25519-5.pk8.der"),
+                include_bytes!("../tests/ed25519/ed25519-6.pk8.der"),
+            ];
+            keys.iter().map(|b| PrivateKey::from_pkcs8(b).unwrap()).collect()
+        };
+    }
+
+    #[test]
+    fn root_chain_update() {
+        let mut repo = EphemeralRepository::new();
+        let root = RootMetadata::new(
+            1,
+            Utc.ymd(2038, 1, 1).and_hms(0, 0, 0),
+            false,
+            vec![KEYS[0].public().clone()],
+            RoleDefinition::new(1, hashset!(KEYS[0].key_id().clone())).unwrap(),
+            RoleDefinition::new(1, hashset!(KEYS[0].key_id().clone())).unwrap(),
+            RoleDefinition::new(1, hashset!(KEYS[0].key_id().clone())).unwrap(),
+            RoleDefinition::new(1, hashset!(KEYS[0].key_id().clone())).unwrap(),
+        ).unwrap();
+        let root: SignedMetadata<JsonDataInterchange, RootMetadata> =
+            SignedMetadata::new(&root, &KEYS[0], SignatureScheme::Ed25519).unwrap();
+
+        repo.store_metadata(
+            &Role::Root,
+            &MetadataPath::from_role(&Role::Root),
+            &MetadataVersion::Number(1),
+            &root,
+        ).unwrap();
+
+        let tuf = Tuf::from_root(root).unwrap();
+
+        let root = RootMetadata::new(
+            2,
+            Utc.ymd(2038, 1, 1).and_hms(0, 0, 0),
+            false,
+            vec![KEYS[1].public().clone()],
+            RoleDefinition::new(1, hashset!(KEYS[1].key_id().clone())).unwrap(),
+            RoleDefinition::new(1, hashset!(KEYS[1].key_id().clone())).unwrap(),
+            RoleDefinition::new(1, hashset!(KEYS[1].key_id().clone())).unwrap(),
+            RoleDefinition::new(1, hashset!(KEYS[1].key_id().clone())).unwrap(),
+        ).unwrap();
+        let mut root: SignedMetadata<JsonDataInterchange, RootMetadata> =
+            SignedMetadata::new(&root, &KEYS[1], SignatureScheme::Ed25519).unwrap();
+
+        root.add_signature(
+            &KEYS[0],
+            SignatureScheme::Ed25519,
+        ).unwrap();
+
+        repo.store_metadata(
+            &Role::Root,
+            &MetadataPath::from_role(&Role::Root),
+            &MetadataVersion::Number(2),
+            &root,
+        ).unwrap();
+
+        let root = RootMetadata::new(
+            3,
+            Utc.ymd(2038, 1, 1).and_hms(0, 0, 0),
+            false,
+            vec![KEYS[2].public().clone()],
+            RoleDefinition::new(1, hashset!(KEYS[2].key_id().clone())).unwrap(),
+            RoleDefinition::new(1, hashset!(KEYS[2].key_id().clone())).unwrap(),
+            RoleDefinition::new(1, hashset!(KEYS[2].key_id().clone())).unwrap(),
+            RoleDefinition::new(1, hashset!(KEYS[2].key_id().clone())).unwrap(),
+        ).unwrap();
+        let mut root: SignedMetadata<JsonDataInterchange, RootMetadata> =
+            SignedMetadata::new(&root, &KEYS[2], SignatureScheme::Ed25519).unwrap();
+
+        root.add_signature(
+            &KEYS[1],
+            SignatureScheme::Ed25519,
+        ).unwrap();
+
+        repo.store_metadata(
+            &Role::Root,
+            &MetadataPath::from_role(&Role::Root),
+            &MetadataVersion::Number(3),
+            &root,
+        ).unwrap();
+        repo.store_metadata(
+            &Role::Root,
+            &MetadataPath::from_role(&Role::Root),
+            &MetadataVersion::None,
+            &root,
+        ).unwrap();
+
+        let mut client = Client::new(tuf, Config::build().finish().unwrap(), repo, EphemeralRepository::new()).unwrap();
+        assert_eq!(client.update_local(), Ok(true));
+        assert_eq!(client.tuf.root().version(), 3);
+    }
+}