171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// Copyright 2009 the V8 project authors. All rights reserved. 271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// Redistribution and use in source and binary forms, with or without 371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// modification, are permitted provided that the following conditions are 471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// met: 571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// 671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// * Redistributions of source code must retain the above copyright 771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// notice, this list of conditions and the following disclaimer. 871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// * Redistributions in binary form must reproduce the above 971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// copyright notice, this list of conditions and the following 1071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// disclaimer in the documentation and/or other materials provided 1171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// with the distribution. 1271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// * Neither the name of Google Inc. nor the names of its 1371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// contributors may be used to endorse or promote products derived 1471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// from this software without specific prior written permission. 1571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// 1671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 2871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// Test the OS module of d8. This test only makes sense with d8. It 2971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// only does non-trivial work on Unix since os.system() is not currently 3071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// implemented on Windows, and even if it were then many of the things 3171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// we are calling would not be available. 3271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 33486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.orgvar TEST_DIR = "/tmp/d8-os-test-directory-" + ((Math.random() * (1<<30)) | 0); 347c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 357c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 3671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.orgfunction arg_error(str) { 3771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org try { 3871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org eval(str); 3971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org } catch (e) { 4071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org assertTrue(/rgument/.test(e), str); 4171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org } 4271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org} 4371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 4471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 4571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.orgfunction str_error(str) { 4671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org var e = new Object(); 4771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org e.toString = function() { throw new Error("foo bar"); } 4871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org try { 4971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org eval(str); 5071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org } catch (exception) { 5171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org assertTrue(/tring conversion/.test(exception), str); 5271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org } 5371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org} 5471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 5571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 5671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.orgif (this.os && os.system) { 577ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org // Ensure that we have a valid working directory. 587ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org os.chdir("/tmp"); 5971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org try { 6071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // Delete the dir if it is lying around from last time. 617c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org os.system("ls", [TEST_DIR]); 627c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org os.system("rm", ["-r", TEST_DIR]); 6371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org } catch (e) { 6471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org } 657c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org os.mkdirp(TEST_DIR); 6671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org try { 677c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Check the chdir worked. 68486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org os.system('ls', [TEST_DIR]); 697c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Simple create dir. 7078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.mkdirp(TEST_DIR + "/dir"); 717c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Create dir in dir. 7278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.mkdirp(TEST_DIR + "/dir/foo"); 737c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Check that they are there. 7478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.system('ls', [TEST_DIR + '/dir/foo']); 757c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Check that we can detect when something is not there. 7678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org assertThrows("os.system('ls', [TEST_DIR + '/dir/bar']);", "dir not there"); 777c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Check that mkdirp makes intermediate directories. 7878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.mkdirp(TEST_DIR + "/dir2/foo"); 7978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.system("ls", [TEST_DIR + "/dir2/foo"]); 807c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Check that mkdirp doesn't mind if the dir is already there. 8178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.mkdirp(TEST_DIR + "/dir2/foo"); 8278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.mkdirp(TEST_DIR + "/dir2/foo/"); 837c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Check that mkdirp can cope with trailing / 8478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.mkdirp(TEST_DIR + "/dir3/"); 8578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.system("ls", [TEST_DIR + "/dir3"]); 867c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Check that we get an error if the name is taken by a file. 8778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.system("sh", ["-c", "echo foo > " + TEST_DIR + "/file1"]); 8878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.system("ls", [TEST_DIR + "/file1"]); 8978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org assertThrows("os.mkdirp(TEST_DIR + '/file1');", "mkdir over file1"); 9078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org assertThrows("os.mkdirp(TEST_DIR + '/file1/foo');", "mkdir over file2"); 9178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org assertThrows("os.mkdirp(TEST_DIR + '/file1/');", "mkdir over file3"); 9278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org assertThrows("os.mkdirp(TEST_DIR + '/file1/foo/');", "mkdir over file4"); 937c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Create a dir we cannot read. 9478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.mkdirp(TEST_DIR + "/dir4", 0); 957c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // This test fails if you are root since root can read any dir. 9678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org assertThrows("os.chdir(TEST_DIR + '/dir4');", "chdir dir4 I"); 9778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.rmdir(TEST_DIR + "/dir4"); 9878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org assertThrows("os.chdir(TEST_DIR + '/dir4');", "chdir dir4 II"); 9978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 10078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org // Set umask. This changes the umask for the whole process and is 10178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org // the reason why the test cannot be run multi-threaded. 1027c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org var old_umask = os.umask(0777); 1037c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Create a dir we cannot read. 10478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.mkdirp(TEST_DIR + "/dir5"); 1057c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // This test fails if you are root since root can read any dir. 10678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org assertThrows("os.chdir(TEST_DIR + '/dir5');", "cd dir5 I"); 10778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.rmdir(TEST_DIR + "/dir5"); 10878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org assertThrows("os.chdir(TEST_DIR + '/dir5');", "chdir dir5 II"); 1097c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org os.umask(old_umask); 11071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 11178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.mkdirp(TEST_DIR + "/hest/fisk/../fisk/ged"); 11278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org os.system("ls", [TEST_DIR + "/hest/fisk/ged"]); 11371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 1147c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org os.setenv("FOO", "bar"); 1157c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org var environment = os.system("printenv"); 1167c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org assertTrue(/FOO=bar/.test(environment)); 11771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 1187c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Check we time out. 1197c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org var have_sleep = true; 1207c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org var have_echo = true; 1217c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org try { 1227c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org os.system("ls", ["/bin/sleep"]); 1237c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } catch (e) { 1247c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org have_sleep = false; 1257c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } 1267c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org try { 1277c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org os.system("ls", ["/bin/echo"]); 1287c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } catch (e) { 1297c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org have_echo = false; 1307c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } 1317c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org if (have_sleep) { 13233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assertThrows("os.system('sleep', ['2000'], 20);", "sleep 1"); 1337c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 1347c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Check we time out with total time. 13533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assertThrows("os.system('sleep', ['2000'], -1, 20);", "sleep 2"); 13671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 1377c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Check that -1 means no timeout. 13833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org os.system('sleep', ['0.1'], -1, -1); 1397c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 1407c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } 1417c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 1427c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Check that we don't fill up the process table with zombies. 1437c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Disabled because it's too slow. 1447c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org if (have_echo) { 1457c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org //for (var i = 0; i < 65536; i++) { 14671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org assertEquals("baz\n", os.system("echo", ["baz"])); 1477c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org //} 1487c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } 1497ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org 1507ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org // Too few args. 1517ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.umask();"); 1527ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.system();"); 1537ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.mkdirp();"); 1547ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.chdir();"); 1557ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.setenv();"); 1567ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.rmdir();"); 1577ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org 1587ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org // Too many args. 1597ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.setenv('FOO=bar');"); 1607ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.umask(0, 0);"); 1617ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.system('ls', [], -1, -1, -1);"); 1627ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.mkdirp('foo', 0, 0)"); 1637ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.chdir('foo', 'bar')"); 1647ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.rmdir('foo', 'bar');"); 1657ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org 1667ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org // Wrong kind of args. 1677ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.umask([]);"); 1687ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.system('ls', 'foo');"); 1697ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.system('ls', 123);"); 1707ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.system('ls', [], 'foo');"); 1717ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.system('ls', [], -1, 'foo');"); 1727ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org arg_error("os.mkdirp('foo', 'bar');"); 1737ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org 1747ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org // Test broken toString(). 1757ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org str_error("os.system(e);"); 1767ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org str_error("os.system('ls', [e]);"); 1777ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org str_error("os.system('ls', ['.', e]);"); 1787ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org str_error("os.system('ls', [e, '.']);"); 1797ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org str_error("os.mkdirp(e);"); 1807ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org str_error("os.setenv(e, 'goo');"); 1817ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org str_error("os.setenv('goo', e);"); 1827ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org str_error("os.chdir(e);"); 1837ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org str_error("os.rmdir(e);"); 1847ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org 1857c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } finally { 1867c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org os.system("rm", ["-r", TEST_DIR]); 18771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org } 18871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org} 189