1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2009 the V8 project authors. All rights reserved. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions of source code must retain the above copyright 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions in binary form must reproduce the above 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// copyright notice, this list of conditions and the following 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disclaimer in the documentation and/or other materials provided 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with the distribution. 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Neither the name of Google Inc. nor the names of its 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// contributors may be used to endorse or promote products derived 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from this software without specific prior written permission. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Test the OS module of d8. This test only makes sense with d8. It 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// only does non-trivial work on Unix since os.system() is not currently 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// implemented on Windows, and even if it were then many of the things 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// we are calling would not be available. 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 33589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvar TEST_DIR = "/tmp/d8-os-test-directory-" + ((Math.random() * (1<<30)) | 0); 3469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 3569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction arg_error(str) { 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block try { 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block eval(str); 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } catch (e) { 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertTrue(/rgument/.test(e), str); 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction str_error(str) { 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var e = new Object(); 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block e.toString = function() { throw new Error("foo bar"); } 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block try { 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block eval(str); 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } catch (exception) { 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertTrue(/tring conversion/.test(exception), str); 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockif (this.os && os.system) { 573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Ensure that we have a valid working directory. 583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.chdir("/tmp"); 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block try { 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Delete the dir if it is lying around from last time. 6169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch os.system("ls", [TEST_DIR]); 6269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch os.system("rm", ["-r", TEST_DIR]); 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } catch (e) { 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 6569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch os.mkdirp(TEST_DIR); 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block try { 6769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Check the chdir worked. 68589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch os.system('ls', [TEST_DIR]); 6969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Simple create dir. 703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.mkdirp(TEST_DIR + "/dir"); 7169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Create dir in dir. 723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.mkdirp(TEST_DIR + "/dir/foo"); 7369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Check that they are there. 743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.system('ls', [TEST_DIR + '/dir/foo']); 7569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Check that we can detect when something is not there. 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows("os.system('ls', [TEST_DIR + '/dir/bar']);", "dir not there"); 7769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Check that mkdirp makes intermediate directories. 783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.mkdirp(TEST_DIR + "/dir2/foo"); 793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.system("ls", [TEST_DIR + "/dir2/foo"]); 8069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Check that mkdirp doesn't mind if the dir is already there. 813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.mkdirp(TEST_DIR + "/dir2/foo"); 823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.mkdirp(TEST_DIR + "/dir2/foo/"); 8369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Check that mkdirp can cope with trailing / 843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.mkdirp(TEST_DIR + "/dir3/"); 853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.system("ls", [TEST_DIR + "/dir3"]); 8669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Check that we get an error if the name is taken by a file. 873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.system("sh", ["-c", "echo foo > " + TEST_DIR + "/file1"]); 883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.system("ls", [TEST_DIR + "/file1"]); 893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows("os.mkdirp(TEST_DIR + '/file1');", "mkdir over file1"); 903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows("os.mkdirp(TEST_DIR + '/file1/foo');", "mkdir over file2"); 913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows("os.mkdirp(TEST_DIR + '/file1/');", "mkdir over file3"); 923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows("os.mkdirp(TEST_DIR + '/file1/foo/');", "mkdir over file4"); 9369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Create a dir we cannot read. 943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.mkdirp(TEST_DIR + "/dir4", 0); 9569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // This test fails if you are root since root can read any dir. 963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows("os.chdir(TEST_DIR + '/dir4');", "chdir dir4 I"); 973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.rmdir(TEST_DIR + "/dir4"); 983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows("os.chdir(TEST_DIR + '/dir4');", "chdir dir4 II"); 993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Set umask. This changes the umask for the whole process and is 1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // the reason why the test cannot be run multi-threaded. 10269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch var old_umask = os.umask(0777); 10369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Create a dir we cannot read. 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.mkdirp(TEST_DIR + "/dir5"); 10569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // This test fails if you are root since root can read any dir. 1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows("os.chdir(TEST_DIR + '/dir5');", "cd dir5 I"); 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.rmdir(TEST_DIR + "/dir5"); 1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch assertThrows("os.chdir(TEST_DIR + '/dir5');", "chdir dir5 II"); 10969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch os.umask(old_umask); 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.mkdirp(TEST_DIR + "/hest/fisk/../fisk/ged"); 1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch os.system("ls", [TEST_DIR + "/hest/fisk/ged"]); 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch os.setenv("FOO", "bar"); 11569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch var environment = os.system("printenv"); 11669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertTrue(/FOO=bar/.test(environment)); 117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Check we time out. 11969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch var have_sleep = true; 12069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch var have_echo = true; 12169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch try { 12269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch os.system("ls", ["/bin/sleep"]); 12369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } catch (e) { 12469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch have_sleep = false; 12569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 12669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch try { 12769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch os.system("ls", ["/bin/echo"]); 12869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } catch (e) { 12969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch have_echo = false; 13069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 13169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (have_sleep) { 13269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertThrows("os.system('sleep', ['2000'], 200);", "sleep 1"); 13369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 13469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Check we time out with total time. 13569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch assertThrows("os.system('sleep', ['2000'], -1, 200);", "sleep 2"); 136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 13769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Check that -1 means no timeout. 13869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch os.system('sleep', ['1'], -1, -1); 13969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 14069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 14169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 14269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Check that we don't fill up the process table with zombies. 14369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Disabled because it's too slow. 14469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (have_echo) { 14569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch //for (var i = 0; i < 65536; i++) { 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals("baz\n", os.system("echo", ["baz"])); 14769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch //} 14869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Too few args. 1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.umask();"); 1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.system();"); 1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.mkdirp();"); 1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.chdir();"); 1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.setenv();"); 1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.rmdir();"); 1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Too many args. 1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.setenv('FOO=bar');"); 1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.umask(0, 0);"); 1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.system('ls', [], -1, -1, -1);"); 1623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.mkdirp('foo', 0, 0)"); 1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.chdir('foo', 'bar')"); 1643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.rmdir('foo', 'bar');"); 1653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Wrong kind of args. 1673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.umask([]);"); 1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.system('ls', 'foo');"); 1693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.system('ls', 123);"); 1703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.system('ls', [], 'foo');"); 1713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.system('ls', [], -1, 'foo');"); 1723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arg_error("os.mkdirp('foo', 'bar');"); 1733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Test broken toString(). 1753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch str_error("os.system(e);"); 1763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch str_error("os.system('ls', [e]);"); 1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch str_error("os.system('ls', ['.', e]);"); 1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch str_error("os.system('ls', [e, '.']);"); 1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch str_error("os.mkdirp(e);"); 1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch str_error("os.setenv(e, 'goo');"); 1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch str_error("os.setenv('goo', e);"); 1823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch str_error("os.chdir(e);"); 1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch str_error("os.rmdir(e);"); 1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } finally { 18669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch os.system("rm", ["-r", TEST_DIR]); 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 189