Coverage Report

Created: 2018-09-25 14:53

/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
}