#[cfg(feature = "integration-test")]
mod common;
#[cfg(feature = "integration-test")]
mod test {
use std::collections::HashSet;
use bytes::Bytes;
use hdfs_native::{
ClientBuilder, WriteOptions,
minidfs::{DfsFeatures, MiniDfs},
};
use serial_test::serial;
#[tokio::test]
#[serial]
async fn test_read_encrypted_file() {
let _ = env_logger::builder().is_test(true).try_init();
let features = HashSet::from([DfsFeatures::Kms]);
let _dfs = MiniDfs::with_features(&features);
let client = ClientBuilder::new().build().unwrap();
let expected = b"hdfs-native TDE round-trip test payload";
let reader = client.read("/ezone/file").await.unwrap();
let got = reader.read_range(0, expected.len()).await.unwrap();
assert_eq!(got.as_ref(), expected);
}
#[tokio::test]
#[serial]
async fn test_write_then_read_encrypted_file() {
let _ = env_logger::builder().is_test(true).try_init();
let features = HashSet::from([DfsFeatures::Kms]);
let _dfs = MiniDfs::with_features(&features);
let client = ClientBuilder::new().build().unwrap();
let plaintext: Vec<u8> = (0..2048u32).map(|i| i as u8).collect();
let path = "/ezone/written-by-rust";
let mut writer = client.create(path, WriteOptions::default()).await.unwrap();
writer
.write_bytes(Bytes::from(plaintext.clone()))
.await
.unwrap();
writer.close().await.unwrap();
let reader = client.read(path).await.unwrap();
let got = reader.read_range(0, plaintext.len()).await.unwrap();
assert_eq!(got.as_ref(), plaintext.as_slice());
}
#[tokio::test]
#[serial]
async fn test_kms_kerberos_spnego() {
let _ = env_logger::builder().is_test(true).try_init();
let features = HashSet::from([DfsFeatures::Security, DfsFeatures::Kms]);
let _dfs = MiniDfs::with_features(&features);
let client = ClientBuilder::new().build().unwrap();
let expected = b"hdfs-native TDE round-trip test payload";
let reader = client.read("/ezone/file").await.unwrap();
let got = reader.read_range(0, expected.len()).await.unwrap();
assert_eq!(got.as_ref(), expected);
let plaintext: Vec<u8> = (0..2048u32).map(|i| i as u8).collect();
let path = "/ezone/written-by-rust-kerberos";
let mut writer = client.create(path, WriteOptions::default()).await.unwrap();
writer
.write_bytes(Bytes::from(plaintext.clone()))
.await
.unwrap();
writer.close().await.unwrap();
let reader = client.read(path).await.unwrap();
let got = reader.read_range(0, plaintext.len()).await.unwrap();
assert_eq!(got.as_ref(), plaintext.as_slice());
}
#[tokio::test]
#[serial]
async fn test_append_to_encrypted_file() {
let _ = env_logger::builder().is_test(true).try_init();
let features = HashSet::from([DfsFeatures::Kms]);
let _dfs = MiniDfs::with_features(&features);
let client = ClientBuilder::new().build().unwrap();
let part1 = b"first chunk -- ".to_vec();
let part2 = b"second chunk that crosses a 16-byte CTR boundary or two".to_vec();
let path = "/ezone/appended";
let mut writer = client.create(path, WriteOptions::default()).await.unwrap();
writer
.write_bytes(Bytes::from(part1.clone()))
.await
.unwrap();
writer.close().await.unwrap();
let mut appender = client.append(path).await.unwrap();
appender
.write_bytes(Bytes::from(part2.clone()))
.await
.unwrap();
appender.close().await.unwrap();
let mut expected = part1;
expected.extend_from_slice(&part2);
let reader = client.read(path).await.unwrap();
let got = reader.read_range(0, expected.len()).await.unwrap();
assert_eq!(got.as_ref(), expected.as_slice());
}
}