commit e97cf6c27689ae457e28527b9df0cbe4d4ad52e1
parent 6db9b48a418302ee4a70aa107dca9ca97a82f52b
Author: lash <dev@holbrook.no>
Date: Sun, 25 Sep 2022 13:08:05 +0000
Add multi digest test for biblatex
Diffstat:
6 files changed, 86 insertions(+), 11 deletions(-)
diff --git a/src/biblatex.rs b/src/biblatex.rs
@@ -19,7 +19,14 @@ use crate::digest::RecordDigest;
use crate::digest::from_urn;
fn parse_digest(entry: &Entry) -> RecordDigest {
- let note = entry.get("note").unwrap();
+ let note = match entry.get("note") {
+ Some(v) => {
+ v
+ },
+ None => {
+ return RecordDigest::Empty;
+ },
+ };
let note_s = String::from_chunks(note).unwrap();
let mut digest_val = note_s.split(":");
@@ -115,6 +122,9 @@ pub fn read_all(mut r: impl Read, digests: &Vec<RecordDigest>) -> Result<Vec<Met
// },
}
+ for v in digests {
+ use_digests.push(v.clone());
+ }
let title = e.title().unwrap();
let title_s = String::from_chunks(title).unwrap();
@@ -142,3 +152,29 @@ pub fn read_all(mut r: impl Read, digests: &Vec<RecordDigest>) -> Result<Vec<Met
}
Ok(rr)
}
+
+#[cfg(test)]
+mod tests {
+ use super::read_all;
+ use crate::digest;
+ use env_logger;
+
+ #[test]
+ fn test_multi_digest() {
+ let d_hex = "acbd18db4cc2f85cedef654fccc4a4d8";
+ let d = digest::RecordDigest::MD5(hex::decode(d_hex).unwrap());
+ let d_sha_hex = "f7fbba6e0636f890e56fbbf3283e524c6fa3204ae298382d624741d0dc6638326e282c41be5e4254d8820772c5518a2c5a8c0c7f7eda19594a7eb539453e1ed7";
+ let d_sha = digest::from_vec(hex::decode(d_sha_hex).unwrap()).unwrap();
+
+ let biblatex_src = "@article{
+ foo,
+ title={bar},
+ author={Guybrush Threepwood},
+}
+";
+ let digests = vec!(d, d_sha);
+ let r = read_all(biblatex_src.as_bytes(), &digests).unwrap();
+
+ assert_eq!(r.len(), 2);
+ }
+}
diff --git a/src/digest.rs b/src/digest.rs
@@ -1,3 +1,5 @@
+use std::marker::Copy;
+
use crate::error::ParseError;
use sha2::{
@@ -17,6 +19,27 @@ pub enum RecordDigest {
Empty,
}
+impl Clone for RecordDigest {
+ fn clone(&self) -> RecordDigest {
+ match self {
+ RecordDigest::Empty => {
+ RecordDigest::Empty
+ },
+ RecordDigest::Sha512(v) => {
+ RecordDigest::Sha512(v.to_vec())
+ },
+ RecordDigest::Sha256(v) => {
+ RecordDigest::Sha256(v.to_vec())
+ },
+ RecordDigest::MD5(v) => {
+ RecordDigest::MD5(v.to_vec())
+ },
+ RecordDigest::SwarmHash(v) => {
+ RecordDigest::SwarmHash(v.to_vec())
+ },
+ }
+ }
+}
/// Create a [RecordDigest::Sha512](RecordDigest::Sha512) instance from the raw digest data.
diff --git a/src/meta.rs b/src/meta.rs
@@ -216,13 +216,13 @@ impl MetaData {
return String::new();
},
digest::RecordDigest::Sha512(v) => {
- return hex::encode(&v);
+ return String::from("sha512:") + hex::encode(&v).as_str();
},
digest::RecordDigest::Sha256(v) => {
- return hex::encode(&v);
+ return String::from("sha256:") + hex::encode(&v).as_str();
},
digest::RecordDigest::MD5(v) => {
- return hex::encode(&v);
+ return String::from("md5:") + hex::encode(&v).as_str();
},
digest::RecordDigest::SwarmHash(v) => {
return hex::encode(&v);
@@ -500,6 +500,7 @@ mod tests {
File,
write
};
+ use crate::digest;
use env_logger;
#[test]
@@ -508,7 +509,7 @@ mod tests {
let meta = MetaData::from_xattr(s).unwrap();
assert_eq!(meta.dc.title, "Bitcoin: A Peer-to-Peer Electronic Cash System");
assert_eq!(meta.dc.author, "Satoshi Nakamoto");
- assert_eq!(meta.fingerprint(), String::from("2ac531ee521cf93f8419c2018f770fbb42c65396178e079a416e7038d3f9ab9fc2c35c4d838bc8b5dd68f4c13759fe9cdf90a46528412fefe1294cb26beabf4e"));
+ assert_eq!(meta.fingerprint(), String::from("sha512:2ac531ee521cf93f8419c2018f770fbb42c65396178e079a416e7038d3f9ab9fc2c35c4d838bc8b5dd68f4c13759fe9cdf90a46528412fefe1294cb26beabf4e"));
}
#[test]
@@ -520,7 +521,8 @@ mod tests {
let fp = f.path();
let fps = String::from(fp.to_str().unwrap());
- let mut m = MetaData::new("foo", "bar", EntryType::Article, digest, Some(fps));
+ let digest_sha = digest::from_vec(digest).unwrap();
+ let mut m = MetaData::new("foo", "bar", EntryType::Article, digest_sha, Some(fps));
m.set_subject("baz");
m.set_mime_str("foo/bar");
m.set_language("nb-NO");
@@ -529,7 +531,7 @@ mod tests {
let m_check = MetaData::from_xattr(fp).unwrap();
assert_eq!(m_check.title(), "foo");
assert_eq!(m_check.author(), "bar");
- assert_eq!(m_check.fingerprint(), digest_hex);
+ assert_eq!(m_check.fingerprint(), String::from("sha512:") + digest_hex);
assert_eq!(m_check.typ(), EntryType::Article);
assert_eq!(m_check.subject().unwrap(), "baz");
assert_eq!(m_check.mime().unwrap(), "foo/bar");
@@ -559,7 +561,14 @@ mod tests {
let f = NamedTempFile::new_in(".").unwrap();
let fp = f.path();
write(&f, &[0, 1, 2, 3]);
- let meta_empty = MetaData::from_xattr(fp).unwrap();
+ let meta_empty = match MetaData::from_xattr(fp) {
+ Ok(v) => {
+ v
+ },
+ Err(e) => {
+ panic!("{:?}", e);
+ },
+ };
assert_eq!(meta_empty.mime().unwrap(), "application/octet-stream");
}
}
diff --git a/src/rdf.rs b/src/rdf.rs
@@ -272,6 +272,7 @@ mod tests {
read,
};
use super::MetaData;
+ use crate::digest;
use std::io::stdout;
use std::fs::File;
use std::default::Default;
@@ -282,7 +283,8 @@ mod tests {
fn test_turtle_write() {
let mut digest = Vec::with_capacity(64);
digest.resize(64, 0x2a);
- let mut m = MetaData::new("foo", "bar", EntryType::Article, Vec::from(digest), None);
+ let digest_sha = digest::from_vec(Vec::from(digest)).unwrap();
+ let mut m = MetaData::new("foo", "bar", EntryType::Article, digest_sha, None);
m.set_subject("baz");
m.set_mime_str("foo/bar");
m.set_language("nb-NO");
diff --git a/src/store.rs b/src/store.rs
@@ -35,13 +35,15 @@ mod tests {
FileStore,
MetaData,
};
+ use crate::digest;
use std::io::Write;
#[test]
fn test_writer() {
let mut digest = Vec::with_capacity(64);
digest.resize(64, 0x2a);
- let m = MetaData::new("foo", "bar", EntryType::Article, Vec::from(digest), None);
+ let digest_sha = digest::from_vec(Vec::from(digest)).unwrap();
+ let m = MetaData::new("foo", "bar", EntryType::Article, digest_sha, None);
let dir = tempdir().unwrap();
let fp = dir.path();
let fs = FileStore::new(&fp);
diff --git a/tests/rdf_test.rs b/tests/rdf_test.rs
@@ -8,6 +8,8 @@ use biblatex::EntryType;
use kitab::rdf::write as rdf_write;
use kitab::meta::MetaData;
+use kitab::digest;
+
#[test]
fn test_rdf_dump() {
@@ -15,6 +17,7 @@ fn test_rdf_dump() {
let w = BufWriter::new(v);
let mut digest: Vec<u8> = Vec::new();
digest.resize(64, 0);
- let metadata = MetaData::new("foo", "Bar Baz", EntryType::Article, digest, None);
+ let digest_sha = digest::from_vec(Vec::from(digest)).unwrap();
+ let metadata = MetaData::new("foo", "Bar Baz", EntryType::Article, digest_sha, None);
let r = rdf_write(&metadata, w);
}