use flaredb_server::config::{encode_namespaced_key, Config, NamespaceManager}; use flaredb_server::store::Store; use flaredb_storage::rocks_engine::RocksEngine; use flaredb_types::RegionMeta; use std::collections::HashMap; use std::sync::Arc; fn test_peer_addrs() -> Arc> { let mut addrs = HashMap::new(); addrs.insert(1, "127.0.0.1:50051".to_string()); Arc::new(addrs) } #[tokio::test] async fn split_creates_two_regions_and_routes_keys() { let dir = tempfile::TempDir::new().unwrap(); let engine = Arc::new(RocksEngine::new(dir.path().to_str().unwrap()).unwrap()); let config = Config::default(); let namespace_manager = Arc::new(NamespaceManager::from_config(&config)); let ns = namespace_manager.get_namespace("default"); let store = Arc::new(Store::new( 1, engine, Arc::new(config), namespace_manager.clone(), test_peer_addrs(), )); store .bootstrap_regions(vec![( RegionMeta { id: 1, start_key: encode_namespaced_key(ns.id, b""), end_key: Vec::new(), }, vec![1], )]) .await .unwrap(); store .split_region(1, encode_namespaced_key(ns.id, b"m"), 2, vec![1]) .await .unwrap(); let k1 = encode_namespaced_key(ns.id, b"a"); let k2 = encode_namespaced_key(ns.id, b"z"); assert_eq!(store.route_key(&k1).await, Some(1)); assert_eq!(store.route_key(&k2).await, Some(2)); } #[tokio::test] async fn split_rejects_invalid_keys() { let dir = tempfile::TempDir::new().unwrap(); let engine = Arc::new(RocksEngine::new(dir.path().to_str().unwrap()).unwrap()); let config = Config::default(); let namespace_manager = Arc::new(NamespaceManager::from_config(&config)); let ns = namespace_manager.get_namespace("default"); let store = Arc::new(Store::new( 1, engine, Arc::new(config), namespace_manager.clone(), test_peer_addrs(), )); store .bootstrap_regions(vec![( RegionMeta { id: 1, start_key: encode_namespaced_key(ns.id, b""), end_key: Vec::new(), }, vec![1], )]) .await .unwrap(); // split key before start let err = store .split_region(1, encode_namespaced_key(ns.id, b""), 2, vec![1]) .await .unwrap_err(); assert!(err.contains("invalid")); }