http_tunnel_common/utils/
encoding.rs

1use base64::{Engine as _, engine::general_purpose::STANDARD};
2
3/// Encode bytes to Base64 string
4pub fn encode_body(body: &[u8]) -> String {
5    STANDARD.encode(body)
6}
7
8/// Decode Base64 string to bytes
9pub fn decode_body(encoded: &str) -> Result<Vec<u8>, base64::DecodeError> {
10    STANDARD.decode(encoded)
11}
12
13#[cfg(test)]
14mod tests {
15    use super::*;
16
17    #[test]
18    fn test_encode_empty() {
19        let empty: &[u8] = &[];
20        let encoded = encode_body(empty);
21        assert_eq!(encoded, "");
22    }
23
24    #[test]
25    fn test_encode_simple_text() {
26        let text = b"Hello, World!";
27        let encoded = encode_body(text);
28        assert_eq!(encoded, "SGVsbG8sIFdvcmxkIQ==");
29    }
30
31    #[test]
32    fn test_encode_json() {
33        let json = br#"{"name":"test","value":123}"#;
34        let encoded = encode_body(json);
35        assert_eq!(encoded, "eyJuYW1lIjoidGVzdCIsInZhbHVlIjoxMjN9");
36    }
37
38    #[test]
39    fn test_encode_binary_data() {
40        let binary = vec![0x00, 0x01, 0x02, 0xFF, 0xFE];
41        let encoded = encode_body(&binary);
42        assert_eq!(encoded, "AAEC//4=");
43    }
44
45    #[test]
46    fn test_decode_empty() {
47        let decoded = decode_body("").unwrap();
48        assert_eq!(decoded, Vec::<u8>::new());
49    }
50
51    #[test]
52    fn test_decode_simple_text() {
53        let decoded = decode_body("SGVsbG8sIFdvcmxkIQ==").unwrap();
54        assert_eq!(decoded, b"Hello, World!");
55        assert_eq!(String::from_utf8(decoded).unwrap(), "Hello, World!");
56    }
57
58    #[test]
59    fn test_decode_json() {
60        let decoded = decode_body("eyJuYW1lIjoidGVzdCIsInZhbHVlIjoxMjN9").unwrap();
61        assert_eq!(decoded, br#"{"name":"test","value":123}"#);
62    }
63
64    #[test]
65    fn test_decode_binary_data() {
66        let decoded = decode_body("AAEC//4=").unwrap();
67        assert_eq!(decoded, vec![0x00, 0x01, 0x02, 0xFF, 0xFE]);
68    }
69
70    #[test]
71    fn test_roundtrip_text() {
72        let original = b"This is a test message with special chars: \n\t\r!@#$%^&*()";
73        let encoded = encode_body(original);
74        let decoded = decode_body(&encoded).unwrap();
75        assert_eq!(decoded, original);
76    }
77
78    #[test]
79    fn test_roundtrip_binary() {
80        let original: Vec<u8> = (0..=255).collect();
81        let encoded = encode_body(&original);
82        let decoded = decode_body(&encoded).unwrap();
83        assert_eq!(decoded, original);
84    }
85
86    #[test]
87    fn test_roundtrip_large_data() {
88        let original = vec![0xAB; 10000]; // 10KB of data
89        let encoded = encode_body(&original);
90        let decoded = decode_body(&encoded).unwrap();
91        assert_eq!(decoded, original);
92    }
93
94    #[test]
95    fn test_decode_invalid_base64() {
96        let result = decode_body("This is not valid base64!!!");
97        assert!(result.is_err());
98    }
99
100    #[test]
101    fn test_decode_invalid_padding() {
102        let result = decode_body("SGVsbG8"); // Missing padding
103        assert!(result.is_err());
104    }
105
106    #[test]
107    fn test_encode_utf8_text() {
108        let utf8_text = "Hello δΈ–η•Œ 🌍".as_bytes();
109        let encoded = encode_body(utf8_text);
110        let decoded = decode_body(&encoded).unwrap();
111        assert_eq!(decoded, utf8_text);
112        assert_eq!(String::from_utf8(decoded).unwrap(), "Hello δΈ–η•Œ 🌍");
113    }
114}