@@ -121,3 +121,127 @@ TEST(UtilTest, UncheckedCalloc) {
121
121
EXPECT_NE (nullptr , UncheckedCalloc (0 ));
122
122
EXPECT_NE (nullptr , UncheckedCalloc (1 ));
123
123
}
124
+
125
+ template <typename T>
126
+ static void MaybeStackBufferBasic () {
127
+ using node::MaybeStackBuffer;
128
+
129
+ MaybeStackBuffer<T> buf;
130
+ size_t old_length;
131
+ size_t old_capacity;
132
+
133
+ /* Default constructor */
134
+ EXPECT_EQ (0U , buf.length ());
135
+ EXPECT_FALSE (buf.IsAllocated ());
136
+ EXPECT_GT (buf.capacity (), buf.length ());
137
+
138
+ /* SetLength() expansion */
139
+ buf.SetLength (buf.capacity ());
140
+ EXPECT_EQ (buf.capacity (), buf.length ());
141
+ EXPECT_FALSE (buf.IsAllocated ());
142
+
143
+ /* Means of accessing raw buffer */
144
+ EXPECT_EQ (buf.out (), *buf);
145
+ EXPECT_EQ (&buf[0 ], *buf);
146
+
147
+ /* Basic I/O */
148
+ for (size_t i = 0 ; i < buf.length (); i++)
149
+ buf[i] = static_cast <T>(i);
150
+ for (size_t i = 0 ; i < buf.length (); i++)
151
+ EXPECT_EQ (static_cast <T>(i), buf[i]);
152
+
153
+ /* SetLengthAndZeroTerminate() */
154
+ buf.SetLengthAndZeroTerminate (buf.capacity () - 1 );
155
+ EXPECT_EQ (buf.capacity () - 1 , buf.length ());
156
+ for (size_t i = 0 ; i < buf.length (); i++)
157
+ EXPECT_EQ (static_cast <T>(i), buf[i]);
158
+ buf.SetLength (buf.capacity ());
159
+ EXPECT_EQ (0 , buf[buf.length () - 1 ]);
160
+
161
+ /* Initial Realloc */
162
+ old_length = buf.length () - 1 ;
163
+ old_capacity = buf.capacity ();
164
+ buf.AllocateSufficientStorage (buf.capacity () * 2 );
165
+ EXPECT_EQ (buf.capacity (), buf.length ());
166
+ EXPECT_TRUE (buf.IsAllocated ());
167
+ for (size_t i = 0 ; i < old_length; i++)
168
+ EXPECT_EQ (static_cast <T>(i), buf[i]);
169
+ EXPECT_EQ (0 , buf[old_length]);
170
+
171
+ /* SetLength() reduction and expansion */
172
+ for (size_t i = 0 ; i < buf.length (); i++)
173
+ buf[i] = static_cast <T>(i);
174
+ buf.SetLength (10 );
175
+ for (size_t i = 0 ; i < buf.length (); i++)
176
+ EXPECT_EQ (static_cast <T>(i), buf[i]);
177
+ buf.SetLength (buf.capacity ());
178
+ for (size_t i = 0 ; i < buf.length (); i++)
179
+ EXPECT_EQ (static_cast <T>(i), buf[i]);
180
+
181
+ /* Subsequent Realloc */
182
+ old_length = buf.length ();
183
+ old_capacity = buf.capacity ();
184
+ buf.AllocateSufficientStorage (old_capacity * 1.5 );
185
+ EXPECT_EQ (buf.capacity (), buf.length ());
186
+ EXPECT_EQ (static_cast <size_t >(old_capacity * 1.5 ), buf.length ());
187
+ EXPECT_TRUE (buf.IsAllocated ());
188
+ for (size_t i = 0 ; i < old_length; i++)
189
+ EXPECT_EQ (static_cast <T>(i), buf[i]);
190
+
191
+ /* Basic I/O on Realloc'd buffer */
192
+ for (size_t i = 0 ; i < buf.length (); i++)
193
+ buf[i] = static_cast <T>(i);
194
+ for (size_t i = 0 ; i < buf.length (); i++)
195
+ EXPECT_EQ (static_cast <T>(i), buf[i]);
196
+
197
+ /* Release() */
198
+ T* rawbuf = buf.out ();
199
+ buf.Release ();
200
+ EXPECT_EQ (0U , buf.length ());
201
+ EXPECT_FALSE (buf.IsAllocated ());
202
+ EXPECT_GT (buf.capacity (), buf.length ());
203
+ free (rawbuf);
204
+ }
205
+
206
+ TEST (UtilTest, MaybeStackBuffer) {
207
+ using node::MaybeStackBuffer;
208
+
209
+ MaybeStackBufferBasic<uint8_t >();
210
+ MaybeStackBufferBasic<uint16_t >();
211
+
212
+ // Constructor with size parameter
213
+ {
214
+ MaybeStackBuffer<unsigned char > buf (100 );
215
+ EXPECT_EQ (100U , buf.length ());
216
+ EXPECT_FALSE (buf.IsAllocated ());
217
+ EXPECT_GT (buf.capacity (), buf.length ());
218
+ buf.SetLength (buf.capacity ());
219
+ EXPECT_EQ (buf.capacity (), buf.length ());
220
+ EXPECT_FALSE (buf.IsAllocated ());
221
+ for (size_t i = 0 ; i < buf.length (); i++)
222
+ buf[i] = static_cast <unsigned char >(i);
223
+ for (size_t i = 0 ; i < buf.length (); i++)
224
+ EXPECT_EQ (static_cast <unsigned char >(i), buf[i]);
225
+
226
+ MaybeStackBuffer<unsigned char > bigbuf (10000 );
227
+ EXPECT_EQ (10000U , bigbuf.length ());
228
+ EXPECT_TRUE (bigbuf.IsAllocated ());
229
+ EXPECT_EQ (bigbuf.length (), bigbuf.capacity ());
230
+ for (size_t i = 0 ; i < bigbuf.length (); i++)
231
+ bigbuf[i] = static_cast <unsigned char >(i);
232
+ for (size_t i = 0 ; i < bigbuf.length (); i++)
233
+ EXPECT_EQ (static_cast <unsigned char >(i), bigbuf[i]);
234
+ }
235
+
236
+ // Invalidated buffer
237
+ {
238
+ MaybeStackBuffer<char > buf;
239
+ buf.Invalidate ();
240
+ EXPECT_TRUE (buf.IsInvalidated ());
241
+ EXPECT_FALSE (buf.IsAllocated ());
242
+ EXPECT_EQ (0U , buf.length ());
243
+ EXPECT_EQ (0U , buf.capacity ());
244
+ buf.Invalidate ();
245
+ EXPECT_TRUE (buf.IsInvalidated ());
246
+ }
247
+ }
0 commit comments