1use anyhow::{anyhow, Result};
7use chrono::{DateTime, Utc};
8use scirs2_core::random::Random;
9use serde::{Deserialize, Serialize};
10use std::collections::HashMap;
11use tokio::sync::{RwLock, Semaphore};
12use tracing::{debug, info, warn};
13
14use crate::event::StreamEvent;
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct QuantumCommConfig {
19 pub max_entangled_pairs: usize,
20 pub decoherence_timeout_ms: u64,
21 pub error_correction_threshold: f64,
22 pub enable_quantum_teleportation: bool,
23 pub enable_superdense_coding: bool,
24 pub quantum_network_topology: NetworkTopology,
25 pub security_protocols: Vec<QuantumSecurityProtocol>,
26 pub entanglement_distribution: EntanglementDistribution,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
31pub enum NetworkTopology {
32 FullyConnected,
33 Star,
34 Ring,
35 Mesh,
36 Hierarchical,
37 AdaptiveHybrid,
38}
39
40#[derive(Debug, Clone, Serialize, Deserialize)]
42pub enum QuantumSecurityProtocol {
43 BB84,
44 E91,
45 SARG04,
46 COW,
47 DPS,
48 ContinuousVariable,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize)]
53pub enum EntanglementDistribution {
54 DirectTransmission,
55 EntanglementSwapping,
56 QuantumRepeaters,
57 SatelliteBased,
58 HybridClassicalQuantum,
59}
60
61#[derive(Debug, Clone, Serialize, Deserialize)]
63pub struct Qubit {
64 pub id: String,
65 pub state: QuantumState,
66 pub entanglement_partner: Option<String>,
67 pub coherence_time_remaining_ms: u64,
68 pub measurement_history: Vec<MeasurementResult>,
69 pub created_at: DateTime<Utc>,
70 pub last_operation: Option<QuantumOperation>,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
75pub struct QuantumState {
76 pub alpha: Complex64, pub beta: Complex64, pub phase: f64,
79 pub purity: f64, pub fidelity: f64, }
82
83#[derive(Debug, Clone, Serialize, Deserialize)]
85pub struct Complex64 {
86 pub real: f64,
87 pub imag: f64,
88}
89
90#[derive(Debug, Clone, Serialize, Deserialize)]
92pub enum QuantumOperation {
93 PauliX,
94 PauliY,
95 PauliZ,
96 Hadamard,
97 Phase(f64),
98 Rotation { axis: String, angle: f64 },
99 CNOT { control: String, target: String },
100 Measurement { basis: MeasurementBasis },
101 Teleportation { target_node: String },
102 ErrorCorrection,
103 StatePreparation { target_state: QuantumState },
104}
105
106#[derive(Debug, Clone, Serialize, Deserialize)]
108pub enum MeasurementBasis {
109 Computational, Diagonal, Circular, Custom { theta: f64, phi: f64 },
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize)]
117pub struct MeasurementResult {
118 pub timestamp: DateTime<Utc>,
119 pub basis: MeasurementBasis,
120 pub outcome: u8, pub confidence: f64,
122 pub post_measurement_state: Option<QuantumState>,
123}
124
125#[derive(Debug, Clone)]
127pub struct EntangledPair {
128 pub pair_id: String,
129 pub qubit_a: Qubit,
130 pub qubit_b: Qubit,
131 pub entanglement_fidelity: f64,
132 pub creation_time: DateTime<Utc>,
133 pub last_used: DateTime<Utc>,
134 pub usage_count: u64,
135 pub bell_state: BellState,
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize)]
140pub enum BellState {
141 PhiPlus, PhiMinus, PsiPlus, PsiMinus, }
146
147#[derive(Debug, Clone)]
149pub struct QuantumChannel {
150 pub channel_id: String,
151 pub source_node: String,
152 pub destination_node: String,
153 pub entangled_pairs: Vec<String>,
154 pub channel_fidelity: f64,
155 pub transmission_rate_qubits_per_sec: f64,
156 pub error_rate: f64,
157 pub channel_capacity: f64,
158 pub quantum_protocol: QuantumSecurityProtocol,
159 pub classical_channel: Option<String>, }
161
162#[derive(Debug, Clone)]
164pub struct QuantumErrorCorrection {
165 pub code_type: ErrorCorrectionCode,
166 pub logical_qubits: usize,
167 pub physical_qubits: usize,
168 pub threshold_error_rate: f64,
169 pub correction_rounds: u32,
170 pub syndrome_measurements: Vec<SyndromeMeasurement>,
171}
172
173#[derive(Debug, Clone, Serialize, Deserialize)]
175pub enum ErrorCorrectionCode {
176 SteaneCode, ShorCode, Surface, ColorCode, BCH, LDPC, Stabilizer, }
184
185#[derive(Debug, Clone)]
187pub struct SyndromeMeasurement {
188 pub timestamp: DateTime<Utc>,
189 pub stabilizer_generators: Vec<String>,
190 pub syndrome_bits: Vec<u8>,
191 pub detected_errors: Vec<ErrorType>,
192 pub correction_applied: bool,
193}
194
195#[derive(Debug, Clone, Serialize, Deserialize)]
197pub enum ErrorType {
198 BitFlip,
199 PhaseFlip,
200 Depolarizing,
201 AmplitudeDamping,
202 PhaseDamping,
203 Decoherence,
204 Crosstalk,
205}
206
207#[derive(Debug, Clone)]
209pub struct TeleportationProtocol {
210 pub protocol_id: String,
211 pub source_qubit: String,
212 pub entangled_pair: String,
213 pub classical_bits: Vec<u8>,
214 pub destination_node: String,
215 pub fidelity_achieved: f64,
216 pub protocol_duration_us: u64,
217 pub success: bool,
218}
219
220pub struct QuantumCommSystem {
222 config: QuantumCommConfig,
223 qubits: RwLock<HashMap<String, Qubit>>,
224 entangled_pairs: RwLock<HashMap<String, EntangledPair>>,
225 quantum_channels: RwLock<HashMap<String, QuantumChannel>>,
226 error_correction: RwLock<HashMap<String, QuantumErrorCorrection>>,
227 teleportation_protocols: RwLock<HashMap<String, TeleportationProtocol>>,
228 network_topology: RwLock<NetworkTopology>,
229 quantum_resources: Semaphore,
230 performance_metrics: RwLock<QuantumMetrics>,
231 channel_keys: RwLock<HashMap<String, Vec<u8>>>,
235}
236
237#[derive(Debug, Clone, Default)]
239pub struct QuantumMetrics {
240 pub total_qubits_created: u64,
241 pub total_entanglements: u64,
242 pub total_teleportations: u64,
243 pub successful_teleportations: u64,
244 pub average_fidelity: f64,
245 pub total_error_corrections: u64,
246 pub decoherence_events: u64,
247 pub channel_efficiency: f64,
248 pub quantum_volume: u64,
249}
250
251impl QuantumCommSystem {
252 pub fn new(config: QuantumCommConfig) -> Self {
254 let quantum_resources = Semaphore::new(config.max_entangled_pairs);
255
256 Self {
257 config,
258 qubits: RwLock::new(HashMap::new()),
259 entangled_pairs: RwLock::new(HashMap::new()),
260 quantum_channels: RwLock::new(HashMap::new()),
261 error_correction: RwLock::new(HashMap::new()),
262 teleportation_protocols: RwLock::new(HashMap::new()),
263 network_topology: RwLock::new(NetworkTopology::AdaptiveHybrid),
264 quantum_resources,
265 performance_metrics: RwLock::new(QuantumMetrics::default()),
266 channel_keys: RwLock::new(HashMap::new()),
267 }
268 }
269
270 pub async fn create_entangled_pair(&self, node_a: &str, node_b: &str) -> Result<String> {
272 let _permit = self
273 .quantum_resources
274 .acquire()
275 .await
276 .map_err(|_| anyhow!("Failed to acquire quantum resources"))?;
277
278 let pair_id = uuid::Uuid::new_v4().to_string();
279 let timestamp = Utc::now();
280
281 let qubit_a = Qubit {
283 id: format!("{pair_id}_A"),
284 state: QuantumState {
285 alpha: Complex64 {
286 real: 1.0 / 2.0_f64.sqrt(),
287 imag: 0.0,
288 },
289 beta: Complex64 {
290 real: 1.0 / 2.0_f64.sqrt(),
291 imag: 0.0,
292 },
293 phase: 0.0,
294 purity: 1.0,
295 fidelity: 1.0,
296 },
297 entanglement_partner: Some(format!("{pair_id}_B")),
298 coherence_time_remaining_ms: self.config.decoherence_timeout_ms,
299 measurement_history: Vec::new(),
300 created_at: timestamp,
301 last_operation: None,
302 };
303
304 let qubit_b = Qubit {
305 id: format!("{pair_id}_B"),
306 state: QuantumState {
307 alpha: Complex64 {
308 real: 1.0 / 2.0_f64.sqrt(),
309 imag: 0.0,
310 },
311 beta: Complex64 {
312 real: 1.0 / 2.0_f64.sqrt(),
313 imag: 0.0,
314 },
315 phase: 0.0,
316 purity: 1.0,
317 fidelity: 1.0,
318 },
319 entanglement_partner: Some(format!("{pair_id}_A")),
320 coherence_time_remaining_ms: self.config.decoherence_timeout_ms,
321 measurement_history: Vec::new(),
322 created_at: timestamp,
323 last_operation: None,
324 };
325
326 let entangled_pair = EntangledPair {
327 pair_id: pair_id.clone(),
328 qubit_a: qubit_a.clone(),
329 qubit_b: qubit_b.clone(),
330 entanglement_fidelity: 1.0,
331 creation_time: timestamp,
332 last_used: timestamp,
333 usage_count: 0,
334 bell_state: BellState::PhiPlus,
335 };
336
337 self.qubits
339 .write()
340 .await
341 .insert(qubit_a.id.clone(), qubit_a);
342 self.qubits
343 .write()
344 .await
345 .insert(qubit_b.id.clone(), qubit_b);
346 self.entangled_pairs
347 .write()
348 .await
349 .insert(pair_id.clone(), entangled_pair);
350
351 let mut metrics = self.performance_metrics.write().await;
353 metrics.total_qubits_created += 2;
354 metrics.total_entanglements += 1;
355
356 info!(
357 "Created entangled pair {} between {} and {}",
358 pair_id, node_a, node_b
359 );
360 Ok(pair_id)
361 }
362
363 pub async fn quantum_teleport(
365 &self,
366 source_qubit_id: &str,
367 destination_node: &str,
368 ) -> Result<TeleportationProtocol> {
369 if !self.config.enable_quantum_teleportation {
370 return Err(anyhow!("Quantum teleportation is disabled"));
371 }
372
373 let start_time = std::time::Instant::now();
374 let protocol_id = uuid::Uuid::new_v4().to_string();
375
376 let entangled_pair_id = self.find_available_entangled_pair(destination_node).await?;
378
379 let classical_bits = self
381 .perform_bell_measurement(source_qubit_id, &entangled_pair_id)
382 .await?;
383
384 let fidelity = self.calculate_teleportation_fidelity(&classical_bits).await;
386
387 let protocol = TeleportationProtocol {
388 protocol_id: protocol_id.clone(),
389 source_qubit: source_qubit_id.to_string(),
390 entangled_pair: entangled_pair_id,
391 classical_bits,
392 destination_node: destination_node.to_string(),
393 fidelity_achieved: fidelity,
394 protocol_duration_us: start_time.elapsed().as_micros() as u64,
395 success: fidelity > 0.8, };
397
398 self.teleportation_protocols
400 .write()
401 .await
402 .insert(protocol_id.clone(), protocol.clone());
403
404 let mut metrics = self.performance_metrics.write().await;
406 metrics.total_teleportations += 1;
407 if protocol.success {
408 metrics.successful_teleportations += 1;
409 }
410 metrics.average_fidelity =
411 (metrics.average_fidelity * (metrics.total_teleportations - 1) as f64 + fidelity)
412 / metrics.total_teleportations as f64;
413
414 info!(
415 "Quantum teleportation {} completed with fidelity {:.3}",
416 protocol_id, fidelity
417 );
418 Ok(protocol)
419 }
420
421 async fn find_available_entangled_pair(&self, destination_node: &str) -> Result<String> {
423 let pairs = self.entangled_pairs.read().await;
424
425 for (pair_id, pair) in pairs.iter() {
426 let time_elapsed = Utc::now().signed_duration_since(pair.creation_time);
428 if time_elapsed.num_milliseconds() < self.config.decoherence_timeout_ms as i64 {
429 if pair.qubit_b.id.contains(destination_node)
431 || pair.qubit_a.id.contains(destination_node)
432 {
433 return Ok(pair_id.clone());
434 }
435 }
436 }
437
438 Err(anyhow!(
439 "No available entangled pairs for destination: {}",
440 destination_node
441 ))
442 }
443
444 async fn perform_bell_measurement(
446 &self,
447 source_qubit_id: &str,
448 _entangled_pair_id: &str,
449 ) -> Result<Vec<u8>> {
450 let mut classical_bits = Vec::new();
452
453 let qubits = self.qubits.read().await;
455 let source_qubit = qubits
456 .get(source_qubit_id)
457 .ok_or_else(|| anyhow!("Source qubit not found: {}", source_qubit_id))?;
458
459 let prob_00 = source_qubit.state.alpha.real.powi(2) + source_qubit.state.alpha.imag.powi(2);
461 let mut rng = Random::default();
462 let random_value = rng.random_f64();
463
464 if random_value < prob_00 {
465 classical_bits.push(0);
466 classical_bits.push(0);
467 } else if random_value < prob_00 + 0.25 {
468 classical_bits.push(0);
469 classical_bits.push(1);
470 } else if random_value < prob_00 + 0.5 {
471 classical_bits.push(1);
472 classical_bits.push(0);
473 } else {
474 classical_bits.push(1);
475 classical_bits.push(1);
476 }
477
478 debug!("Bell measurement result: {:?}", classical_bits);
479 Ok(classical_bits)
480 }
481
482 async fn calculate_teleportation_fidelity(&self, classical_bits: &[u8]) -> f64 {
484 let base_fidelity = 0.95; let error_rate = classical_bits.iter().map(|&b| b as f64).sum::<f64>() * 0.02; (base_fidelity - error_rate).clamp(0.0, 1.0)
489 }
490
491 pub async fn perform_error_correction(&self, logical_qubit_id: &str) -> Result<()> {
493 let correction_id = uuid::Uuid::new_v4().to_string();
494
495 let error_correction = QuantumErrorCorrection {
497 code_type: ErrorCorrectionCode::SteaneCode,
498 logical_qubits: 1,
499 physical_qubits: 7,
500 threshold_error_rate: 0.01,
501 correction_rounds: 1,
502 syndrome_measurements: Vec::new(),
503 };
504
505 let syndrome = self.measure_syndrome(logical_qubit_id).await?;
507
508 if !syndrome.detected_errors.is_empty() {
510 self.apply_quantum_correction(logical_qubit_id, &syndrome.detected_errors)
511 .await?;
512 }
513
514 self.error_correction
516 .write()
517 .await
518 .insert(correction_id, error_correction);
519
520 self.performance_metrics
522 .write()
523 .await
524 .total_error_corrections += 1;
525
526 debug!(
527 "Quantum error correction performed for {}",
528 logical_qubit_id
529 );
530 Ok(())
531 }
532
533 async fn measure_syndrome(&self, _qubit_id: &str) -> Result<SyndromeMeasurement> {
535 let syndrome = SyndromeMeasurement {
537 timestamp: Utc::now(),
538 stabilizer_generators: vec!["X1X2X3".to_string(), "Z1Z2Z3".to_string()],
539 syndrome_bits: vec![0, 1], detected_errors: vec![ErrorType::BitFlip],
541 correction_applied: false,
542 };
543
544 Ok(syndrome)
545 }
546
547 async fn apply_quantum_correction(&self, qubit_id: &str, errors: &[ErrorType]) -> Result<()> {
549 let mut qubits = self.qubits.write().await;
550 if let Some(qubit) = qubits.get_mut(qubit_id) {
551 for error in errors {
552 match error {
553 ErrorType::BitFlip => {
554 std::mem::swap(&mut qubit.state.alpha, &mut qubit.state.beta);
556 qubit.last_operation = Some(QuantumOperation::PauliX);
557 }
558 ErrorType::PhaseFlip => {
559 qubit.state.beta.real = -qubit.state.beta.real;
561 qubit.state.beta.imag = -qubit.state.beta.imag;
562 qubit.last_operation = Some(QuantumOperation::PauliZ);
563 }
564 _ => {
565 warn!("Unsupported error type for correction: {:?}", error);
566 }
567 }
568 }
569 }
570
571 debug!("Applied quantum correction for errors: {:?}", errors);
572 Ok(())
573 }
574
575 pub async fn establish_quantum_channel(
577 &self,
578 source: &str,
579 destination: &str,
580 ) -> Result<String> {
581 let channel_id = uuid::Uuid::new_v4().to_string();
582
583 let entangled_pair_id = self.create_entangled_pair(source, destination).await?;
585
586 let quantum_protocol = self
591 .config
592 .security_protocols
593 .first()
594 .cloned()
595 .unwrap_or(QuantumSecurityProtocol::BB84);
596 if !matches!(quantum_protocol, QuantumSecurityProtocol::BB84) {
597 return Err(anyhow!(
598 "Quantum security protocol {:?} is not implemented; only BB84 is currently supported",
599 quantum_protocol
600 ));
601 }
602
603 let channel = QuantumChannel {
604 channel_id: channel_id.clone(),
605 source_node: source.to_string(),
606 destination_node: destination.to_string(),
607 entangled_pairs: vec![entangled_pair_id],
608 channel_fidelity: 0.95,
609 transmission_rate_qubits_per_sec: 1000.0,
610 error_rate: 0.01,
611 channel_capacity: 1.0, quantum_protocol,
613 classical_channel: Some(format!("classical_{channel_id}")),
614 };
615
616 self.quantum_channels
617 .write()
618 .await
619 .insert(channel_id.clone(), channel);
620
621 info!(
622 "Established quantum channel {} between {} and {}",
623 channel_id, source, destination
624 );
625 Ok(channel_id)
626 }
627
628 pub async fn send_quantum_encrypted_event(
630 &self,
631 event: &StreamEvent,
632 channel_id: &str,
633 ) -> Result<Vec<u8>> {
634 let channels = self.quantum_channels.read().await;
635 let channel = channels
636 .get(channel_id)
637 .ok_or_else(|| anyhow!("Quantum channel not found: {}", channel_id))?;
638
639 if !matches!(channel.quantum_protocol, QuantumSecurityProtocol::BB84) {
642 return Err(anyhow!(
643 "Quantum security protocol {:?} is not implemented for encryption",
644 channel.quantum_protocol
645 ));
646 }
647
648 let event_data = serde_json::to_vec(event)?;
650
651 let encrypted_data = self.bb84_encrypt(&event_data, channel).await?;
653
654 debug!(
655 "Quantum encrypted event {} bytes -> {} bytes",
656 event_data.len(),
657 encrypted_data.len()
658 );
659 Ok(encrypted_data)
660 }
661
662 pub async fn receive_quantum_encrypted_event(&self, data: &[u8]) -> Result<StreamEvent> {
669 if data.len() < 16 {
670 return Err(anyhow!(
671 "Quantum ciphertext too short: expected at least a 16-byte key id prefix"
672 ));
673 }
674
675 let (id_bytes, payload) = data.split_at(16);
676 let mut id_arr = [0u8; 16];
677 id_arr.copy_from_slice(id_bytes);
678 let key_id = uuid::Uuid::from_bytes(id_arr).to_string();
679
680 let key = {
681 let mut keys = self.channel_keys.write().await;
682 keys.remove(&key_id)
683 .ok_or_else(|| anyhow!("Unknown or already-consumed quantum key: {}", key_id))?
684 };
685
686 if key.len() != payload.len() {
687 return Err(anyhow!(
688 "Quantum key length {} does not match payload length {}",
689 key.len(),
690 payload.len()
691 ));
692 }
693
694 let plaintext: Vec<u8> = payload
695 .iter()
696 .zip(key.iter())
697 .map(|(cipher, k)| cipher ^ k)
698 .collect();
699
700 let event: StreamEvent = serde_json::from_slice(&plaintext)
701 .map_err(|e| anyhow!("Failed to deserialize decrypted event: {}", e))?;
702 Ok(event)
703 }
704
705 async fn bb84_encrypt(&self, data: &[u8], _channel: &QuantumChannel) -> Result<Vec<u8>> {
714 let key_id = uuid::Uuid::new_v4();
715 let mut rng = Random::default();
716
717 let mut key = Vec::with_capacity(data.len());
718 let mut out = Vec::with_capacity(16 + data.len());
719 out.extend_from_slice(key_id.as_bytes());
720
721 for &byte in data {
722 let key_byte = (rng.random_f64() * 256.0) as u8;
724 key.push(key_byte);
725 out.push(byte ^ key_byte);
726 }
727
728 self.channel_keys
729 .write()
730 .await
731 .insert(key_id.to_string(), key);
732
733 Ok(out)
734 }
735
736 pub async fn get_quantum_metrics(&self) -> QuantumMetrics {
738 self.performance_metrics.read().await.clone()
739 }
740
741 pub async fn monitor_decoherence(&self) -> Result<Vec<String>> {
743 let mut decoherent_qubits = Vec::new();
744 let mut qubits = self.qubits.write().await;
745 let current_time = Utc::now();
746
747 for (qubit_id, qubit) in qubits.iter_mut() {
748 let elapsed_ms = current_time
749 .signed_duration_since(qubit.created_at)
750 .num_milliseconds() as u64;
751
752 if elapsed_ms > qubit.coherence_time_remaining_ms {
753 qubit.state.purity *= 0.5; qubit.state.fidelity *= 0.7; decoherent_qubits.push(qubit_id.clone());
757
758 self.performance_metrics.write().await.decoherence_events += 1;
759 } else {
760 qubit.coherence_time_remaining_ms =
762 qubit.coherence_time_remaining_ms.saturating_sub(elapsed_ms);
763 }
764 }
765
766 if !decoherent_qubits.is_empty() {
767 warn!("Detected decoherence in {} qubits", decoherent_qubits.len());
768 }
769
770 Ok(decoherent_qubits)
771 }
772
773 pub async fn cleanup_decoherent_resources(&self) -> Result<usize> {
775 let decoherent_qubits = self.monitor_decoherence().await?;
776 let mut cleanup_count = 0;
777
778 let mut qubits = self.qubits.write().await;
780 for qubit_id in &decoherent_qubits {
781 qubits.remove(qubit_id);
782 cleanup_count += 1;
783 }
784
785 let mut pairs = self.entangled_pairs.write().await;
787 let mut pairs_to_remove = Vec::new();
788
789 for (pair_id, pair) in pairs.iter() {
790 if decoherent_qubits.contains(&pair.qubit_a.id)
791 || decoherent_qubits.contains(&pair.qubit_b.id)
792 {
793 pairs_to_remove.push(pair_id.clone());
794 }
795 }
796
797 for pair_id in pairs_to_remove {
798 pairs.remove(&pair_id);
799 cleanup_count += 1;
800 }
801
802 info!("Cleaned up {} decoherent quantum resources", cleanup_count);
803 Ok(cleanup_count)
804 }
805}
806
807impl Default for QuantumCommConfig {
808 fn default() -> Self {
809 Self {
810 max_entangled_pairs: 100,
811 decoherence_timeout_ms: 10000, error_correction_threshold: 0.01,
813 enable_quantum_teleportation: true,
814 enable_superdense_coding: true,
815 quantum_network_topology: NetworkTopology::AdaptiveHybrid,
816 security_protocols: vec![QuantumSecurityProtocol::BB84],
817 entanglement_distribution: EntanglementDistribution::DirectTransmission,
818 }
819 }
820}
821
822impl Complex64 {
823 pub fn new(real: f64, imag: f64) -> Self {
824 Self { real, imag }
825 }
826
827 pub fn magnitude_squared(&self) -> f64 {
828 self.real * self.real + self.imag * self.imag
829 }
830}
831
832#[cfg(test)]
833mod tests {
834 use super::*;
835
836 #[tokio::test]
837 async fn test_quantum_comm_system_creation() {
838 let config = QuantumCommConfig::default();
839 let system = QuantumCommSystem::new(config);
840
841 let metrics = system.get_quantum_metrics().await;
842 assert_eq!(metrics.total_qubits_created, 0);
843 }
844
845 #[tokio::test]
846 async fn test_entangled_pair_creation() {
847 let config = QuantumCommConfig::default();
848 let system = QuantumCommSystem::new(config);
849
850 let pair_id = system
851 .create_entangled_pair("node_a", "node_b")
852 .await
853 .unwrap();
854 assert!(!pair_id.is_empty());
855
856 let metrics = system.get_quantum_metrics().await;
857 assert_eq!(metrics.total_qubits_created, 2);
858 assert_eq!(metrics.total_entanglements, 1);
859 }
860
861 #[tokio::test]
862 async fn test_quantum_channel_establishment() {
863 let config = QuantumCommConfig::default();
864 let system = QuantumCommSystem::new(config);
865
866 let channel_id = system
867 .establish_quantum_channel("source", "destination")
868 .await
869 .unwrap();
870 assert!(!channel_id.is_empty());
871 }
872
873 #[tokio::test]
874 async fn regression_quantum_encrypt_roundtrip() {
875 let config = QuantumCommConfig::default();
876 let system = QuantumCommSystem::new(config);
877
878 let channel_id = system
879 .establish_quantum_channel("source", "destination")
880 .await
881 .unwrap();
882
883 let event = StreamEvent::TripleAdded {
884 subject: "http://example.org/s".to_string(),
885 predicate: "http://example.org/p".to_string(),
886 object: "http://example.org/o".to_string(),
887 graph: None,
888 metadata: crate::event::EventMetadata::default(),
889 };
890
891 let ciphertext = system
892 .send_quantum_encrypted_event(&event, &channel_id)
893 .await
894 .unwrap();
895
896 let decrypted = system
898 .receive_quantum_encrypted_event(&ciphertext)
899 .await
900 .unwrap();
901
902 match decrypted {
903 StreamEvent::TripleAdded {
904 subject, object, ..
905 } => {
906 assert_eq!(subject, "http://example.org/s");
907 assert_eq!(object, "http://example.org/o");
908 }
909 other => panic!("Unexpected decrypted event: {other:?}"),
910 }
911
912 assert!(system
914 .receive_quantum_encrypted_event(&ciphertext)
915 .await
916 .is_err());
917 }
918
919 #[tokio::test]
920 async fn regression_unsupported_protocol_rejected() {
921 let config = QuantumCommConfig {
922 security_protocols: vec![QuantumSecurityProtocol::E91],
923 ..Default::default()
924 };
925 let system = QuantumCommSystem::new(config);
926
927 assert!(system
930 .establish_quantum_channel("source", "destination")
931 .await
932 .is_err());
933 }
934
935 #[test]
936 fn test_complex_number_operations() {
937 let c = Complex64::new(3.0, 4.0);
938 assert_eq!(c.magnitude_squared(), 25.0);
939 }
940
941 #[test]
942 fn test_quantum_state_normalization() {
943 let state = QuantumState {
944 alpha: Complex64::new(1.0 / 2.0_f64.sqrt(), 0.0),
945 beta: Complex64::new(1.0 / 2.0_f64.sqrt(), 0.0),
946 phase: 0.0,
947 purity: 1.0,
948 fidelity: 1.0,
949 };
950
951 let norm_squared = state.alpha.magnitude_squared() + state.beta.magnitude_squared();
952 assert!((norm_squared - 1.0).abs() < 1e-10);
953 }
954}