1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5 use std::fs::File;
6 use std::io::prelude::*;
7 use std::panic;
8 use std::path::Path;
9 extern crate webrtc_sdp;
10
11 // Takes the filename of a file that contains SDP, and optionally the trailing
12 // flag --expect-failure.
13 // If --expect-failure is passed, then the program will exit with a successful
14 // exit code if the file fails to parse.
main()15 fn main() {
16 let mut args = std::env::args();
17 let filename = match args.nth(1) {
18 None => {
19 eprintln!("Missing file name argument!");
20 std::process::exit(1);
21 }
22 Some(x) => x,
23 };
24
25 let path = Path::new(filename.as_str());
26 let display = path.display();
27
28 let mut file = match File::open(&path) {
29 Err(why) => panic!("Failed to open {}: {}", display, why),
30 Ok(file) => file,
31 };
32
33 let mut s = String::new();
34 match file.read_to_string(&mut s) {
35 Err(why) => panic!("Couldn't read {}: {}", display, why),
36 Ok(s) => s,
37 };
38
39 // Hook up the panic handler if it is expected to fail to parse
40 let expect_failure = if let Some(x) = args.next() {
41 if x.to_lowercase() != "--expect-failure" {
42 eprintln!("Extra arguments passed!");
43 std::process::exit(1);
44 }
45 panic::set_hook(Box::new(|_| {
46 println!("Exited with failure, as expected.");
47 std::process::exit(0);
48 }));
49 true
50 } else {
51 false
52 };
53
54 // Remove comment lines
55 let s = s
56 .lines()
57 .filter(|&l| !l.trim_start().starts_with(';'))
58 .collect::<Vec<&str>>()
59 .join("\r\n");
60
61 if let Err(why) = webrtc_sdp::parse_sdp(&s, true) {
62 panic!("Failed to parse SDP with error: {}", why);
63 }
64
65 if expect_failure {
66 eprintln!("Successfully parsed SDP that was expected to fail. You may need to update the example expectations.");
67 std::process::exit(1);
68 }
69 println!("Successfully parsed SDP");
70 }
71