Viewing: tests.rs

// SPDX-License-Identifier: MIT

// Copyright (c) 2025 DDN. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

use crate::changelog::{ChangelogBuilder, ChangelogExtraFlag, ChangelogFlag};

#[test]
fn test_changelog_flags() {
    // Test individual flags
    assert_eq!(ChangelogFlag::Follow.bits(), 1);
    assert_eq!(ChangelogFlag::Block.bits(), 2);
    assert_eq!(ChangelogFlag::JobId.bits(), 4);
    assert_eq!(ChangelogFlag::ExtraFlags.bits(), 8);

    #[cfg(feature = "LUSTRE_2_16")]
    assert_eq!(ChangelogFlag::NidBe.bits(), 16);

    // Test flag combinations
    let combined = ChangelogFlag::Follow | ChangelogFlag::Block;
    assert_eq!(combined.bits(), 3);
    assert!(combined.contains(ChangelogFlag::Follow));
    assert!(combined.contains(ChangelogFlag::Block));
    assert!(!combined.contains(ChangelogFlag::JobId));
}

#[test]
fn test_changelog_extra_flags() {
    // Test individual extra flags
    assert_eq!(ChangelogExtraFlag::UidGid.bits(), 1);
    assert_eq!(ChangelogExtraFlag::Nid.bits(), 2);
    assert_eq!(ChangelogExtraFlag::OpenMode.bits(), 4);
    assert_eq!(ChangelogExtraFlag::Xattr.bits(), 8);

    // Test extra flag combinations
    let combined = ChangelogExtraFlag::UidGid | ChangelogExtraFlag::Nid;
    assert_eq!(combined.bits(), 3);
    assert!(combined.contains(ChangelogExtraFlag::UidGid));
    assert!(combined.contains(ChangelogExtraFlag::Nid));
    assert!(!combined.contains(ChangelogExtraFlag::OpenMode));
}

#[test]
fn test_changelog_builder_new() {
    let builder = ChangelogBuilder::new();
    // We can't test much without actually connecting, but we can verify
    // the builder interface works
    let _builder = builder
        .device("test-MDT0000")
        .flags(ChangelogFlag::Follow)
        .extra_flags(ChangelogExtraFlag::UidGid)
        .start_record(12345);
}

#[test]
fn test_changelog_builder_default() {
    let builder1 = ChangelogBuilder::new();
    let builder2 = ChangelogBuilder::default();
    // Can't directly compare builders, but ensure both compile
    drop(builder1);
    drop(builder2);
}

#[test]
fn test_changelog_builder_connect_no_device() {
    let builder = ChangelogBuilder::new().flags(ChangelogFlag::Follow);
    let result = builder.connect();
    assert!(result.is_err());
    assert!(
        result
            .unwrap_err()
            .to_string()
            .contains("device name must be specified")
    );
}

#[test]
fn test_flag_debug() {
    // Test debug formatting
    let flag = ChangelogFlag::Follow | ChangelogFlag::Block;
    let debug_str = format!("{:?}", flag);
    assert!(debug_str.contains("Follow"));
    assert!(debug_str.contains("Block"));

    let extra_flag = ChangelogExtraFlag::UidGid | ChangelogExtraFlag::Nid;
    let debug_str = format!("{:?}", extra_flag);
    assert!(debug_str.contains("UidGid"));
    assert!(debug_str.contains("Nid"));
}

#[test]
fn test_flag_none() {
    let no_flags = ChangelogFlag::none();
    assert_eq!(no_flags.bits(), 0);
    assert!(!no_flags.contains(ChangelogFlag::Follow));

    let no_extra_flags = ChangelogExtraFlag::none();
    assert_eq!(no_extra_flags.bits(), 0);
    assert!(!no_extra_flags.contains(ChangelogExtraFlag::UidGid));
}

#[test]
fn test_flag_all() {
    let all_flags = ChangelogFlag::all_bits();
    assert!(all_flags.contains(ChangelogFlag::Follow));
    assert!(all_flags.contains(ChangelogFlag::Block));
    assert!(all_flags.contains(ChangelogFlag::JobId));
    assert!(all_flags.contains(ChangelogFlag::ExtraFlags));
    #[cfg(feature = "LUSTRE_2_16")]
    assert!(all_flags.contains(ChangelogFlag::NidBe));

    let all_extra_flags = ChangelogExtraFlag::all_bits();
    assert!(all_extra_flags.contains(ChangelogExtraFlag::UidGid));
    assert!(all_extra_flags.contains(ChangelogExtraFlag::Nid));
    assert!(all_extra_flags.contains(ChangelogExtraFlag::OpenMode));
    assert!(all_extra_flags.contains(ChangelogExtraFlag::Xattr));
}