summaryrefslogtreecommitdiffstats
path: root/xpcom/tests/unit/test_storagestream.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--xpcom/tests/unit/test_storagestream.js152
1 files changed, 152 insertions, 0 deletions
diff --git a/xpcom/tests/unit/test_storagestream.js b/xpcom/tests/unit/test_storagestream.js
new file mode 100644
index 0000000000..2a0fb1b569
--- /dev/null
+++ b/xpcom/tests/unit/test_storagestream.js
@@ -0,0 +1,152 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "unusedVariable" }] */
+
+function run_test() {
+ test1();
+ test2();
+ test3();
+ test4();
+}
+
+/**
+ * Checks that getting an input stream from a storage stream which has never had
+ * anything written to it throws a not-initialized exception.
+ */
+function test1() {
+ var ss = Cc["@mozilla.org/storagestream;1"].createInstance(
+ Ci.nsIStorageStream
+ );
+ ss.init(1024, 1024, null);
+
+ var unusedVariable = ss.getOutputStream(0);
+ var inp2 = ss.newInputStream(0);
+ Assert.equal(inp2.available(), 0);
+ Assert.ok(inp2.isNonBlocking());
+
+ var sis = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(
+ Ci.nsIScriptableInputStream
+ );
+ sis.init(inp2);
+
+ var threw = false;
+ try {
+ sis.read(1);
+ } catch (ex) {
+ if (ex.result == Cr.NS_BASE_STREAM_WOULD_BLOCK) {
+ threw = true;
+ } else {
+ throw ex;
+ }
+ }
+ Assert.ok(threw);
+}
+
+/**
+ * Checks that getting an input stream from a storage stream to which 0 bytes of
+ * data have been explicitly written doesn't throw an exception.
+ */
+function test2() {
+ var ss = Cc["@mozilla.org/storagestream;1"].createInstance(
+ Ci.nsIStorageStream
+ );
+ ss.init(1024, 1024, null);
+
+ var out = ss.getOutputStream(0);
+ out.write("", 0);
+ try {
+ ss.newInputStream(0);
+ } catch (e) {
+ do_throw("shouldn't throw exception when new input stream created");
+ }
+}
+
+/**
+ * Checks that reading any non-zero amount of data from a storage stream
+ * which has had 0 bytes written to it explicitly works correctly.
+ */
+function test3() {
+ var ss = Cc["@mozilla.org/storagestream;1"].createInstance(
+ Ci.nsIStorageStream
+ );
+ ss.init(1024, 1024, null);
+
+ var out = ss.getOutputStream(0);
+ out.write("", 0);
+ try {
+ var inp = ss.newInputStream(0);
+ } catch (e) {
+ do_throw("newInputStream(0) shouldn't throw if write() is called: " + e);
+ }
+
+ Assert.ok(inp.isNonBlocking(), "next test expects a non-blocking stream");
+
+ try {
+ var threw = false;
+ var bis = BIS(inp);
+ bis.readByteArray(5);
+ } catch (e) {
+ if (e.result != Cr.NS_BASE_STREAM_WOULD_BLOCK) {
+ do_throw("wrong error thrown: " + e);
+ }
+ threw = true;
+ }
+ Assert.ok(threw, "should have thrown (nsStorageInputStream is nonblocking)");
+}
+
+/**
+ * Basic functionality test for storagestream: write data to it, get an input
+ * stream, and read the data back to see that it matches.
+ */
+function test4() {
+ var bytes = [65, 66, 67, 68, 69, 70, 71, 72, 73, 74];
+
+ var ss = Cc["@mozilla.org/storagestream;1"].createInstance(
+ Ci.nsIStorageStream
+ );
+ ss.init(1024, 1024, null);
+
+ var outStream = ss.getOutputStream(0);
+
+ var bos = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(
+ Ci.nsIBinaryOutputStream
+ );
+ bos.setOutputStream(outStream);
+
+ bos.writeByteArray(bytes);
+ bos.close();
+
+ var inp = ss.newInputStream(0);
+ var bis = BIS(inp);
+
+ var count = 0;
+ while (count < bytes.length) {
+ var data = bis.read8(1);
+ Assert.equal(data, bytes[count++]);
+ }
+
+ var threw = false;
+ try {
+ data = bis.read8(1);
+ } catch (e) {
+ if (e.result != Cr.NS_ERROR_FAILURE) {
+ do_throw("wrong error thrown: " + e);
+ }
+ threw = true;
+ }
+ if (!threw) {
+ do_throw("should have thrown but instead returned: '" + data + "'");
+ }
+}
+
+function BIS(input) {
+ var bis = Cc["@mozilla.org/binaryinputstream;1"].createInstance(
+ Ci.nsIBinaryInputStream
+ );
+ bis.setInputStream(input);
+ return bis;
+}