OpenVPN 3 Core Library
Loading...
Searching...
No Matches
test_wstring.cpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2024- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12
13#include "test_common.hpp"
14
16
17using namespace openvpn;
18
19// Fixture for the tests below
20class WStringTest : public testing::Test
21{
22 protected:
23 const std::string jojo = "Jürgen Wößner";
24 const std::string lev = "Лев Толстой";
25 const std::string shigeru = "宮本茂";
26
27 const std::array<std::wstring::value_type, 14> raw_jojo = {
28 0x004a, 0x00fc, 0x0072, 0x0067, 0x0065, 0x006e, 0x0020, 0x0057, 0x00f6, 0x00df, 0x006e, 0x0065, 0x0072, 0x0000};
29 const std::array<std::wstring::value_type, 12> raw_lev = {
30 0x041b, 0x0435, 0x0432, 0x0020, 0x0422, 0x043e, 0x043b, 0x0441, 0x0442, 0x043e, 0x0439, 0x0000};
31 const std::array<std::wstring::value_type, 4> raw_shigeru = {
32 0x5bae, 0x672c, 0x8302, 0x0000};
33
34 const std::wstring wide_jojo = raw_jojo.data();
35 const std::wstring wide_lev = raw_lev.data();
36 const std::wstring wide_shigeru = raw_shigeru.data();
37};
38
40{
41 std::wstring utf16_jojo = wstring::from_utf8(jojo);
42 EXPECT_EQ(utf16_jojo.size(), wide_jojo.size());
43 EXPECT_TRUE(utf16_jojo == wide_jojo);
44
45 std::wstring utf16_lev = wstring::from_utf8(lev);
46 EXPECT_EQ(utf16_lev.size(), wide_lev.size());
47 EXPECT_TRUE(utf16_lev == wide_lev);
48
49 std::wstring utf16_shigeru = wstring::from_utf8(shigeru);
50 EXPECT_EQ(utf16_shigeru.size(), wide_shigeru.size());
51 EXPECT_TRUE(utf16_shigeru == wide_shigeru);
52}
53
55{
56 std::string utf8_jojo = wstring::to_utf8(wide_jojo);
57 EXPECT_EQ(utf8_jojo.size(), jojo.size());
58 EXPECT_TRUE(utf8_jojo == jojo);
59
60 std::string utf8_lev = wstring::to_utf8(wide_lev);
61 EXPECT_EQ(utf8_lev.size(), lev.size());
62 EXPECT_TRUE(utf8_lev == lev);
63
64 std::string utf8_shigeru = wstring::to_utf8(wide_shigeru);
65 EXPECT_EQ(utf8_shigeru.size(), shigeru.size());
66 EXPECT_TRUE(utf8_shigeru == shigeru);
67}
68
69TEST_F(WStringTest, MultiSzFromVector)
70{
71 std::vector<std::string> names{jojo, lev, shigeru};
72 std::wstring multi_names = wstring::pack_string_vector(names);
73 const auto jojo_ptr = multi_names.data();
74 const auto lev_ptr = multi_names.data() + raw_jojo.size();
75 const auto shigeru_ptr = multi_names.data() + raw_jojo.size() + raw_lev.size();
76 EXPECT_EQ(multi_names.size(), raw_jojo.size() + raw_lev.size() + raw_shigeru.size() + 1);
77 EXPECT_TRUE(std::memcmp(jojo_ptr, wide_jojo.c_str(), raw_jojo.size()) == 0);
78 EXPECT_TRUE(std::memcmp(lev_ptr, wide_lev.c_str(), raw_lev.size()) == 0);
79 EXPECT_TRUE(std::memcmp(shigeru_ptr, wide_shigeru.c_str(), raw_shigeru.size()) == 0);
80 EXPECT_EQ(multi_names[multi_names.size()], L'\0');
81}
const std::wstring wide_lev
const std::array< std::wstring::value_type, 14 > raw_jojo
const std::string shigeru
const std::wstring wide_shigeru
const std::wstring wide_jojo
const std::array< std::wstring::value_type, 4 > raw_shigeru
const std::string jojo
const std::string lev
const std::array< std::wstring::value_type, 12 > raw_lev
TEST_F(WStringTest, FromUtf8)