config.rs 5.44 KB
Newer Older
Ryan Olson's avatar
Ryan Olson committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

//! Centralized test configuration for v2 block manager.
//!
//! This module provides constants and utilities for consistent testing across
//! all v2 block manager components.

/// Default block size for testing (4 tokens)
///
/// Most tests use 4-token sequences like [100, 101, 102, 103].
/// This size is small enough for easy test data generation while being
/// a valid power-of-2 block size.
pub const DEFAULT_TEST_BLOCK_SIZE: usize = 4;

/// Default number of blocks for testing pools and managers
pub const DEFAULT_TEST_BLOCK_COUNT: usize = 10;

/// Common test block sizes for parameterized testing
///
/// These cover the full range of valid block sizes from 1 to 1024,
/// all being powers of 2 as required by the validation.
pub const TEST_BLOCK_SIZES: &[usize] = &[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024];

/// Small set of block sizes for focused testing
pub const COMMON_TEST_BLOCK_SIZES: &[usize] = &[1, 4, 16, 64];

/// Test configuration constants
pub mod constants {

    /// Very small block size for edge case testing
    pub const TINY: usize = 1;

    /// Small block size (our standard)
    pub const SMALL: usize = 4;

    /// Medium block size
    pub const MEDIUM: usize = 16;

    /// Large block size
    pub const LARGE: usize = 64;

    /// Maximum block size
    pub const MAX: usize = 1024;
}

/// Validate that a block size is suitable for testing
///
/// # Arguments
/// * `size` - The block size to validate
///
/// # Returns
/// `true` if the size is a power of 2 between 1 and 1024 (inclusive)
pub fn validate_test_block_size(size: usize) -> bool {
    size.is_power_of_two() && (1..=1024).contains(&size)
}

/// Generate a sequence of tokens for testing with the given block size
///
/// # Arguments
/// * `base` - Starting token value
/// * `block_size` - Number of tokens to generate
///
/// # Returns
/// Vector of tokens: [base, base+1, base+2, ..., base+block_size-1]
///
/// # Example
/// ```
/// use dynamo_kvbm_logical::testing::config::generate_test_tokens;
///
/// let tokens = generate_test_tokens(100, 4);
/// assert_eq!(tokens, vec![100, 101, 102, 103]);
/// ```
pub fn generate_test_tokens(base: u32, block_size: usize) -> Vec<u32> {
    (base..base + block_size as u32).collect()
}

/// Generate unique token sequences for multiple blocks
///
/// # Arguments
/// * `count` - Number of token sequences to generate
/// * `block_size` - Size of each token sequence
///
/// # Returns
/// Vector of token vectors, each with unique values
///
/// # Example
/// ```
/// use dynamo_kvbm_logical::testing::config::generate_unique_token_sequences;
///
/// let sequences = generate_unique_token_sequences(2, 4);
/// assert_eq!(sequences.len(), 2);
/// assert_eq!(sequences[0], vec![0, 1, 2, 3]);
/// assert_eq!(sequences[1], vec![1000, 1001, 1002, 1003]);
/// ```
pub fn generate_unique_token_sequences(count: usize, block_size: usize) -> Vec<Vec<u32>> {
    (0..count)
        .map(|i| generate_test_tokens(i as u32 * 1000, block_size))
        .collect()
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_validate_test_block_size() {
        // Valid sizes
        assert!(validate_test_block_size(1));
        assert!(validate_test_block_size(4));
        assert!(validate_test_block_size(16));
        assert!(validate_test_block_size(1024));

        // Invalid sizes
        assert!(!validate_test_block_size(0));
        assert!(!validate_test_block_size(3)); // Not power of 2
        assert!(!validate_test_block_size(5)); // Not power of 2
        assert!(!validate_test_block_size(2048)); // Too large
    }

    #[test]
    fn test_generate_test_tokens() {
        let tokens = generate_test_tokens(100, 4);
        assert_eq!(tokens, vec![100, 101, 102, 103]);

        let tokens = generate_test_tokens(0, 1);
        assert_eq!(tokens, vec![0]);
    }

    #[test]
    fn test_generate_unique_token_sequences() {
        let sequences = generate_unique_token_sequences(3, 2);
        assert_eq!(sequences.len(), 3);
        assert_eq!(sequences[0], vec![0, 1]);
        assert_eq!(sequences[1], vec![1000, 1001]);
        assert_eq!(sequences[2], vec![2000, 2001]);

        // Ensure all sequences are unique
        for i in 0..sequences.len() {
            for j in (i + 1)..sequences.len() {
                assert_ne!(sequences[i], sequences[j]);
            }
        }
    }

    #[test]
    fn test_constants_are_valid() {
        assert!(validate_test_block_size(constants::TINY));
        assert!(validate_test_block_size(constants::SMALL));
        assert!(validate_test_block_size(constants::MEDIUM));
        assert!(validate_test_block_size(constants::LARGE));
        assert!(validate_test_block_size(constants::MAX));
    }

    #[test]
    fn test_block_sizes_arrays_are_valid() {
        for &size in TEST_BLOCK_SIZES {
            assert!(
                validate_test_block_size(size),
                "Invalid test block size: {}",
                size
            );
        }

        for &size in COMMON_TEST_BLOCK_SIZES {
            assert!(
                validate_test_block_size(size),
                "Invalid common test block size: {}",
                size
            );
        }
    }

    #[test]
    fn test_default_constants() {
        assert_eq!(DEFAULT_TEST_BLOCK_SIZE, 4);
        assert_eq!(DEFAULT_TEST_BLOCK_COUNT, 10);
        assert!(validate_test_block_size(DEFAULT_TEST_BLOCK_SIZE));
    }
}