| OLD | NEW |
| (Empty) |
| 1 // Copyright 2010 Google Inc. | |
| 2 // | |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
| 4 // you may not use this file except in compliance with the License. | |
| 5 // You may obtain a copy of the License at | |
| 6 // | |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | |
| 8 // | |
| 9 // Unless required by applicable law or agreed to in writing, software | |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 12 // See the License for the specific language governing permissions and | |
| 13 // limitations under the License. | |
| 14 // ======================================================================== | |
| 15 // | |
| 16 // SafeCStringFormat unit tests. | |
| 17 | |
| 18 #include "omaha/base/safe_format.h" | |
| 19 #include "omaha/testing/unit_test.h" | |
| 20 | |
| 21 namespace omaha { | |
| 22 | |
| 23 TEST(SafeFormatTest, BrokenCStringFormatTruncates) { | |
| 24 // TODO(omaha): See http://b/1016121 for details. As of Sept 2010, | |
| 25 // CString::Format() is implemented using ::wvsprintf(), which has | |
| 26 // an internal 1024-byte buffer limit. A bug has been filed with | |
| 27 // Microsoft. If this test breaks, it means that we have gotten a | |
| 28 // new version of ATL/MFC with a fixed CString and can use that | |
| 29 // instead of SafeCStrFormat/AppendFormat. | |
| 30 | |
| 31 TCHAR largestr[4000] = { 0 }; | |
| 32 | |
| 33 for (int i = 0; i < ARRAYSIZE(largestr); ++i) { | |
| 34 largestr[i] = _T('a') + static_cast<TCHAR>(i % 26); | |
| 35 } | |
| 36 largestr[ARRAYSIZE(largestr) - 1] = _T('\0'); | |
| 37 | |
| 38 CString test_string; | |
| 39 test_string.Format(_T("%s"), largestr); | |
| 40 EXPECT_EQ(1024, test_string.GetLength()); | |
| 41 test_string.AppendFormat(_T("%s"), largestr); | |
| 42 EXPECT_EQ(2048, test_string.GetLength()); | |
| 43 } | |
| 44 | |
| 45 TEST(SafeFormatTest, SafeFormatDoesNotTruncate) { | |
| 46 TCHAR largestr[4000] = { 0 }; | |
| 47 | |
| 48 for (int i = 0; i < ARRAYSIZE(largestr); ++i) { | |
| 49 largestr[i] = _T('a') + static_cast<TCHAR>(i % 26); | |
| 50 } | |
| 51 largestr[ARRAYSIZE(largestr) - 1] = _T('\0'); | |
| 52 | |
| 53 CString test_string; | |
| 54 SafeCStringFormat(&test_string, _T("%s"), largestr); | |
| 55 EXPECT_EQ(ARRAYSIZE(largestr) - 1, test_string.GetLength()); | |
| 56 | |
| 57 SafeCStringAppendFormat(&test_string, _T("%s"), largestr); | |
| 58 EXPECT_EQ(2 * (ARRAYSIZE(largestr) - 1), test_string.GetLength()); | |
| 59 } | |
| 60 | |
| 61 TEST(SafeFormatTest, FormatBasicFieldTypes) { | |
| 62 CString test_string; | |
| 63 | |
| 64 test_string.Empty(); | |
| 65 SafeCStringFormat(&test_string, _T("%%")); | |
| 66 EXPECT_STREQ(_T("%"), test_string); | |
| 67 | |
| 68 test_string.Empty(); | |
| 69 SafeCStringFormat(&test_string, _T("%c"), _T('h')); | |
| 70 EXPECT_STREQ(_T("h"), test_string); | |
| 71 | |
| 72 test_string.Empty(); | |
| 73 SafeCStringFormat(&test_string, _T("%d"), -42); | |
| 74 EXPECT_STREQ(_T("-42"), test_string); | |
| 75 | |
| 76 test_string.Empty(); | |
| 77 SafeCStringFormat(&test_string, _T("%6u"), 1337); | |
| 78 EXPECT_STREQ(_T(" 1337"), test_string); | |
| 79 | |
| 80 test_string.Empty(); | |
| 81 SafeCStringFormat(&test_string, _T("%010X"), 3545084735U); | |
| 82 EXPECT_STREQ(_T("00D34DB33F"), test_string); | |
| 83 | |
| 84 test_string.Empty(); | |
| 85 SafeCStringFormat(&test_string, _T("%0.3f"), 123.456); | |
| 86 EXPECT_STREQ(_T("123.456"), test_string); | |
| 87 | |
| 88 test_string.Empty(); | |
| 89 SafeCStringFormat(&test_string, _T("\"%s\""), _T("ut_str")); | |
| 90 EXPECT_STREQ(_T("\"ut_str\""), test_string); | |
| 91 | |
| 92 test_string.Empty(); | |
| 93 SafeCStringFormat(&test_string, _T("\"%s\""), NULL); | |
| 94 EXPECT_STREQ(_T("\"(null)\""), test_string); | |
| 95 } | |
| 96 | |
| 97 TEST(SafeFormatTest, AppendFormatBasicFieldTypes) { | |
| 98 const CString prefix = _T("ut_prefix"); | |
| 99 CString test_string; | |
| 100 | |
| 101 test_string = prefix; | |
| 102 SafeCStringAppendFormat(&test_string, _T("%%")); | |
| 103 EXPECT_STREQ(prefix + _T("%"), test_string); | |
| 104 | |
| 105 test_string = prefix; | |
| 106 SafeCStringAppendFormat(&test_string, _T("%c"), _T('h')); | |
| 107 EXPECT_STREQ(prefix + _T("h"), test_string); | |
| 108 | |
| 109 test_string = prefix; | |
| 110 SafeCStringAppendFormat(&test_string, _T("%d"), -42); | |
| 111 EXPECT_STREQ(prefix + _T("-42"), test_string); | |
| 112 | |
| 113 test_string = prefix; | |
| 114 SafeCStringAppendFormat(&test_string, _T("%6u"), 1337); | |
| 115 EXPECT_STREQ(prefix + _T(" 1337"), test_string); | |
| 116 | |
| 117 test_string = prefix; | |
| 118 SafeCStringAppendFormat(&test_string, _T("%010X"), 3545084735U); | |
| 119 EXPECT_STREQ(prefix + _T("00D34DB33F"), test_string); | |
| 120 | |
| 121 test_string = prefix; | |
| 122 SafeCStringAppendFormat(&test_string, _T("%0.3f"), 123.456); | |
| 123 EXPECT_STREQ(prefix + _T("123.456"), test_string); | |
| 124 | |
| 125 test_string = prefix; | |
| 126 SafeCStringAppendFormat(&test_string, _T("\"%s\""), _T("ut_str")); | |
| 127 EXPECT_STREQ(prefix + _T("\"ut_str\""), test_string); | |
| 128 | |
| 129 test_string = prefix; | |
| 130 SafeCStringAppendFormat(&test_string, _T("\"%s\""), NULL); | |
| 131 EXPECT_STREQ(prefix + _T("\"(null)\""), test_string); | |
| 132 } | |
| 133 | |
| 134 TEST(SafeFormatTest, FormatComplex) { | |
| 135 CString test_string = _T("prefix: "); | |
| 136 SafeCStringAppendFormat(&test_string, _T("Test: %cx%08X '%s' %4d %0.2f"), | |
| 137 _T('0'), 12648430, _T("utstr"), 42, 123.456); | |
| 138 EXPECT_STREQ(_T("prefix: Test: 0x00C0FFEE 'utstr' 42 123.46"), test_string); | |
| 139 } | |
| 140 | |
| 141 } // namespace omaha | |
| OLD | NEW |