summaryrefslogtreecommitdiffstats
path: root/xpcom/tests/unit/test_storagestream.js
diff options
context:
space:
mode:
Diffstat (limited to 'xpcom/tests/unit/test_storagestream.js')
-rw-r--r--xpcom/tests/unit/test_storagestream.js162
1 files changed, 162 insertions, 0 deletions
diff --git a/xpcom/tests/unit/test_storagestream.js b/xpcom/tests/unit/test_storagestream.js
new file mode 100644
index 000000000..33fdc2202
--- /dev/null
+++ b/xpcom/tests/unit/test_storagestream.js
@@ -0,0 +1,162 @@
+/* -*- 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/. */
+
+var Cc = Components.classes;
+var Ci = Components.interfaces;
+var Cr = Components.results;
+
+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 out = ss.getOutputStream(0);
+ var inp2 = ss.newInputStream(0);
+ do_check_eq(inp2.available(), 0);
+ do_check_true(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;
+ }
+ do_check_true(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
+ {
+ var inp2 = 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);
+ }
+
+ do_check_true(inp.isNonBlocking(), "next test expects a non-blocking stream");
+
+ try
+ {
+ var threw = false;
+ var bis = BIS(inp);
+ var dummy = bis.readByteArray(5);
+ }
+ catch (e)
+ {
+ if (e.result != Cr.NS_BASE_STREAM_WOULD_BLOCK)
+ do_throw("wrong error thrown: " + e);
+ threw = true;
+ }
+ do_check_true(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, bytes.length);
+ bos.close();
+
+ var inp = ss.newInputStream(0);
+ var bis = BIS(inp);
+
+ var count = 0;
+ while (count < bytes.length)
+ {
+ var data = bis.read8(1);
+ do_check_eq(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;
+}