This groups most `wire` feature gated logic into a single module. The nix_daemon module will be gated by a feature that adds nix-compat-derive as a dependency. All of this is a way to break the crate2nix dependency cycle between nix-compat and nix-compat-derive(which depends on nix-compat for its doctests). Change-Id: I95938a6f280c11967371ff21f8b5a19e6d3d3805 Reviewed-on: https://cl.tvl.fyi/c/depot/+/12761 Tested-by: BuildkiteCI Reviewed-by: flokli <flokli@flokli.de>
		
			
				
	
	
		
			370 lines
		
	
	
	
		
			8.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			370 lines
		
	
	
	
		
			8.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
use std::fmt;
 | 
						|
 | 
						|
use nix_compat::wire::ser::{
 | 
						|
    mock::{Builder, Error},
 | 
						|
    NixWrite as _,
 | 
						|
};
 | 
						|
use nix_compat_derive::NixSerialize;
 | 
						|
 | 
						|
#[derive(Debug, PartialEq, Eq, NixSerialize)]
 | 
						|
pub struct UnitTest;
 | 
						|
 | 
						|
#[derive(Debug, PartialEq, Eq, NixSerialize)]
 | 
						|
pub struct EmptyTupleTest();
 | 
						|
 | 
						|
#[derive(Debug, PartialEq, Eq, NixSerialize)]
 | 
						|
pub struct StructTest {
 | 
						|
    first: u64,
 | 
						|
    second: String,
 | 
						|
}
 | 
						|
 | 
						|
#[derive(Debug, PartialEq, Eq, NixSerialize)]
 | 
						|
pub struct TupleTest(u64, String);
 | 
						|
 | 
						|
#[derive(Debug, PartialEq, Eq, NixSerialize)]
 | 
						|
pub struct StructVersionTest {
 | 
						|
    test: u64,
 | 
						|
    #[nix(version = "20..")]
 | 
						|
    hello: String,
 | 
						|
}
 | 
						|
 | 
						|
fn default_test() -> StructVersionTest {
 | 
						|
    StructVersionTest {
 | 
						|
        test: 89,
 | 
						|
        hello: String::from("klomp"),
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
#[derive(Debug, PartialEq, Eq, NixSerialize)]
 | 
						|
pub struct TupleVersionTest(u64, #[nix(version = "25..")] String);
 | 
						|
 | 
						|
#[derive(Debug, PartialEq, Eq, NixSerialize)]
 | 
						|
pub struct TupleVersionDefaultTest(u64, #[nix(version = "..25")] StructVersionTest);
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_unit() {
 | 
						|
    let mut mock = Builder::new().build();
 | 
						|
    mock.write_value(&UnitTest).await.unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_empty_tuple() {
 | 
						|
    let mut mock = Builder::new().build();
 | 
						|
    mock.write_value(&EmptyTupleTest()).await.unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_struct() {
 | 
						|
    let mut mock = Builder::new()
 | 
						|
        .write_number(89)
 | 
						|
        .write_slice(b"klomp")
 | 
						|
        .build();
 | 
						|
    mock.write_value(&StructTest {
 | 
						|
        first: 89,
 | 
						|
        second: String::from("klomp"),
 | 
						|
    })
 | 
						|
    .await
 | 
						|
    .unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_tuple() {
 | 
						|
    let mut mock = Builder::new()
 | 
						|
        .write_number(89)
 | 
						|
        .write_slice(b"klomp")
 | 
						|
        .build();
 | 
						|
    mock.write_value(&TupleTest(89, String::from("klomp")))
 | 
						|
        .await
 | 
						|
        .unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_struct_version() {
 | 
						|
    let mut mock = Builder::new()
 | 
						|
        .version((1, 20))
 | 
						|
        .write_number(89)
 | 
						|
        .write_slice(b"klomp")
 | 
						|
        .build();
 | 
						|
    mock.write_value(&default_test()).await.unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_struct_without_version() {
 | 
						|
    let mut mock = Builder::new().version((1, 19)).write_number(89).build();
 | 
						|
    mock.write_value(&StructVersionTest {
 | 
						|
        test: 89,
 | 
						|
        hello: String::new(),
 | 
						|
    })
 | 
						|
    .await
 | 
						|
    .unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_tuple_version() {
 | 
						|
    let mut mock = Builder::new()
 | 
						|
        .version((1, 26))
 | 
						|
        .write_number(89)
 | 
						|
        .write_slice(b"klomp")
 | 
						|
        .build();
 | 
						|
    mock.write_value(&TupleVersionTest(89, "klomp".into()))
 | 
						|
        .await
 | 
						|
        .unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_tuple_without_version() {
 | 
						|
    let mut mock = Builder::new().version((1, 19)).write_number(89).build();
 | 
						|
    mock.write_value(&TupleVersionTest(89, String::new()))
 | 
						|
        .await
 | 
						|
        .unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_complex_1() {
 | 
						|
    let mut mock = Builder::new()
 | 
						|
        .version((1, 19))
 | 
						|
        .write_number(999)
 | 
						|
        .write_number(666)
 | 
						|
        .build();
 | 
						|
    mock.write_value(&TupleVersionDefaultTest(
 | 
						|
        999,
 | 
						|
        StructVersionTest {
 | 
						|
            test: 666,
 | 
						|
            hello: String::new(),
 | 
						|
        },
 | 
						|
    ))
 | 
						|
    .await
 | 
						|
    .unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_complex_2() {
 | 
						|
    let mut mock = Builder::new()
 | 
						|
        .version((1, 20))
 | 
						|
        .write_number(999)
 | 
						|
        .write_number(666)
 | 
						|
        .write_slice(b"The quick brown \xF0\x9F\xA6\x8A jumps over 13 lazy \xF0\x9F\x90\xB6.")
 | 
						|
        .build();
 | 
						|
    mock.write_value(&TupleVersionDefaultTest(
 | 
						|
        999,
 | 
						|
        StructVersionTest {
 | 
						|
            test: 666,
 | 
						|
            hello: String::from("The quick brown 🦊 jumps over 13 lazy 🐶."),
 | 
						|
        },
 | 
						|
    ))
 | 
						|
    .await
 | 
						|
    .unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_complex_3() {
 | 
						|
    let mut mock = Builder::new().version((1, 25)).write_number(999).build();
 | 
						|
    mock.write_value(&TupleVersionDefaultTest(
 | 
						|
        999,
 | 
						|
        StructVersionTest {
 | 
						|
            test: 89,
 | 
						|
            hello: String::from("klomp"),
 | 
						|
        },
 | 
						|
    ))
 | 
						|
    .await
 | 
						|
    .unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_complex_4() {
 | 
						|
    let mut mock = Builder::new().version((1, 26)).write_number(999).build();
 | 
						|
    mock.write_value(&TupleVersionDefaultTest(
 | 
						|
        999,
 | 
						|
        StructVersionTest {
 | 
						|
            test: 89,
 | 
						|
            hello: String::from("klomp"),
 | 
						|
        },
 | 
						|
    ))
 | 
						|
    .await
 | 
						|
    .unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[derive(Debug, PartialEq, Eq, NixSerialize)]
 | 
						|
#[nix(display)]
 | 
						|
struct TestFromStr;
 | 
						|
 | 
						|
impl fmt::Display for TestFromStr {
 | 
						|
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 | 
						|
        write!(f, "test")
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_display() {
 | 
						|
    let mut mock = Builder::new().write_display("test").build();
 | 
						|
    mock.write_value(&TestFromStr).await.unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[derive(Debug, PartialEq, Eq, NixSerialize)]
 | 
						|
#[nix(display = "TestFromStr2::display")]
 | 
						|
struct TestFromStr2;
 | 
						|
struct TestFromStrDisplay;
 | 
						|
 | 
						|
impl fmt::Display for TestFromStrDisplay {
 | 
						|
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 | 
						|
        write!(f, "test")
 | 
						|
    }
 | 
						|
}
 | 
						|
impl TestFromStr2 {
 | 
						|
    fn display(&self) -> TestFromStrDisplay {
 | 
						|
        TestFromStrDisplay
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_display_path() {
 | 
						|
    let mut mock = Builder::new().write_display("test").build();
 | 
						|
    mock.write_value(&TestFromStr2).await.unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[derive(Clone, Debug, PartialEq, Eq, NixSerialize)]
 | 
						|
#[nix(try_into = "u64")]
 | 
						|
struct TestTryFromU64(u64);
 | 
						|
 | 
						|
impl TryFrom<TestTryFromU64> for u64 {
 | 
						|
    type Error = u64;
 | 
						|
 | 
						|
    fn try_from(value: TestTryFromU64) -> Result<Self, Self::Error> {
 | 
						|
        if value.0 != 42 {
 | 
						|
            Ok(value.0)
 | 
						|
        } else {
 | 
						|
            Err(value.0)
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_try_into_u64() {
 | 
						|
    let mut mock = Builder::new().write_number(666).build();
 | 
						|
    mock.write_value(&TestTryFromU64(666)).await.unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_try_into_u64_invalid_data() {
 | 
						|
    let mut mock = Builder::new().build();
 | 
						|
    let err = mock.write_value(&TestTryFromU64(42)).await.unwrap_err();
 | 
						|
    assert_eq!(Error::UnsupportedData("42".into()), err);
 | 
						|
}
 | 
						|
 | 
						|
#[derive(Clone, Debug, PartialEq, Eq, NixSerialize)]
 | 
						|
#[nix(into = "u64")]
 | 
						|
struct TestFromU64;
 | 
						|
 | 
						|
impl From<TestFromU64> for u64 {
 | 
						|
    fn from(_value: TestFromU64) -> u64 {
 | 
						|
        42
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_into_u64() {
 | 
						|
    let mut mock = Builder::new().write_number(42).build();
 | 
						|
    mock.write_value(&TestFromU64).await.unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[derive(Debug, PartialEq, Eq, NixSerialize)]
 | 
						|
enum TestEnum {
 | 
						|
    #[nix(version = "..=19")]
 | 
						|
    Pre20(TestFromU64, #[nix(version = "10..")] u64),
 | 
						|
    #[nix(version = "20..=29")]
 | 
						|
    Post20(StructVersionTest),
 | 
						|
    #[nix(version = "30..=39")]
 | 
						|
    Post30,
 | 
						|
    #[nix(version = "40..")]
 | 
						|
    Post40 {
 | 
						|
        msg: String,
 | 
						|
        #[nix(version = "45..")]
 | 
						|
        level: u64,
 | 
						|
    },
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_enum_9() {
 | 
						|
    let mut mock = Builder::new().version((1, 9)).write_number(42).build();
 | 
						|
    mock.write_value(&TestEnum::Pre20(TestFromU64, 666))
 | 
						|
        .await
 | 
						|
        .unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_enum_19() {
 | 
						|
    let mut mock = Builder::new()
 | 
						|
        .version((1, 19))
 | 
						|
        .write_number(42)
 | 
						|
        .write_number(666)
 | 
						|
        .build();
 | 
						|
    mock.write_value(&TestEnum::Pre20(TestFromU64, 666))
 | 
						|
        .await
 | 
						|
        .unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_enum_20() {
 | 
						|
    let mut mock = Builder::new()
 | 
						|
        .version((1, 20))
 | 
						|
        .write_number(666)
 | 
						|
        .write_slice(b"klomp")
 | 
						|
        .build();
 | 
						|
    mock.write_value(&TestEnum::Post20(StructVersionTest {
 | 
						|
        test: 666,
 | 
						|
        hello: "klomp".into(),
 | 
						|
    }))
 | 
						|
    .await
 | 
						|
    .unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_enum_30() {
 | 
						|
    let mut mock = Builder::new().version((1, 30)).build();
 | 
						|
    mock.write_value(&TestEnum::Post30).await.unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_enum_40() {
 | 
						|
    let mut mock = Builder::new()
 | 
						|
        .version((1, 40))
 | 
						|
        .write_slice(b"hello world")
 | 
						|
        .build();
 | 
						|
    mock.write_value(&TestEnum::Post40 {
 | 
						|
        msg: "hello world".into(),
 | 
						|
        level: 9001,
 | 
						|
    })
 | 
						|
    .await
 | 
						|
    .unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_enum_45() {
 | 
						|
    let mut mock = Builder::new()
 | 
						|
        .version((1, 45))
 | 
						|
        .write_slice(b"hello world")
 | 
						|
        .write_number(9001)
 | 
						|
        .build();
 | 
						|
    mock.write_value(&TestEnum::Post40 {
 | 
						|
        msg: "hello world".into(),
 | 
						|
        level: 9001,
 | 
						|
    })
 | 
						|
    .await
 | 
						|
    .unwrap();
 | 
						|
}
 | 
						|
 | 
						|
#[tokio::test]
 | 
						|
async fn write_wrong_enum() {
 | 
						|
    let mut mock = Builder::new().version((1, 30)).build();
 | 
						|
    let err = mock
 | 
						|
        .write_value(&TestEnum::Post40 {
 | 
						|
            msg: "hello world".into(),
 | 
						|
            level: 9001,
 | 
						|
        })
 | 
						|
        .await
 | 
						|
        .unwrap_err();
 | 
						|
    assert_eq!(
 | 
						|
        err,
 | 
						|
        Error::InvalidEnum("Post40 is not valid for version 1.30".into())
 | 
						|
    )
 | 
						|
}
 |