1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/addon-sdk/source/test/test-byte-streams.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,169 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +const byteStreams = require("sdk/io/byte-streams"); 1.9 +const file = require("sdk/io/file"); 1.10 +const { pathFor } = require("sdk/system"); 1.11 +const { Loader } = require("sdk/test/loader"); 1.12 + 1.13 +const STREAM_CLOSED_ERROR = new RegExp("The stream is closed and cannot be used."); 1.14 + 1.15 +// This should match the constant of the same name in byte-streams.js. 1.16 +const BUFFER_BYTE_LEN = 0x8000; 1.17 + 1.18 +exports.testWriteRead = function (assert) { 1.19 + let fname = dataFileFilename(); 1.20 + 1.21 + // Write a small string less than the stream's buffer size... 1.22 + let str = "exports.testWriteRead data!"; 1.23 + let stream = open(assert, fname, true); 1.24 + assert.ok(!stream.closed, "stream.closed after open should be false"); 1.25 + stream.write(str); 1.26 + stream.close(); 1.27 + assert.ok(stream.closed, "Stream should be closed after stream.close"); 1.28 + assert.throws(function () stream.write("This shouldn't be written!"), 1.29 + STREAM_CLOSED_ERROR, 1.30 + "stream.write after close should raise error"); 1.31 + 1.32 + // ... and read it. 1.33 + stream = open(assert, fname); 1.34 + assert.equal(stream.read(), str, 1.35 + "stream.read should return string written"); 1.36 + assert.equal(stream.read(), "", 1.37 + "stream.read at EOS should return empty string"); 1.38 + stream.close(); 1.39 + assert.ok(stream.closed, "Stream should be closed after stream.close"); 1.40 + assert.throws(function () stream.read(), 1.41 + STREAM_CLOSED_ERROR, 1.42 + "stream.read after close should raise error"); 1.43 + 1.44 + file.remove(fname); 1.45 +}; 1.46 + 1.47 +// Write a big string many times the size of the stream's buffer and read it. 1.48 +exports.testWriteReadBig = function (assert) { 1.49 + let str = ""; 1.50 + let bufLen = BUFFER_BYTE_LEN; 1.51 + let fileSize = bufLen * 10; 1.52 + for (let i = 0; i < fileSize; i++) 1.53 + str += i % 10; 1.54 + let fname = dataFileFilename(); 1.55 + let stream = open(assert, fname, true); 1.56 + stream.write(str); 1.57 + stream.close(); 1.58 + stream = open(assert, fname); 1.59 + assert.equal(stream.read(), str, 1.60 + "stream.read should return string written"); 1.61 + stream.close(); 1.62 + file.remove(fname); 1.63 +}; 1.64 + 1.65 +// The same, but write and read in chunks. 1.66 +exports.testWriteReadChunks = function (assert) { 1.67 + let str = ""; 1.68 + let bufLen = BUFFER_BYTE_LEN; 1.69 + let fileSize = bufLen * 10; 1.70 + for (let i = 0; i < fileSize; i++) 1.71 + str += i % 10; 1.72 + let fname = dataFileFilename(); 1.73 + let stream = open(assert, fname, true); 1.74 + let i = 0; 1.75 + while (i < str.length) { 1.76 + // Use a chunk length that spans buffers. 1.77 + let chunk = str.substr(i, bufLen + 1); 1.78 + stream.write(chunk); 1.79 + i += bufLen + 1; 1.80 + } 1.81 + stream.close(); 1.82 + stream = open(assert, fname); 1.83 + let readStr = ""; 1.84 + bufLen = BUFFER_BYTE_LEN; 1.85 + let readLen = bufLen + 1; 1.86 + do { 1.87 + var frag = stream.read(readLen); 1.88 + readStr += frag; 1.89 + } while (frag); 1.90 + stream.close(); 1.91 + assert.equal(readStr, str, 1.92 + "stream.write and read in chunks should work as expected"); 1.93 + file.remove(fname); 1.94 +}; 1.95 + 1.96 +exports.testReadLengths = function (assert) { 1.97 + let fname = dataFileFilename(); 1.98 + let str = "exports.testReadLengths data!"; 1.99 + let stream = open(assert, fname, true); 1.100 + stream.write(str); 1.101 + stream.close(); 1.102 + 1.103 + stream = open(assert, fname); 1.104 + assert.equal(stream.read(str.length * 1000), str, 1.105 + "stream.read with big byte length should return string " + 1.106 + "written"); 1.107 + stream.close(); 1.108 + 1.109 + stream = open(assert, fname); 1.110 + assert.equal(stream.read(0), "", 1.111 + "string.read with zero byte length should return empty " + 1.112 + "string"); 1.113 + stream.close(); 1.114 + 1.115 + stream = open(assert, fname); 1.116 + assert.equal(stream.read(-1), "", 1.117 + "string.read with negative byte length should return " + 1.118 + "empty string"); 1.119 + stream.close(); 1.120 + 1.121 + file.remove(fname); 1.122 +}; 1.123 + 1.124 +exports.testTruncate = function (assert) { 1.125 + let fname = dataFileFilename(); 1.126 + let str = "exports.testReadLengths data!"; 1.127 + let stream = open(assert, fname, true); 1.128 + stream.write(str); 1.129 + stream.close(); 1.130 + 1.131 + stream = open(assert, fname); 1.132 + assert.equal(stream.read(), str, 1.133 + "stream.read should return string written"); 1.134 + stream.close(); 1.135 + 1.136 + stream = open(assert, fname, true); 1.137 + stream.close(); 1.138 + 1.139 + stream = open(assert, fname); 1.140 + assert.equal(stream.read(), "", 1.141 + "stream.read after truncate should be empty"); 1.142 + stream.close(); 1.143 + 1.144 + file.remove(fname); 1.145 +}; 1.146 + 1.147 +exports.testUnload = function (assert) { 1.148 + let loader = Loader(module); 1.149 + let file = loader.require("sdk/io/file"); 1.150 + 1.151 + let filename = dataFileFilename("temp-b"); 1.152 + let stream = file.open(filename, "wb"); 1.153 + 1.154 + loader.unload(); 1.155 + assert.ok(stream.closed, "Stream should be closed after module unload"); 1.156 +}; 1.157 + 1.158 +// Returns the name of a file that should be used to test writing and reading. 1.159 +function dataFileFilename() { 1.160 + return file.join(pathFor("ProfD"), "test-byte-streams-data"); 1.161 +} 1.162 + 1.163 +// Opens and returns the given file and ensures it's of the correct class. 1.164 +function open(assert, filename, forWriting) { 1.165 + let stream = file.open(filename, forWriting ? "wb" : "b"); 1.166 + let klass = forWriting ? "ByteWriter" : "ByteReader"; 1.167 + assert.ok(stream instanceof byteStreams[klass], 1.168 + "Opened stream should be a " + klass); 1.169 + return stream; 1.170 +} 1.171 + 1.172 +require('sdk/test').run(exports);