blob: be0c90d47f9f1fc88ceefc1e57d565db1da85305 [file] [log] [blame]
Roman Reissf29762f2015-05-19 11:00:061'use strict';
Trevor Norrise92f4872013-06-11 21:30:162var common = require('../common');
3var assert = require('assert');
4// minimum string size to overflow into external string space
5var EXTERN_APEX = 0xFBEE9;
6
7// manually controlled string for checking binary output
8var ucs2_control = 'a\u0000';
9var write_str = 'a';
10
11
12// first do basic checks
13var b = new Buffer(write_str, 'ucs2');
14var c = b.toString('binary');
15assert.equal(b[0], 0x61);
16assert.equal(b[1], 0);
17assert.equal(ucs2_control, c);
18
Ben Noordhuise2fb7332015-03-03 15:07:2619// now create big strings
20var size = 1 + (1 << 20);
21write_str = Array(size).join(write_str);
22ucs2_control = Array(size).join(ucs2_control);
Trevor Norrise92f4872013-06-11 21:30:1623
24// check resultant buffer and output string
25var b = new Buffer(write_str, 'ucs2');
26// check fist Buffer created from write string
27for (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
32var b_bin = b.toString('binary');
33var b_ucs = b.toString('ucs2');
34// check control against external binary string
35assert.equal(ucs2_control, b_bin);
36// create buffer copy from external
37var c_bin = new Buffer(b_bin, 'binary');
38var c_ucs = new Buffer(b_ucs, 'ucs2');
39// make sure they're the same length
40assert.equal(c_bin.length, c_ucs.length);
41// make sure Buffers from externals are the same
42for (var i = 0; i < c_bin.length; i++) {
Trevor Norris37ee43e2015-08-17 20:32:5143 assert.equal(c_bin[i], c_ucs[i]);
Trevor Norrise92f4872013-06-11 21:30:1644}
45// check resultant strings
46assert.equal(c_bin.toString('ucs2'), c_ucs.toString('ucs2'));
47assert.equal(c_bin.toString('binary'), ucs2_control);
48assert.equal(c_ucs.toString('binary'), ucs2_control);
Refael Ackermann9b7888e2014-05-09 11:12:3749
50
Refael Ackermann9b7888e2014-05-09 11:12:3751// now let's test BASE64 and HEX ecoding/decoding
52var RADIOS = 2;
53var PRE_HALF_APEX = Math.ceil(EXTERN_APEX / 2) - RADIOS;
54var PRE_3OF4_APEX = Math.ceil((EXTERN_APEX / 4) * 3) - RADIOS;
55
Roman Reissf29762f2015-05-19 11:00:0656(function() {
Refael Ackermann9b7888e2014-05-09 11:12:3757 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 Ackermann9b7888e2014-05-09 11:12:3765 // the string are the same?
66 for (var k = 0; k < pumped_string.length; ++k) {
Trevor Norris37ee43e2015-08-17 20:32:5167 assert.equal(pumped_string[k], pumped_string2[k]);
Refael Ackermann9b7888e2014-05-09 11:12:3768 }
69
70 // the recoded buffer is the same?
71 for (var i = 0; i < decoded.length; ++i) {
Trevor Norris37ee43e2015-08-17 20:32:5172 assert.equal(datum[i], decoded[i]);
Refael Ackermann9b7888e2014-05-09 11:12:3773 }
74 }
75})();
76
Roman Reissf29762f2015-05-19 11:00:0677(function() {
Refael Ackermann9b7888e2014-05-09 11:12:3778 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 Ackermann9b7888e2014-05-09 11:12:3786 // the string are the same?
87 for (var k = 0; k < pumped_string.length - 3; ++k) {
Trevor Norris37ee43e2015-08-17 20:32:5188 assert.equal(pumped_string[k], pumped_string2[k]);
Refael Ackermann9b7888e2014-05-09 11:12:3789 }
90
91 // the recoded buffer is the same?
92 for (var i = 0; i < decoded.length; ++i) {
Trevor Norris37ee43e2015-08-17 20:32:5193 assert.equal(datum[i], decoded[i]);
Refael Ackermann9b7888e2014-05-09 11:12:3794 }
95 }
96})();
Ben Noordhuis1640ded2015-03-03 14:44:5497
cjihriga69ab272015-08-13 16:14:3498// https://github.com/nodejs/node/issues/1024
Ben Noordhuis1640ded2015-03-03 14:44:5499(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 Skomski599d4f52015-08-16 14:09:02110
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})();