blob: 68d150b76358ad6eeea0e080d837fe6cb39a72ed [file] [log] [blame]
Mike Lockwood94afecf2012-10-24 10:45:23 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <stdlib.h>
18#include <string.h>
19
Mike Lockwood94afecf2012-10-24 10:45:23 -070020#include <gtest/gtest.h>
21
Mike Lockwood94afecf2012-10-24 10:45:23 -070022#include "installd.h"
Jeff Sharkey19803802015-04-07 12:44:51 -070023
24#undef LOG_TAG
25#define LOG_TAG "utils_test"
Mike Lockwood94afecf2012-10-24 10:45:23 -070026
27#define TEST_DATA_DIR "/data/"
28#define TEST_APP_DIR "/data/app/"
29#define TEST_APP_PRIVATE_DIR "/data/app-private/"
30#define TEST_ASEC_DIR "/mnt/asec/"
Jeff Sharkey19803802015-04-07 12:44:51 -070031#define TEST_EXPAND_DIR "/mnt/expand/"
Mike Lockwood94afecf2012-10-24 10:45:23 -070032
33#define TEST_SYSTEM_DIR1 "/system/app/"
34#define TEST_SYSTEM_DIR2 "/vendor/app/"
35
36#define REALLY_LONG_APP_NAME "com.example." \
37 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \
38 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \
39 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
40
41#define REALLY_LONG_LEAF_NAME "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \
42 "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \
43 "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \
44 "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_"
45
46namespace android {
47
48class UtilsTest : public testing::Test {
49protected:
50 virtual void SetUp() {
Jeff Sharkey19803802015-04-07 12:44:51 -070051 android_app_dir.path = (char*) TEST_APP_DIR;
Mike Lockwood94afecf2012-10-24 10:45:23 -070052 android_app_dir.len = strlen(TEST_APP_DIR);
53
Jeff Sharkey19803802015-04-07 12:44:51 -070054 android_app_private_dir.path = (char*) TEST_APP_PRIVATE_DIR;
Mike Lockwood94afecf2012-10-24 10:45:23 -070055 android_app_private_dir.len = strlen(TEST_APP_PRIVATE_DIR);
56
Jeff Sharkey19803802015-04-07 12:44:51 -070057 android_data_dir.path = (char*) TEST_DATA_DIR;
Mike Lockwood94afecf2012-10-24 10:45:23 -070058 android_data_dir.len = strlen(TEST_DATA_DIR);
59
Jeff Sharkey19803802015-04-07 12:44:51 -070060 android_asec_dir.path = (char*) TEST_ASEC_DIR;
Mike Lockwood94afecf2012-10-24 10:45:23 -070061 android_asec_dir.len = strlen(TEST_ASEC_DIR);
62
Jeff Sharkey19803802015-04-07 12:44:51 -070063 android_mnt_expand_dir.path = (char*) TEST_EXPAND_DIR;
64 android_mnt_expand_dir.len = strlen(TEST_EXPAND_DIR);
65
Mike Lockwood94afecf2012-10-24 10:45:23 -070066 android_system_dirs.count = 2;
67
68 android_system_dirs.dirs = (dir_rec_t*) calloc(android_system_dirs.count, sizeof(dir_rec_t));
Jeff Sharkey19803802015-04-07 12:44:51 -070069 android_system_dirs.dirs[0].path = (char*) TEST_SYSTEM_DIR1;
Mike Lockwood94afecf2012-10-24 10:45:23 -070070 android_system_dirs.dirs[0].len = strlen(TEST_SYSTEM_DIR1);
71
Jeff Sharkey19803802015-04-07 12:44:51 -070072 android_system_dirs.dirs[1].path = (char*) TEST_SYSTEM_DIR2;
Mike Lockwood94afecf2012-10-24 10:45:23 -070073 android_system_dirs.dirs[1].len = strlen(TEST_SYSTEM_DIR2);
74 }
75
76 virtual void TearDown() {
77 free(android_system_dirs.dirs);
78 }
79};
80
81TEST_F(UtilsTest, IsValidApkPath_BadPrefix) {
82 // Bad prefixes directories
83 const char *badprefix1 = "/etc/passwd";
84 EXPECT_EQ(-1, validate_apk_path(badprefix1))
85 << badprefix1 << " should be allowed as a valid path";
86
87 const char *badprefix2 = "../.." TEST_APP_DIR "../../../blah";
88 EXPECT_EQ(-1, validate_apk_path(badprefix2))
89 << badprefix2 << " should be allowed as a valid path";
90
91 const char *badprefix3 = "init.rc";
92 EXPECT_EQ(-1, validate_apk_path(badprefix3))
93 << badprefix3 << " should be allowed as a valid path";
94
95 const char *badprefix4 = "/init.rc";
96 EXPECT_EQ(-1, validate_apk_path(badprefix4))
97 << badprefix4 << " should be allowed as a valid path";
98}
99
100TEST_F(UtilsTest, IsValidApkPath_Internal) {
101 // Internal directories
102 const char *internal1 = TEST_APP_DIR "example.apk";
103 EXPECT_EQ(0, validate_apk_path(internal1))
104 << internal1 << " should be allowed as a valid path";
105
Calin Juravlefd88ff22014-08-15 15:45:51 +0100106 // b/16888084
107 const char *path2 = TEST_APP_DIR "example.com/example.apk";
108 EXPECT_EQ(0, validate_apk_path(path2))
109 << path2 << " should be allowed as a valid path";
110
Mike Lockwood94afecf2012-10-24 10:45:23 -0700111 const char *badint1 = TEST_APP_DIR "../example.apk";
112 EXPECT_EQ(-1, validate_apk_path(badint1))
113 << badint1 << " should be rejected as a invalid path";
114
115 const char *badint2 = TEST_APP_DIR "/../example.apk";
116 EXPECT_EQ(-1, validate_apk_path(badint2))
117 << badint2 << " should be rejected as a invalid path";
118
Calin Juravlefd88ff22014-08-15 15:45:51 +0100119 // Only one subdir should be allowed.
120 const char *bad_path3 = TEST_APP_DIR "example.com/subdir/pkg.apk";
121 EXPECT_EQ(-1, validate_apk_path(bad_path3))
122 << bad_path3 << " should be rejected as a invalid path";
Calin Juravlec597b6d2014-08-19 17:43:05 +0100123
124 const char *bad_path4 = TEST_APP_DIR "example.com/subdir/../pkg.apk";
125 EXPECT_EQ(-1, validate_apk_path(bad_path4))
126 << bad_path4 << " should be rejected as a invalid path";
127
128 const char *bad_path5 = TEST_APP_DIR "example.com1/../example.com2/pkg.apk";
129 EXPECT_EQ(-1, validate_apk_path(bad_path5))
130 << bad_path5 << " should be rejected as a invalid path";
Mike Lockwood94afecf2012-10-24 10:45:23 -0700131}
132
133TEST_F(UtilsTest, IsValidApkPath_Private) {
134 // Internal directories
135 const char *private1 = TEST_APP_PRIVATE_DIR "example.apk";
136 EXPECT_EQ(0, validate_apk_path(private1))
137 << private1 << " should be allowed as a valid path";
138
Calin Juravlefd88ff22014-08-15 15:45:51 +0100139 // b/16888084
140 const char *path2 = TEST_APP_DIR "example.com/example.apk";
141 EXPECT_EQ(0, validate_apk_path(path2))
142 << path2 << " should be allowed as a valid path";
143
Mike Lockwood94afecf2012-10-24 10:45:23 -0700144 const char *badpriv1 = TEST_APP_PRIVATE_DIR "../example.apk";
145 EXPECT_EQ(-1, validate_apk_path(badpriv1))
146 << badpriv1 << " should be rejected as a invalid path";
147
148 const char *badpriv2 = TEST_APP_PRIVATE_DIR "/../example.apk";
149 EXPECT_EQ(-1, validate_apk_path(badpriv2))
150 << badpriv2 << " should be rejected as a invalid path";
151
Calin Juravlefd88ff22014-08-15 15:45:51 +0100152 // Only one subdir should be allowed.
153 const char *bad_path3 = TEST_APP_PRIVATE_DIR "example.com/subdir/pkg.apk";
154 EXPECT_EQ(-1, validate_apk_path(bad_path3))
155 << bad_path3 << " should be rejected as a invalid path";
Calin Juravlec597b6d2014-08-19 17:43:05 +0100156
157 const char *bad_path4 = TEST_APP_PRIVATE_DIR "example.com/subdir/../pkg.apk";
158 EXPECT_EQ(-1, validate_apk_path(bad_path4))
159 << bad_path4 << " should be rejected as a invalid path";
160
161 const char *bad_path5 = TEST_APP_PRIVATE_DIR "example.com1/../example.com2/pkg.apk";
162 EXPECT_EQ(-1, validate_apk_path(bad_path5))
163 << bad_path5 << " should be rejected as a invalid path";
Mike Lockwood94afecf2012-10-24 10:45:23 -0700164}
165
166
167TEST_F(UtilsTest, IsValidApkPath_AsecGood1) {
168 const char *asec1 = TEST_ASEC_DIR "example.apk";
169 EXPECT_EQ(0, validate_apk_path(asec1))
170 << asec1 << " should be allowed as a valid path";
171}
172
173TEST_F(UtilsTest, IsValidApkPath_AsecGood2) {
174 const char *asec2 = TEST_ASEC_DIR "com.example.asec/pkg.apk";
175 EXPECT_EQ(0, validate_apk_path(asec2))
176 << asec2 << " should be allowed as a valid path";
177}
178
179TEST_F(UtilsTest, IsValidApkPath_EscapeFail) {
180 const char *badasec1 = TEST_ASEC_DIR "../example.apk";
181 EXPECT_EQ(-1, validate_apk_path(badasec1))
182 << badasec1 << " should be rejected as a invalid path";
183}
184
185TEST_F(UtilsTest, IsValidApkPath_DoubleSlashFail) {
186 const char *badasec2 = TEST_ASEC_DIR "com.example.asec//pkg.apk";
187 EXPECT_EQ(-1, validate_apk_path(badasec2))
188 << badasec2 << " should be rejected as a invalid path";
189}
190
191TEST_F(UtilsTest, IsValidApkPath_SubdirEscapeFail) {
192 const char *badasec3 = TEST_ASEC_DIR "com.example.asec/../../../pkg.apk";
193 EXPECT_EQ(-1, validate_apk_path(badasec3))
194 << badasec3 << " should be rejected as a invalid path";
195}
196
197TEST_F(UtilsTest, IsValidApkPath_SlashEscapeFail) {
198 const char *badasec4 = TEST_ASEC_DIR "/../example.apk";
199 EXPECT_EQ(-1, validate_apk_path(badasec4))
200 << badasec4 << " should be rejected as a invalid path";
201}
202
203TEST_F(UtilsTest, IsValidApkPath_CrazyDirFail) {
204 const char *badasec5 = TEST_ASEC_DIR ".//../..";
205 EXPECT_EQ(-1, validate_apk_path(badasec5))
206 << badasec5 << " should be rejected as a invalid path";
207}
208
209TEST_F(UtilsTest, IsValidApkPath_SubdirEscapeSingleFail) {
210 const char *badasec6 = TEST_ASEC_DIR "com.example.asec/../pkg.apk";
211 EXPECT_EQ(-1, validate_apk_path(badasec6))
212 << badasec6 << " should be rejected as a invalid path";
213}
214
215TEST_F(UtilsTest, IsValidApkPath_TwoSubdirFail) {
216 const char *badasec7 = TEST_ASEC_DIR "com.example.asec/subdir1/pkg.apk";
217 EXPECT_EQ(-1, validate_apk_path(badasec7))
218 << badasec7 << " should be rejected as a invalid path";
219}
220
221TEST_F(UtilsTest, CheckSystemApp_Dir1) {
222 const char *sysapp1 = TEST_SYSTEM_DIR1 "Voice.apk";
223 EXPECT_EQ(0, validate_system_app_path(sysapp1))
224 << sysapp1 << " should be allowed as a system path";
225}
226
227TEST_F(UtilsTest, CheckSystemApp_Dir2) {
228 const char *sysapp2 = TEST_SYSTEM_DIR2 "com.example.myapp.apk";
229 EXPECT_EQ(0, validate_system_app_path(sysapp2))
230 << sysapp2 << " should be allowed as a system path";
231}
232
233TEST_F(UtilsTest, CheckSystemApp_EscapeFail) {
234 const char *badapp1 = TEST_SYSTEM_DIR1 "../com.example.apk";
235 EXPECT_EQ(-1, validate_system_app_path(badapp1))
236 << badapp1 << " should be rejected not a system path";
237}
238
239TEST_F(UtilsTest, CheckSystemApp_DoubleEscapeFail) {
240 const char *badapp2 = TEST_SYSTEM_DIR2 "/../../com.example.apk";
241 EXPECT_EQ(-1, validate_system_app_path(badapp2))
242 << badapp2 << " should be rejected not a system path";
243}
244
245TEST_F(UtilsTest, CheckSystemApp_BadPathEscapeFail) {
246 const char *badapp3 = TEST_APP_DIR "/../../com.example.apk";
247 EXPECT_EQ(-1, validate_system_app_path(badapp3))
248 << badapp3 << " should be rejected not a system path";
249}
250
Calin Juravlec597b6d2014-08-19 17:43:05 +0100251TEST_F(UtilsTest, CheckSystemApp_Subdir) {
252 const char *sysapp = TEST_SYSTEM_DIR1 "com.example/com.example.apk";
253 EXPECT_EQ(0, validate_system_app_path(sysapp))
254 << sysapp << " should be allowed as a system path";
255
256 const char *badapp = TEST_SYSTEM_DIR1 "com.example/subdir/com.example.apk";
257 EXPECT_EQ(-1, validate_system_app_path(badapp))
258 << badapp << " should be rejected not a system path";
259
260 const char *badapp1 = TEST_SYSTEM_DIR1 "com.example/subdir/../com.example.apk";
261 EXPECT_EQ(-1, validate_system_app_path(badapp1))
262 << badapp1 << " should be rejected not a system path";
263
264 const char *badapp2 = TEST_SYSTEM_DIR1 "com.example1/../com.example2/com.example.apk";
265 EXPECT_EQ(-1, validate_system_app_path(badapp2))
266 << badapp2 << " should be rejected not a system path";
267}
268
Mike Lockwood94afecf2012-10-24 10:45:23 -0700269TEST_F(UtilsTest, GetPathFromString_NullPathFail) {
270 dir_rec_t test1;
271 EXPECT_EQ(-1, get_path_from_string(&test1, (const char *) NULL))
272 << "Should not allow NULL as a path.";
273}
274
275TEST_F(UtilsTest, GetPathFromString_EmptyPathFail) {
276 dir_rec_t test1;
277 EXPECT_EQ(-1, get_path_from_string(&test1, ""))
278 << "Should not allow empty paths.";
279}
280
281TEST_F(UtilsTest, GetPathFromString_RelativePathFail) {
282 dir_rec_t test1;
283 EXPECT_EQ(-1, get_path_from_string(&test1, "mnt/asec"))
284 << "Should not allow relative paths.";
285}
286
287TEST_F(UtilsTest, GetPathFromString_NonCanonical) {
288 dir_rec_t test1;
289
290 EXPECT_EQ(0, get_path_from_string(&test1, "/mnt/asec"))
291 << "Should be able to canonicalize directory /mnt/asec";
292 EXPECT_STREQ("/mnt/asec/", test1.path)
293 << "/mnt/asec should be canonicalized to /mnt/asec/";
294 EXPECT_EQ(10, (ssize_t) test1.len)
295 << "path len should be equal to the length of /mnt/asec/ (10)";
296 free(test1.path);
297}
298
299TEST_F(UtilsTest, GetPathFromString_CanonicalPath) {
300 dir_rec_t test3;
301 EXPECT_EQ(0, get_path_from_string(&test3, "/data/app/"))
302 << "Should be able to canonicalize directory /data/app/";
303 EXPECT_STREQ("/data/app/", test3.path)
304 << "/data/app/ should be canonicalized to /data/app/";
305 EXPECT_EQ(10, (ssize_t) test3.len)
306 << "path len should be equal to the length of /data/app/ (10)";
307 free(test3.path);
308}
309
310TEST_F(UtilsTest, CreatePkgPath_LongPkgNameSuccess) {
311 char path[PKG_PATH_MAX];
312
313 // Create long packagename of "aaaaa..."
314 size_t pkgnameSize = PKG_NAME_MAX;
315 char pkgname[pkgnameSize + 1];
316 memset(pkgname, 'a', pkgnameSize);
317 pkgname[pkgnameSize] = '\0';
318
319 EXPECT_EQ(0, create_pkg_path(path, pkgname, "", 0))
320 << "Should successfully be able to create package name.";
321
322 const char *prefix = TEST_DATA_DIR PRIMARY_USER_PREFIX;
323 size_t offset = strlen(prefix);
324 EXPECT_STREQ(pkgname, path + offset)
325 << "Package path should be a really long string of a's";
326}
327
328TEST_F(UtilsTest, CreatePkgPath_LongPkgNameFail) {
329 char path[PKG_PATH_MAX];
330
331 // Create long packagename of "aaaaa..."
332 size_t pkgnameSize = PKG_NAME_MAX + 1;
333 char pkgname[pkgnameSize + 1];
334 memset(pkgname, 'a', pkgnameSize);
335 pkgname[pkgnameSize] = '\0';
336
337 EXPECT_EQ(-1, create_pkg_path(path, pkgname, "", 0))
338 << "Should return error because package name is too long.";
339}
340
341TEST_F(UtilsTest, CreatePkgPath_LongPostfixFail) {
342 char path[PKG_PATH_MAX];
343
344 // Create long packagename of "aaaaa..."
345 size_t postfixSize = PKG_PATH_MAX;
346 char postfix[postfixSize + 1];
347 memset(postfix, 'a', postfixSize);
348 postfix[postfixSize] = '\0';
349
350 EXPECT_EQ(-1, create_pkg_path(path, "com.example.package", postfix, 0))
351 << "Should return error because postfix is too long.";
352}
353
354TEST_F(UtilsTest, CreatePkgPath_PrimaryUser) {
355 char path[PKG_PATH_MAX];
356
357 EXPECT_EQ(0, create_pkg_path(path, "com.example.package", "", 0))
358 << "Should return error because postfix is too long.";
359
360 EXPECT_STREQ(TEST_DATA_DIR PRIMARY_USER_PREFIX "com.example.package", path)
361 << "Package path should be in /data/data/";
362}
363
364TEST_F(UtilsTest, CreatePkgPath_SecondaryUser) {
365 char path[PKG_PATH_MAX];
366
367 EXPECT_EQ(0, create_pkg_path(path, "com.example.package", "", 1))
368 << "Should successfully create package path.";
369
370 EXPECT_STREQ(TEST_DATA_DIR SECONDARY_USER_PREFIX "1/com.example.package", path)
371 << "Package path should be in /data/user/";
372}
373
374TEST_F(UtilsTest, CreatePkgPathInDir_ProtectedDir) {
375 char path[PKG_PATH_MAX];
376
377 dir_rec_t dir;
Jeff Sharkey19803802015-04-07 12:44:51 -0700378 dir.path = (char*) "/data/app-private/";
Mike Lockwood94afecf2012-10-24 10:45:23 -0700379 dir.len = strlen(dir.path);
380
381 EXPECT_EQ(0, create_pkg_path_in_dir(path, &dir, "com.example.package", ".apk"))
382 << "Should successfully create package path.";
383
384 EXPECT_STREQ("/data/app-private/com.example.package.apk", path)
385 << "Package path should be in /data/app-private/";
386}
387
388TEST_F(UtilsTest, CreatePersonaPath_Primary) {
389 char path[PKG_PATH_MAX];
390
Jeff Sharkeyabe4fe52013-07-10 16:55:46 -0700391 EXPECT_EQ(0, create_user_path(path, 0))
Mike Lockwood94afecf2012-10-24 10:45:23 -0700392 << "Should successfully build primary user path.";
393
394 EXPECT_STREQ("/data/data/", path)
395 << "Primary user should have correct path";
396}
397
398TEST_F(UtilsTest, CreatePersonaPath_Secondary) {
399 char path[PKG_PATH_MAX];
400
Jeff Sharkeyabe4fe52013-07-10 16:55:46 -0700401 EXPECT_EQ(0, create_user_path(path, 1))
Mike Lockwood94afecf2012-10-24 10:45:23 -0700402 << "Should successfully build primary user path.";
403
404 EXPECT_STREQ("/data/user/1/", path)
405 << "Primary user should have correct path";
406}
407
408TEST_F(UtilsTest, CreateMovePath_Primary) {
409 char path[PKG_PATH_MAX];
410
411 EXPECT_EQ(0, create_move_path(path, "com.android.test", "shared_prefs", 0))
412 << "Should be able to create move path for primary user";
413
414 EXPECT_STREQ("/data/data/com.android.test/shared_prefs", path)
415 << "Primary user package directory should be created correctly";
416}
417
418TEST_F(UtilsTest, CreateMovePath_Fail_AppTooLong) {
419 char path[PKG_PATH_MAX];
420
421 EXPECT_EQ(-1, create_move_path(path, REALLY_LONG_APP_NAME, "shared_prefs", 0))
422 << "Should fail to create move path for primary user";
423}
424
425TEST_F(UtilsTest, CreateMovePath_Fail_LeafTooLong) {
426 char path[PKG_PATH_MAX];
427
428 EXPECT_EQ(-1, create_move_path(path, "com.android.test", REALLY_LONG_LEAF_NAME, 0))
429 << "Should fail to create move path for primary user";
430}
431
432TEST_F(UtilsTest, CopyAndAppend_Normal) {
433 //int copy_and_append(dir_rec_t* dst, dir_rec_t* src, char* suffix)
434 dir_rec_t dst;
435 dir_rec_t src;
436
Jeff Sharkey19803802015-04-07 12:44:51 -0700437 src.path = (char*) "/data/";
Mike Lockwood94afecf2012-10-24 10:45:23 -0700438 src.len = strlen(src.path);
439
440 EXPECT_EQ(0, copy_and_append(&dst, &src, "app/"))
441 << "Should return error because postfix is too long.";
442
443 EXPECT_STREQ("/data/app/", dst.path)
444 << "Appended path should be correct";
445
446 EXPECT_EQ(10, (ssize_t) dst.len)
447 << "Appended path should be length of '/data/app/' (10)";
448}
449
450TEST_F(UtilsTest, AppendAndIncrement_Normal) {
451 size_t dst_size = 10;
452 char dst[dst_size];
453 char *dstp = dst;
454 const char* src = "FOO";
455
456 EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size))
457 << "String should append successfully";
458
459 EXPECT_STREQ("FOO", dst)
460 << "String should append correctly";
461
462 EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size))
463 << "String should append successfully again";
464
465 EXPECT_STREQ("FOOFOO", dst)
466 << "String should append correctly again";
467}
468
469TEST_F(UtilsTest, AppendAndIncrement_TooBig) {
470 size_t dst_size = 5;
471 char dst[dst_size];
472 char *dstp = dst;
473 const char* src = "FOO";
474
475 EXPECT_EQ(0, append_and_increment(&dstp, src, &dst_size))
476 << "String should append successfully";
477
478 EXPECT_STREQ("FOO", dst)
479 << "String should append correctly";
480
481 EXPECT_EQ(-1, append_and_increment(&dstp, src, &dst_size))
482 << "String should fail because it's too large to fit";
483}
484
485}