/src/mozilla-central/xpcom/tests/gtest/TestStorageStream.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* vim: set ts=8 sts=2 et sw=2 tw=80: */ |
3 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
4 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
5 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
6 | | |
7 | | #include <stdlib.h> |
8 | | #include "gtest/gtest.h" |
9 | | #include "Helpers.h" |
10 | | #include "nsCOMPtr.h" |
11 | | #include "nsICloneableInputStream.h" |
12 | | #include "nsIInputStream.h" |
13 | | #include "nsIOutputStream.h" |
14 | | #include "nsIStorageStream.h" |
15 | | #include "nsTArray.h" |
16 | | |
17 | | namespace { |
18 | | |
19 | | void |
20 | | WriteData(nsIOutputStream* aOut, nsTArray<char>& aData, uint32_t aNumBytes, |
21 | | nsACString& aDataWritten) |
22 | 0 | { |
23 | 0 | uint32_t n; |
24 | 0 | nsresult rv = aOut->Write(aData.Elements(), aNumBytes, &n); |
25 | 0 | EXPECT_TRUE(NS_SUCCEEDED(rv)); |
26 | 0 | aDataWritten.Append(aData.Elements(), aNumBytes); |
27 | 0 | } |
28 | | |
29 | | } // namespace |
30 | | |
31 | | TEST(StorageStreams, Main) |
32 | 0 | { |
33 | 0 | // generate some test data we will write in 4k chunks to the stream |
34 | 0 | nsTArray<char> kData; |
35 | 0 | testing::CreateData(4096, kData); |
36 | 0 |
|
37 | 0 | // track how much data was written so we can compare at the end |
38 | 0 | nsAutoCString dataWritten; |
39 | 0 |
|
40 | 0 | nsresult rv; |
41 | 0 | nsCOMPtr<nsIStorageStream> stor; |
42 | 0 |
|
43 | 0 | rv = NS_NewStorageStream(kData.Length(), UINT32_MAX, getter_AddRefs(stor)); |
44 | 0 | EXPECT_TRUE(NS_SUCCEEDED(rv)); |
45 | 0 |
|
46 | 0 | nsCOMPtr<nsIOutputStream> out; |
47 | 0 | rv = stor->GetOutputStream(0, getter_AddRefs(out)); |
48 | 0 | EXPECT_TRUE(NS_SUCCEEDED(rv)); |
49 | 0 |
|
50 | 0 | WriteData(out, kData, kData.Length(), dataWritten); |
51 | 0 | WriteData(out, kData, kData.Length(), dataWritten); |
52 | 0 |
|
53 | 0 | rv = out->Close(); |
54 | 0 | EXPECT_TRUE(NS_SUCCEEDED(rv)); |
55 | 0 | out = nullptr; |
56 | 0 |
|
57 | 0 | nsCOMPtr<nsIInputStream> in; |
58 | 0 | rv = stor->NewInputStream(0, getter_AddRefs(in)); |
59 | 0 | EXPECT_TRUE(NS_SUCCEEDED(rv)); |
60 | 0 |
|
61 | 0 | nsCOMPtr<nsICloneableInputStream> cloneable = do_QueryInterface(in); |
62 | 0 | ASSERT_TRUE(cloneable != nullptr); |
63 | 0 | ASSERT_TRUE(cloneable->GetCloneable()); |
64 | 0 |
|
65 | 0 | nsCOMPtr<nsIInputStream> clone; |
66 | 0 | rv = cloneable->Clone(getter_AddRefs(clone)); |
67 | 0 |
|
68 | 0 | testing::ConsumeAndValidateStream(in, dataWritten); |
69 | 0 | testing::ConsumeAndValidateStream(clone, dataWritten); |
70 | 0 | in = nullptr; |
71 | 0 | clone = nullptr; |
72 | 0 |
|
73 | 0 | // now, write 3 more full 4k segments + 11 bytes, starting at 8192 |
74 | 0 | // total written equals 20491 bytes |
75 | 0 |
|
76 | 0 | rv = stor->GetOutputStream(dataWritten.Length(), getter_AddRefs(out)); |
77 | 0 | EXPECT_TRUE(NS_SUCCEEDED(rv)); |
78 | 0 |
|
79 | 0 | WriteData(out, kData, kData.Length(), dataWritten); |
80 | 0 | WriteData(out, kData, kData.Length(), dataWritten); |
81 | 0 | WriteData(out, kData, kData.Length(), dataWritten); |
82 | 0 | WriteData(out, kData, 11, dataWritten); |
83 | 0 |
|
84 | 0 | rv = out->Close(); |
85 | 0 | EXPECT_TRUE(NS_SUCCEEDED(rv)); |
86 | 0 | out = nullptr; |
87 | 0 |
|
88 | 0 | // now, read all |
89 | 0 | rv = stor->NewInputStream(0, getter_AddRefs(in)); |
90 | 0 | EXPECT_TRUE(NS_SUCCEEDED(rv)); |
91 | 0 |
|
92 | 0 | testing::ConsumeAndValidateStream(in, dataWritten); |
93 | 0 | in = nullptr; |
94 | 0 | } |
95 | | |
96 | | TEST(StorageStreams, EarlyInputStream) |
97 | 0 | { |
98 | 0 | // generate some test data we will write in 4k chunks to the stream |
99 | 0 | nsTArray<char> kData; |
100 | 0 | testing::CreateData(4096, kData); |
101 | 0 |
|
102 | 0 | // track how much data was written so we can compare at the end |
103 | 0 | nsAutoCString dataWritten; |
104 | 0 |
|
105 | 0 | nsresult rv; |
106 | 0 | nsCOMPtr<nsIStorageStream> stor; |
107 | 0 |
|
108 | 0 | rv = NS_NewStorageStream(kData.Length(), UINT32_MAX, getter_AddRefs(stor)); |
109 | 0 | EXPECT_TRUE(NS_SUCCEEDED(rv)); |
110 | 0 |
|
111 | 0 | // Get input stream before writing data into the output stream |
112 | 0 | nsCOMPtr<nsIInputStream> in; |
113 | 0 | rv = stor->NewInputStream(0, getter_AddRefs(in)); |
114 | 0 | EXPECT_TRUE(NS_SUCCEEDED(rv)); |
115 | 0 |
|
116 | 0 | // Write data to output stream |
117 | 0 | nsCOMPtr<nsIOutputStream> out; |
118 | 0 | rv = stor->GetOutputStream(0, getter_AddRefs(out)); |
119 | 0 | EXPECT_TRUE(NS_SUCCEEDED(rv)); |
120 | 0 |
|
121 | 0 | WriteData(out, kData, kData.Length(), dataWritten); |
122 | 0 | WriteData(out, kData, kData.Length(), dataWritten); |
123 | 0 |
|
124 | 0 | rv = out->Close(); |
125 | 0 | EXPECT_TRUE(NS_SUCCEEDED(rv)); |
126 | 0 | out = nullptr; |
127 | 0 |
|
128 | 0 | // Should be able to consume input stream |
129 | 0 | testing::ConsumeAndValidateStream(in, dataWritten); |
130 | 0 | in = nullptr; |
131 | 0 | } |