]> git.kaiwu.me - njs.git/commitdiff
Introduced fs.Error.code.
authorArtem S. Povalyukhin <artem.povaluhin@gmail.com>
Mon, 11 May 2020 06:58:28 +0000 (09:58 +0300)
committerArtem S. Povalyukhin <artem.povaluhin@gmail.com>
Mon, 11 May 2020 06:58:28 +0000 (09:58 +0300)
src/njs_fs.c
test/js/fs_promises_002.js
test/js/fs_promises_004.js
test/njs_expect_test.exp

index 2d63452b67aa4c514b3ff7272a301aaa03ac0310..9d3b9cb75ff3eee8632a72376f356a3b13edb7c4 100644 (file)
@@ -873,9 +873,11 @@ njs_fs_error(njs_vm_t *vm, const char *syscall, const char *description,
     size_t        size;
     njs_int_t     ret;
     njs_value_t   value;
+    const char    *code;
     njs_object_t  *error;
 
     static const njs_value_t  string_errno = njs_string("errno");
+    static const njs_value_t  string_code = njs_string("code");
     static const njs_value_t  string_path = njs_string("path");
     static const njs_value_t  string_syscall = njs_string("syscall");
 
@@ -900,6 +902,20 @@ njs_fs_error(njs_vm_t *vm, const char *syscall, const char *description,
         if (njs_slow_path(ret != NJS_OK)) {
             return NJS_ERROR;
         }
+
+        code = njs_errno_string(errn);
+        size = njs_strlen(code);
+
+        ret = njs_string_new(vm, &value, (u_char *) code, size, size);
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
+        }
+
+        ret = njs_value_property_set(vm, retval, njs_value_arg(&string_code),
+                                     &value);
+        if (njs_slow_path(ret != NJS_OK)) {
+            return NJS_ERROR;
+        }
     }
 
     if (path != NULL) {
index 0ad3e7280d0d0ba679ff9a885c053f7807a151a5..8345ca400b2015661d2e50de777578558cbed28a 100644 (file)
@@ -14,8 +14,7 @@ var testSync = new Promise((resolve, reject) => {
             fs.accessSync(fname + '___');
             failed = true;
         } catch(e) {
-            failed = (e.syscall != 'access');
-            // TODO: e.code != 'ENOENT'
+            failed = (e.syscall != 'access') || e.code != 'ENOENT';
         }
         resolve(failed);
     } catch (e) {
@@ -33,7 +32,8 @@ var testCallback = new Promise((resolve, reject) => {
         fs.access(fname, fs.constants.R_OK | fs.constants.W_OK, (err) => {
             failed |= (err !== undefined);
             fs.access(fname + '___', (err) => {
-                failed |= ((err === undefined) || (err.syscall != 'access'));
+                failed |= ((err === undefined) || (err.syscall != 'access')
+                                               || err.code != 'ENOENT');
                 resolve(failed);
             });
         });
@@ -66,6 +66,7 @@ Promise.resolve()
     console.log('testPromise failed');
 })
 .catch((e) => {
-    console.log('testPromise ok', (e.syscall == 'access') && (e.path == fname + '___'));
+    console.log('testPromise ok', (e.syscall == 'access') && (e.path == fname + '___')
+                                                          && e.code == 'ENOENT');
 })
 ;
index 2d6f760a8f7bc9208e9791f04605963b3e21b24a..873e787ca40911471959ec17e639885c6f9f2f22 100644 (file)
@@ -23,7 +23,7 @@ var testSync = () => new Promise((resolve, reject) => {
             fs.realpathSync(fname);
             throw new Error('fs.realpathSync error 1');
         } catch (e) {
-            if (e.syscall != 'realpath') { // e.code
+            if (e.syscall != 'realpath' || e.code != 'ENOENT') {
                 throw e;
             }
         }
@@ -79,7 +79,7 @@ var testCallback = () => new Promise((resolve, reject) => {
                 reject(new Error('fs.realpath error 1'));
                 return;
             }
-            if (err.syscall != 'realpath') {
+            if (err.syscall != 'realpath' || err.code != 'ENOENT') {
                 reject(err);
                 return;
             }
@@ -165,7 +165,7 @@ Promise.resolve()
 .then(() => fsp.realpath(fname)
             .then(() => { throw new Error('fsp.realpath error 1') }))
 .catch((e) => {
-    if (e.syscall != 'realpath') {
+    if (e.syscall != 'realpath' || e.code != 'ENOENT') {
         throw e;
     }
 })
index 99131ab9de5543917cd05b9c789e02ca55fa185f..6abc00adf5dae6c73ec587fd1837d9f4ea5d09f1 100644 (file)
@@ -511,7 +511,7 @@ njs_test {
     {"var fs = require('fs'); \r\n"
      "undefined\r\n>> "}
     {"fs.readFile('test/fs/nonexistent', 'utf8', function (e) {console.log(JSON.stringify(e))})\r\n"
-     "undefined\r\n{\"errno\":2,\"path\":\"test/fs/nonexistent\",\"syscall\":\"open\"}\r\n>> "}
+     "undefined\r\n{\"errno\":2,\"code\":\"ENOENT\",\"path\":\"test/fs/nonexistent\",\"syscall\":\"open\"}\r\n>> "}
 }
 
 njs_test {
@@ -571,7 +571,7 @@ njs_test {
     {"var fs = require('fs'); \r\n"
      "undefined\r\n>> "}
     {"try { fs.readFileSync('test/fs/nonexistent')} catch (e) {console.log(JSON.stringify(e))}\r\n"
-     "{\"errno\":2,\"path\":\"test/fs/nonexistent\",\"syscall\":\"open\"}\r\nundefined\r\n>> "}
+     "{\"errno\":2,\"code\":\"ENOENT\",\"path\":\"test/fs/nonexistent\",\"syscall\":\"open\"}\r\nundefined\r\n>> "}
 }
 
 njs_test {
@@ -648,7 +648,7 @@ njs_test {
     {"var fs = require('fs')\r\n"
      "undefined\r\n>> "}
     {"fs.writeFile('/invalid_path', 'ABC', function (e) { console.log(JSON.stringify(e))})\r\n"
-     "undefined\r\n{\"errno\":13,\"path\":\"/invalid_path\",\"syscall\":\"open\"}\r\n>> "}
+     "undefined\r\n{\"errno\":13,\"code\":\"EACCES\",\"path\":\"/invalid_path\",\"syscall\":\"open\"}\r\n>> "}
 }
 
 # require('fs').writeFileSync()