about summary refs log tree commit diff
path: root/src/libstd/run_program.rs
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-01-17 19:05:07 -0800
committerBrian Anderson <banderson@mozilla.com>2012-01-17 19:48:58 -0800
commit6e27b27cf8a9ece270f2556c3362524854d06de4 (patch)
treee310348b211f329737cec9a1a30fbf641492ad46 /src/libstd/run_program.rs
parent17bf4b0e1be01bc7a54c389deb5896949736d7f2 (diff)
downloadrust-6e27b27cf8a9ece270f2556c3362524854d06de4.tar.gz
rust-6e27b27cf8a9ece270f2556c3362524854d06de4.zip
libstd: Move std tests into libstd
Diffstat (limited to 'src/libstd/run_program.rs')
-rw-r--r--src/libstd/run_program.rs69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/libstd/run_program.rs b/src/libstd/run_program.rs
index cc1e7c96046..e40526b5884 100644
--- a/src/libstd/run_program.rs
+++ b/src/libstd/run_program.rs
@@ -294,6 +294,75 @@ fn waitpid(pid: pid_t) -> int {
     }
 }
 
+#[cfg(test)]
+mod tests {
+
+    import io::writer_util;
+    import ctypes::fd_t;
+
+    // Regression test for memory leaks
+    #[ignore(cfg(target_os = "win32"))] // FIXME
+    fn test_leaks() {
+        run::run_program("echo", []);
+        run::start_program("echo", []);
+        run::program_output("echo", []);
+    }
+
+    #[test]
+    fn test_pipes() {
+        let pipe_in = os::pipe();
+        let pipe_out = os::pipe();
+        let pipe_err = os::pipe();
+
+        let pid =
+            run::spawn_process(
+                "cat", [], pipe_in.in, pipe_out.out, pipe_err.out);
+        os::close(pipe_in.in);
+        os::close(pipe_out.out);
+        os::close(pipe_err.out);
+
+        if pid == -1i32 { fail; }
+        let expected = "test";
+        writeclose(pipe_in.out, expected);
+        let actual = readclose(pipe_out.in);
+        readclose(pipe_err.in);
+        os::waitpid(pid);
+
+        log(debug, expected);
+        log(debug, actual);
+        assert (expected == actual);
+
+        fn writeclose(fd: fd_t, s: str) {
+            #error("writeclose %d, %s", fd as int, s);
+            let writer = io::fd_writer(fd, false);
+            writer.write_str(s);
+
+            os::close(fd);
+        }
+
+        fn readclose(fd: fd_t) -> str {
+            // Copied from run::program_output
+            let file = os::fd_FILE(fd);
+            let reader = io::FILE_reader(file, false);
+            let buf = "";
+            while !reader.eof() {
+                let bytes = reader.read_bytes(4096u);
+                buf += str::unsafe_from_bytes(bytes);
+            }
+            os::fclose(file);
+            ret buf;
+        }
+    }
+
+    #[test]
+    fn waitpid() {
+        let pid = run::spawn_process("false", [], 0i32, 0i32, 0i32);
+        let status = run::waitpid(pid);
+        assert status == 1;
+    }
+
+}
+
 // Local Variables:
 // mode: rust
 // fill-column: 78;