OpenVPN 3 Core Library
Loading...
Searching...
No Matches
test_optional_ref.cpp
Go to the documentation of this file.
1
2// OpenVPN -- An application to securely tunnel IP networks
3// over a single port, with support for SSL/TLS-based
4// session authentication and key exchange,
5// packet encryption, packet authentication, and
6// packet compression.
7//
8// Copyright (C) 2024- OpenVPN Inc.
9//
10// This program is free software: you can redistribute it and/or modify
11// it under the terms of the GNU Affero General Public License Version 3
12// as published by the Free Software Foundation.
13//
14// This program is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17// GNU Affero General Public License for more details.
18//
19// You should have received a copy of the GNU Affero General Public License
20// along with this program in the COPYING file.
21// If not, see <http://www.gnu.org/licenses/>.
22//
23//
24// Basic unit test for the openvpn/openssl/pki/x509certinfo.hpp functions
25//
26
27#include "test_common.hpp"
28
30
31
33{
34 int i = 0;
35};
36
37TEST(OptionalRefSuite, Simple)
38{
39 int i = 42;
40 auto o = openvpn::optional<int &>(i);
41 EXPECT_TRUE(o);
42 EXPECT_EQ(o.value(), i);
43 EXPECT_EQ(*o, i);
44}
45
46TEST(OptionalRefSuite, SimpleConst)
47{
48 const int i = 42;
50 EXPECT_TRUE(o);
51 EXPECT_EQ(o.value(), i);
52 EXPECT_EQ(*o, i);
53}
54
55TEST(OptionalRefSuite, AssignTo)
56{
57 int i = 42;
58 auto o = openvpn::optional<int &>(i);
59 int j = 0;
61 j = 96;
62 EXPECT_TRUE(o);
63 EXPECT_EQ(o.value(), j);
64 EXPECT_EQ(*o, j);
65}
66
67TEST(OptionalRefSuite, AssignThru)
68{
69 int i = 42;
70 auto o = openvpn::optional<int &>(i);
71 EXPECT_TRUE(o);
72 EXPECT_EQ(42, *o);
73 *o = 96;
74 EXPECT_EQ(i, 96);
75}
76
77TEST(OptionalRefSuite, AssignPtrThru)
78{
79 int i = 42;
80 auto o = openvpn::optional<int &>(&i);
81 EXPECT_TRUE(o);
82 EXPECT_EQ(42, *o);
83 *o = 96;
84 EXPECT_EQ(i, 96);
85}
86
87TEST(OptionalRefSuite, Invalid)
88{
89 auto o = openvpn::optional<int &>();
90 EXPECT_THROW(o.value(), std::runtime_error);
91 EXPECT_THROW(*o, std::runtime_error);
92}
93
94TEST(OptionalRefSuite, InvalidNullopt)
95{
96 auto o = openvpn::optional<int &>(std::nullopt);
97 EXPECT_THROW(o.value(), std::runtime_error);
98 EXPECT_THROW(*o, std::runtime_error);
99}
100
101TEST(OptionalRefSuite, AssignNullopt)
102{
103 int i = 42;
104 auto o = openvpn::optional<int &>(i);
105 EXPECT_TRUE(o);
106 EXPECT_EQ(o.value(), i);
107 EXPECT_EQ(*o, i);
108 o = std::nullopt;
109 EXPECT_THROW(o.value(), std::runtime_error);
110 EXPECT_THROW(*o, std::runtime_error);
111}
112
113
114TEST(OptionalRefSuite, ValueOr)
115{
116 int i = 42;
117 auto o = openvpn::optional<int &>(i);
118 EXPECT_TRUE(o);
119 EXPECT_EQ(o.value_or(96), 42);
120}
121
122TEST(OptionalRefSuite, ValueOrDefault)
123{
124 auto o = openvpn::optional<int &>(std::nullopt);
125 EXPECT_FALSE(o);
126 EXPECT_EQ(o.value_or(42), 42);
127}
128
129TEST(OptionalRefSuite, ValueOrDefaultLvalue)
130{
131 auto o = openvpn::optional<int &>(std::nullopt);
132 EXPECT_FALSE(o);
133 const int i = 42;
134 EXPECT_EQ(o.value_or(i), i);
135}
136
137TEST(OptionalRefSuite, Deref)
138{
139 auto t = test_optional();
141 EXPECT_EQ(o->i, 0);
142 o->i = 42;
143 EXPECT_EQ(o->i, 42);
144}
145
146TEST(OptionalRefSuite, DerefInvalid)
147{
149 EXPECT_FALSE(o);
150 EXPECT_ANY_THROW([[maybe_unused]] auto t = o->i);
151}
designed to represent an optional reference to an object of type T
TEST(OptionalRefSuite, Simple)