/* * * Copyright (c) 2022 Project CHIP Authors * All rights reserved. * * 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. */ #include #include #include #include using namespace chip; using namespace chip::IniEscaping; namespace { struct TestCase { const char * input; const char * expectedOutput; }; TEST(TestIniEscaping, TestEscaping) { EXPECT_EQ(EscapeKey(""), ""); EXPECT_EQ(EscapeKey("abcd1234,!"), "abcd1234,!"); EXPECT_EQ(EscapeKey("ab\ncd =12\\34\x7f"), "ab\\x0acd\\x20\\x3d12\\x5c34\\x7f"); EXPECT_EQ(EscapeKey(" "), "\\x20"); EXPECT_EQ(EscapeKey("==="), "\\x3d\\x3d\\x3d"); } TEST(TestIniEscaping, TestUnescaping) { // Test valid cases EXPECT_EQ(UnescapeKey(""), ""); EXPECT_EQ(UnescapeKey("abcd1234,!"), "abcd1234,!"); EXPECT_EQ(UnescapeKey("ab\\x0acd\\x20\\x3d12\\x5c34\\x7f"), "ab\ncd =12\\34\x7f"); EXPECT_EQ(UnescapeKey("\\x20"), " "); EXPECT_EQ(UnescapeKey("\\x3d\\x3d\\x3d"), "==="); EXPECT_EQ(UnescapeKey("\\x0d"), "\r"); EXPECT_EQ(UnescapeKey("\\x01\\x02\\x03\\x04\\x05\\x06\\x07"), "\x01\x02\x03\x04\x05\x06\x07"); EXPECT_EQ(UnescapeKey("\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e"), "\x08\x09\x0a\x0b\x0c\x0d\x0e"); EXPECT_EQ(UnescapeKey("\\x0f\\x10\\x11\\x12\\x13\\x14\\x15"), "\x0f\x10\x11\x12\x13\x14\x15"); EXPECT_EQ(UnescapeKey("\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c"), "\x16\x17\x18\x19\x1a\x1b\x1c"); EXPECT_EQ(UnescapeKey("\\x1d\\x1e\\x1f\\x20\\x7f\\x3d\\x5c"), "\x1d\x1e\x1f \x7f=\\"); EXPECT_EQ(UnescapeKey("\\x81\\x82\\xff"), "\x81\x82\xff"); // Test invalid cases // letters should never be escaped EXPECT_NE(UnescapeKey("\\x5a\55"), "ZU"); EXPECT_EQ(UnescapeKey("\\x5a\55"), ""); // Capitalized hex forbidden EXPECT_EQ(UnescapeKey("\\x0D"), ""); // Partial escapes forbidden EXPECT_EQ(UnescapeKey("1\\x0"), ""); } TEST(TestIniEscaping, TestRoundTrip) { EXPECT_EQ(UnescapeKey(EscapeKey("")), ""); EXPECT_EQ(UnescapeKey(EscapeKey("abcd1234,!")), "abcd1234,!"); EXPECT_EQ(UnescapeKey(EscapeKey("ab\ncd =12\\34\x7f")), "ab\ncd =12\\34\x7f"); EXPECT_EQ(UnescapeKey(EscapeKey(" ")), " "); EXPECT_EQ(UnescapeKey(EscapeKey("===")), "==="); EXPECT_EQ(UnescapeKey(EscapeKey("\r")), "\r"); EXPECT_EQ(UnescapeKey(EscapeKey("\x01\x02\x03\x04\x05\x06\x07")), "\x01\x02\x03\x04\x05\x06\x07"); EXPECT_EQ(UnescapeKey(EscapeKey("\x08\x09\x0a\x0b\x0c\x0d\x0e")), "\x08\x09\x0a\x0b\x0c\x0d\x0e"); EXPECT_EQ(UnescapeKey(EscapeKey("\x0f\x10\x11\x12\x13\x14\x15")), "\x0f\x10\x11\x12\x13\x14\x15"); EXPECT_EQ(UnescapeKey(EscapeKey("\x16\x17\x18\x19\x1a\x1b\x1c")), "\x16\x17\x18\x19\x1a\x1b\x1c"); EXPECT_EQ(UnescapeKey(EscapeKey("\x1d\x1e\x1f \x7f=\\")), "\x1d\x1e\x1f \x7f=\\"); EXPECT_EQ(UnescapeKey(EscapeKey("\x81\x82\xff")), "\x81\x82\xff"); // Make sure entire range is escapable for (int c = 0; c <= 255; c++) { std::string s(5, static_cast(c)); EXPECT_EQ(UnescapeKey(EscapeKey(s)), s) << "c: " << c; } } } // namespace