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);
+ }
+}