refactor: 重构文档结构和文件位置
docs: 添加Redis集成测试文档 docs: 添加ID生成器分析报告 docs: 添加自由布局和固定布局示例文档 test: 添加ID生成器单元测试 fix: 删除重复的前端文档文件
This commit is contained in:
@ -78,4 +78,155 @@ const REQUEST_LOG_SUB_ID: u8 = 1;
|
||||
|
||||
pub fn generate_request_log_id() -> i64 {
|
||||
generate_biz_id(BizIdConfig::new(REQUEST_LOG_MAIN_ID, REQUEST_LOG_SUB_ID))
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use std::thread;
|
||||
use std::time::Duration;
|
||||
use std::collections::HashSet;
|
||||
|
||||
#[test]
|
||||
fn test_id_sequential_generation() {
|
||||
// 测试1: 连续生成ID,验证递增性
|
||||
let mut prev_id = 0i64;
|
||||
for i in 1..=10 {
|
||||
let current_id = generate_id();
|
||||
println!("ID {}: {}", i, current_id);
|
||||
|
||||
if i > 1 {
|
||||
assert!(current_id > prev_id,
|
||||
"ID {} ({}) 应该大于前一个ID {} ({})", i, current_id, i-1, prev_id);
|
||||
}
|
||||
prev_id = current_id;
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_id_time_interval_generation() {
|
||||
// 测试2: 间隔时间生成ID,验证时间戳影响
|
||||
let mut time_based_ids = Vec::new();
|
||||
for i in 1..=5 {
|
||||
let id = generate_id();
|
||||
time_based_ids.push(id);
|
||||
println!("时间间隔ID {}: {}", i, id);
|
||||
thread::sleep(Duration::from_millis(10)); // 减少等待时间以加快测试
|
||||
}
|
||||
|
||||
// 验证时间间隔ID的递增性
|
||||
for i in 1..time_based_ids.len() {
|
||||
assert!(time_based_ids[i] > time_based_ids[i-1],
|
||||
"时间间隔ID {} ({}) 应该大于前一个ID ({})",
|
||||
i+1, time_based_ids[i], time_based_ids[i-1]);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_different_business_id_types() {
|
||||
// 测试3: 不同业务类型ID的递增性
|
||||
let flow_id1 = generate_biz_id(BizIdConfig::new(1, 1));
|
||||
thread::sleep(Duration::from_millis(1));
|
||||
let flow_id2 = generate_biz_id(BizIdConfig::new(1, 1));
|
||||
thread::sleep(Duration::from_millis(1));
|
||||
let log_id1 = generate_biz_id(BizIdConfig::new(2, 1));
|
||||
thread::sleep(Duration::from_millis(1));
|
||||
let log_id2 = generate_biz_id(BizIdConfig::new(2, 1));
|
||||
|
||||
println!("Flow ID 1: {}", flow_id1);
|
||||
println!("Flow ID 2: {}", flow_id2);
|
||||
println!("Log ID 1: {}", log_id1);
|
||||
println!("Log ID 2: {}", log_id2);
|
||||
|
||||
// 验证同类型业务ID递增
|
||||
assert!(flow_id2 > flow_id1, "Flow ID 2 应该大于 Flow ID 1");
|
||||
assert!(log_id2 > log_id1, "Log ID 2 应该大于 Log ID 1");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_concurrent_id_generation() {
|
||||
// 测试4: 多线程并发生成ID测试
|
||||
let handles: Vec<_> = (0..3).map(|thread_id| {
|
||||
thread::spawn(move || {
|
||||
let mut thread_ids = Vec::new();
|
||||
for _ in 0..5 {
|
||||
thread_ids.push(generate_id());
|
||||
thread::sleep(Duration::from_millis(1));
|
||||
}
|
||||
(thread_id, thread_ids)
|
||||
})
|
||||
}).collect();
|
||||
|
||||
let mut all_ids = Vec::new();
|
||||
for handle in handles {
|
||||
let (thread_id, ids) = handle.join().unwrap();
|
||||
println!("线程 {} 生成的ID: {:?}", thread_id, ids);
|
||||
all_ids.extend(ids);
|
||||
}
|
||||
|
||||
// 验证所有ID的唯一性
|
||||
let unique_ids: HashSet<_> = all_ids.iter().collect();
|
||||
assert_eq!(all_ids.len(), unique_ids.len(),
|
||||
"发现重复ID,总数: {}, 唯一数: {}", all_ids.len(), unique_ids.len());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_id_timestamp_parsing() {
|
||||
// 测试5: 解析ID验证时间戳部分
|
||||
let id1 = generate_id();
|
||||
thread::sleep(Duration::from_millis(10));
|
||||
let id2 = generate_id();
|
||||
|
||||
// 提取时间戳部分(低39位中的时间戳)
|
||||
let timestamp1 = id1 & ((1i64 << 39) - 1);
|
||||
let timestamp2 = id2 & ((1i64 << 39) - 1);
|
||||
|
||||
println!("ID1: {}, 时间戳部分: {}", id1, timestamp1);
|
||||
println!("ID2: {}, 时间戳部分: {}", id2, timestamp2);
|
||||
|
||||
// 注意:在同一毫秒内生成的ID,时间戳部分可能相同,但序列号会递增
|
||||
// 所以这里只验证ID2不小于ID1
|
||||
assert!(id2 > id1, "ID2 应该大于 ID1");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_biz_id_parsing() {
|
||||
// 测试6: 业务ID解析功能
|
||||
let config = BizIdConfig::new(123, 45);
|
||||
let id = generate_biz_id(config);
|
||||
|
||||
let (main_id, sub_id, base_id) = parse_biz_id(id);
|
||||
|
||||
assert_eq!(main_id, 123, "解析的main_id应该等于123");
|
||||
assert_eq!(sub_id, 45, "解析的sub_id应该等于45");
|
||||
assert!(base_id > 0, "解析的base_id应该大于0");
|
||||
|
||||
println!("原始ID: {}, 解析结果: main_id={}, sub_id={}, base_id={}",
|
||||
id, main_id, sub_id, base_id);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_specific_id_generators() {
|
||||
// 测试7: 特定业务ID生成器
|
||||
let flow_log_id1 = generate_flow_run_log_id();
|
||||
let flow_log_id2 = generate_flow_run_log_id();
|
||||
let request_log_id1 = generate_request_log_id();
|
||||
let request_log_id2 = generate_request_log_id();
|
||||
|
||||
// 验证递增性
|
||||
assert!(flow_log_id2 > flow_log_id1, "流程日志ID应该递增");
|
||||
assert!(request_log_id2 > request_log_id1, "请求日志ID应该递增");
|
||||
|
||||
// 验证业务类型解析
|
||||
let (main_id, sub_id, _) = parse_biz_id(flow_log_id1);
|
||||
assert_eq!(main_id, FLOW_RUN_LOG_MAIN_ID, "流程日志ID的main_id应该正确");
|
||||
assert_eq!(sub_id, FLOW_RUN_LOG_SUB_ID, "流程日志ID的sub_id应该正确");
|
||||
|
||||
let (main_id, sub_id, _) = parse_biz_id(request_log_id1);
|
||||
assert_eq!(main_id, REQUEST_LOG_MAIN_ID, "请求日志ID的main_id应该正确");
|
||||
assert_eq!(sub_id, REQUEST_LOG_SUB_ID, "请求日志ID的sub_id应该正确");
|
||||
|
||||
println!("流程日志ID: {}, {}", flow_log_id1, flow_log_id2);
|
||||
println!("请求日志ID: {}, {}", request_log_id1, request_log_id2);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user