| /* |
| * Copyright 2018 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| //#define LOG_NDEBUG 0 |
| #define LOG_TAG "audio_utils_string_tests" |
| |
| #include <audio_utils/string.h> |
| #include <gtest/gtest.h> |
| |
| // fills the string buffer with a increasing ramp of values from start. |
| template <size_t size> |
| void fill(char (&s)[size], int start) { |
| for (size_t i = 0; i < size - 1; ++i) { |
| s[i] = start++; |
| } |
| s[size - 1] = 0; |
| } |
| |
| // checks that the fill counts from start, as expected to actual chars, |
| // whereupon the rest is expected to be zeroes. |
| template <size_t size> |
| void check(char (&s)[size], int start, size_t actual) { |
| size_t lim = std::min(actual, size); |
| size_t i = 0; |
| |
| if (lim > 0) { |
| for (; i < lim - 1; ++i) { |
| EXPECT_EQ(start, s[i]); |
| ++start; |
| } |
| } |
| for (; i < size; ++i) { |
| EXPECT_EQ(0, s[i]); |
| } |
| } |
| |
| TEST(audio_utils_string, check_zero_fill) { |
| // we use string arrays whose size is known by compiler, not vectors |
| constexpr size_t STRING_SIZE = 50; |
| union { |
| char dst[STRING_SIZE]; |
| char dst_mirror[STRING_SIZE + 10]; // verifier that we don't overwrite |
| }; |
| char over[sizeof(dst) + 5]; |
| char under[sizeof(dst) - 5]; |
| |
| // fill with a value ramp |
| constexpr int DST_START = 1; |
| constexpr int OVER_START = 2; |
| constexpr int UNDER_START = 3; |
| fill(dst_mirror, DST_START); |
| fill(over, OVER_START); |
| fill(under, UNDER_START); |
| |
| // union should overlay dst and dst_mirror. |
| dst[sizeof(dst) - 1] = 0; |
| check(dst, DST_START, sizeof(dst)); |
| EXPECT_EQ(sizeof(dst) + DST_START, dst_mirror[sizeof(dst)]); |
| |
| // make sure we truncate when copying a larger string. |
| audio_utils_strlcpy_zerofill(dst, over); |
| check(dst, OVER_START, sizeof(dst)); |
| |
| // check we didn't overwrite |
| EXPECT_EQ(sizeof(dst) + DST_START, dst_mirror[sizeof(dst)]); |
| |
| // make sure we fill remaining buffer with zeros. |
| audio_utils_strlcpy_zerofill(dst, under); |
| check(dst, UNDER_START, sizeof(under)); |
| |
| // check we didn't overwrite |
| EXPECT_EQ(sizeof(dst) + DST_START, dst_mirror[sizeof(dst)]); |
| } |