Roman Reiss | f29762f | 2015-05-19 11:00:06 | [diff] [blame] | 1 | 'use strict'; |
Trevor Norris | e92f487 | 2013-06-11 21:30:16 | [diff] [blame] | 2 | var common = require('../common'); |
| 3 | var assert = require('assert'); |
| 4 | // minimum string size to overflow into external string space |
| 5 | var EXTERN_APEX = 0xFBEE9; |
| 6 | |
| 7 | // manually controlled string for checking binary output |
| 8 | var ucs2_control = 'a\u0000'; |
| 9 | var write_str = 'a'; |
| 10 | |
| 11 | |
| 12 | // first do basic checks |
| 13 | var b = new Buffer(write_str, 'ucs2'); |
| 14 | var c = b.toString('binary'); |
| 15 | assert.equal(b[0], 0x61); |
| 16 | assert.equal(b[1], 0); |
| 17 | assert.equal(ucs2_control, c); |
| 18 | |
Ben Noordhuis | e2fb733 | 2015-03-03 15:07:26 | [diff] [blame] | 19 | // now create big strings |
| 20 | var size = 1 + (1 << 20); |
| 21 | write_str = Array(size).join(write_str); |
| 22 | ucs2_control = Array(size).join(ucs2_control); |
Trevor Norris | e92f487 | 2013-06-11 21:30:16 | [diff] [blame] | 23 | |
| 24 | // check resultant buffer and output string |
| 25 | var b = new Buffer(write_str, 'ucs2'); |
| 26 | // check fist Buffer created from write string |
| 27 | for (var i = 0; i < b.length; i += 2) { |
| 28 | assert.equal(b[i], 0x61); |
| 29 | assert.equal(b[i + 1], 0); |
| 30 | } |
| 31 | // create another string to create an external string |
| 32 | var b_bin = b.toString('binary'); |
| 33 | var b_ucs = b.toString('ucs2'); |
| 34 | // check control against external binary string |
| 35 | assert.equal(ucs2_control, b_bin); |
| 36 | // create buffer copy from external |
| 37 | var c_bin = new Buffer(b_bin, 'binary'); |
| 38 | var c_ucs = new Buffer(b_ucs, 'ucs2'); |
| 39 | // make sure they're the same length |
| 40 | assert.equal(c_bin.length, c_ucs.length); |
| 41 | // make sure Buffers from externals are the same |
| 42 | for (var i = 0; i < c_bin.length; i++) { |
Trevor Norris | 37ee43e | 2015-08-17 20:32:51 | [diff] [blame] | 43 | assert.equal(c_bin[i], c_ucs[i]); |
Trevor Norris | e92f487 | 2013-06-11 21:30:16 | [diff] [blame] | 44 | } |
| 45 | // check resultant strings |
| 46 | assert.equal(c_bin.toString('ucs2'), c_ucs.toString('ucs2')); |
| 47 | assert.equal(c_bin.toString('binary'), ucs2_control); |
| 48 | assert.equal(c_ucs.toString('binary'), ucs2_control); |
Refael Ackermann | 9b7888e | 2014-05-09 11:12:37 | [diff] [blame] | 49 | |
| 50 | |
Refael Ackermann | 9b7888e | 2014-05-09 11:12:37 | [diff] [blame] | 51 | // now let's test BASE64 and HEX ecoding/decoding |
| 52 | var RADIOS = 2; |
| 53 | var PRE_HALF_APEX = Math.ceil(EXTERN_APEX / 2) - RADIOS; |
| 54 | var PRE_3OF4_APEX = Math.ceil((EXTERN_APEX / 4) * 3) - RADIOS; |
| 55 | |
Roman Reiss | f29762f | 2015-05-19 11:00:06 | [diff] [blame] | 56 | (function() { |
Refael Ackermann | 9b7888e | 2014-05-09 11:12:37 | [diff] [blame] | 57 | for (var j = 0; j < RADIOS * 2; j += 1) { |
| 58 | var datum = b; |
| 59 | var slice = datum.slice(0, PRE_HALF_APEX + j); |
| 60 | var slice2 = datum.slice(0, PRE_HALF_APEX + j + 2); |
| 61 | var pumped_string = slice.toString('hex'); |
| 62 | var pumped_string2 = slice2.toString('hex'); |
| 63 | var decoded = new Buffer(pumped_string, 'hex'); |
| 64 | |
Refael Ackermann | 9b7888e | 2014-05-09 11:12:37 | [diff] [blame] | 65 | // the string are the same? |
| 66 | for (var k = 0; k < pumped_string.length; ++k) { |
Trevor Norris | 37ee43e | 2015-08-17 20:32:51 | [diff] [blame] | 67 | assert.equal(pumped_string[k], pumped_string2[k]); |
Refael Ackermann | 9b7888e | 2014-05-09 11:12:37 | [diff] [blame] | 68 | } |
| 69 | |
| 70 | // the recoded buffer is the same? |
| 71 | for (var i = 0; i < decoded.length; ++i) { |
Trevor Norris | 37ee43e | 2015-08-17 20:32:51 | [diff] [blame] | 72 | assert.equal(datum[i], decoded[i]); |
Refael Ackermann | 9b7888e | 2014-05-09 11:12:37 | [diff] [blame] | 73 | } |
| 74 | } |
| 75 | })(); |
| 76 | |
Roman Reiss | f29762f | 2015-05-19 11:00:06 | [diff] [blame] | 77 | (function() { |
Refael Ackermann | 9b7888e | 2014-05-09 11:12:37 | [diff] [blame] | 78 | for (var j = 0; j < RADIOS * 2; j += 1) { |
| 79 | var datum = b; |
| 80 | var slice = datum.slice(0, PRE_3OF4_APEX + j); |
| 81 | var slice2 = datum.slice(0, PRE_3OF4_APEX + j + 2); |
| 82 | var pumped_string = slice.toString('base64'); |
| 83 | var pumped_string2 = slice2.toString('base64'); |
| 84 | var decoded = new Buffer(pumped_string, 'base64'); |
| 85 | |
Refael Ackermann | 9b7888e | 2014-05-09 11:12:37 | [diff] [blame] | 86 | // the string are the same? |
| 87 | for (var k = 0; k < pumped_string.length - 3; ++k) { |
Trevor Norris | 37ee43e | 2015-08-17 20:32:51 | [diff] [blame] | 88 | assert.equal(pumped_string[k], pumped_string2[k]); |
Refael Ackermann | 9b7888e | 2014-05-09 11:12:37 | [diff] [blame] | 89 | } |
| 90 | |
| 91 | // the recoded buffer is the same? |
| 92 | for (var i = 0; i < decoded.length; ++i) { |
Trevor Norris | 37ee43e | 2015-08-17 20:32:51 | [diff] [blame] | 93 | assert.equal(datum[i], decoded[i]); |
Refael Ackermann | 9b7888e | 2014-05-09 11:12:37 | [diff] [blame] | 94 | } |
| 95 | } |
| 96 | })(); |
Ben Noordhuis | 1640ded | 2015-03-03 14:44:54 | [diff] [blame] | 97 | |
cjihrig | a69ab27 | 2015-08-13 16:14:34 | [diff] [blame] | 98 | // https://github.com/nodejs/node/issues/1024 |
Ben Noordhuis | 1640ded | 2015-03-03 14:44:54 | [diff] [blame] | 99 | (function() { |
| 100 | var a = Array(1 << 20).join('x'); |
| 101 | var b = Buffer(a, 'ucs2').toString('ucs2'); |
| 102 | var c = Buffer(b, 'utf8').toString('utf8'); |
| 103 | |
| 104 | assert.equal(a.length, b.length); |
| 105 | assert.equal(b.length, c.length); |
| 106 | |
| 107 | assert.equal(a, b); |
| 108 | assert.equal(b, c); |
| 109 | })(); |
Karl Skomski | 599d4f5 | 2015-08-16 14:09:02 | [diff] [blame] | 110 | |
| 111 | // v8 fails silently if string length > v8::String::kMaxLength |
| 112 | (function() { |
| 113 | // v8::String::kMaxLength defined in v8.h |
| 114 | const kStringMaxLength = process.binding('buffer').kStringMaxLength; |
| 115 | |
| 116 | assert.throws(function() { |
| 117 | new Buffer(kStringMaxLength + 1).toString(); |
| 118 | }, /toString failed|Buffer allocation failed/); |
| 119 | |
| 120 | try { |
| 121 | new Buffer(kStringMaxLength * 4); |
| 122 | } catch(e) { |
| 123 | assert.equal(e.message, 'Buffer allocation failed - process out of memory'); |
| 124 | console.log( |
| 125 | '1..0 # Skipped: intensive toString tests due to memory confinements'); |
| 126 | return; |
| 127 | } |
| 128 | |
| 129 | assert.throws(function() { |
| 130 | new Buffer(kStringMaxLength + 1).toString('ascii'); |
| 131 | }, /toString failed/); |
| 132 | |
| 133 | assert.throws(function() { |
| 134 | new Buffer(kStringMaxLength + 1).toString('utf8'); |
| 135 | }, /toString failed/); |
| 136 | |
| 137 | assert.throws(function() { |
| 138 | new Buffer(kStringMaxLength * 2 + 2).toString('utf16le'); |
| 139 | }, /toString failed/); |
| 140 | |
| 141 | assert.throws(function() { |
| 142 | new Buffer(kStringMaxLength + 1).toString('binary'); |
| 143 | }, /toString failed/); |
| 144 | |
| 145 | assert.throws(function() { |
| 146 | new Buffer(kStringMaxLength + 1).toString('base64'); |
| 147 | }, /toString failed/); |
| 148 | |
| 149 | assert.throws(function() { |
| 150 | new Buffer(kStringMaxLength + 1).toString('hex'); |
| 151 | }, /toString failed/); |
| 152 | |
| 153 | var maxString = new Buffer(kStringMaxLength).toString(); |
| 154 | assert.equal(maxString.length, kStringMaxLength); |
| 155 | // Free the memory early instead of at the end of the next assignment |
| 156 | maxString = undefined; |
| 157 | |
| 158 | maxString = new Buffer(kStringMaxLength).toString('binary'); |
| 159 | assert.equal(maxString.length, kStringMaxLength); |
| 160 | maxString = undefined; |
| 161 | |
| 162 | maxString = |
| 163 | new Buffer(kStringMaxLength + 1).toString('binary', 1); |
| 164 | assert.equal(maxString.length, kStringMaxLength); |
| 165 | maxString = undefined; |
| 166 | |
| 167 | maxString = |
| 168 | new Buffer(kStringMaxLength + 1).toString('binary', 0, kStringMaxLength); |
| 169 | assert.equal(maxString.length, kStringMaxLength); |
| 170 | maxString = undefined; |
| 171 | |
| 172 | maxString = new Buffer(kStringMaxLength + 2).toString('utf16le'); |
| 173 | assert.equal(maxString.length, (kStringMaxLength + 2) / 2); |
| 174 | maxString = undefined; |
| 175 | })(); |