1 // Copyright (C) 2011-2020 Internet Systems Consortium, Inc. ("ISC")
2 //
3 // This Source Code Form is subject to the terms of the Mozilla Public
4 // License, v. 2.0. If a copy of the MPL was not distributed with this
5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7 #include <config.h>
8 #include <dhcp/classify.h>
9 #include <gtest/gtest.h>
10
11 using namespace isc::dhcp;
12
13 // Trivial test for now as ClientClass is a std::string.
TEST(ClassifyTest,ClientClass)14 TEST(ClassifyTest, ClientClass) {
15
16 ClientClass x("foo");
17 EXPECT_EQ("foo", x);
18
19 x = "baz";
20 EXPECT_EQ("baz", x);
21 }
22
23 // Checks if ClientClasses object is able to store classes' names and then
24 // properly return values of contains() method.
TEST(ClassifyTest,ClientClasses)25 TEST(ClassifyTest, ClientClasses) {
26 ClientClasses classes;
27
28 EXPECT_FALSE(classes.contains(""));
29 EXPECT_FALSE(classes.contains("alpha"));
30 EXPECT_FALSE(classes.contains("beta"));
31 EXPECT_FALSE(classes.contains("gamma"));
32 classes.insert("beta");
33 EXPECT_FALSE(classes.contains(""));
34 EXPECT_FALSE(classes.contains("alpha"));
35 EXPECT_TRUE (classes.contains("beta"));
36 EXPECT_FALSE(classes.contains("gamma"));
37
38 classes.insert("alpha");
39 classes.insert("gamma");
40 EXPECT_TRUE (classes.contains("alpha"));
41 EXPECT_TRUE (classes.contains("beta"));
42 EXPECT_TRUE (classes.contains("gamma"));
43 }
44
45 // Check if ClientClasses object can be created from the string of comma
46 // separated values.
TEST(ClassifyTest,ClientClassesFromString)47 TEST(ClassifyTest, ClientClassesFromString) {
48 {
49 ClientClasses classes("alpha, beta, gamma");
50 EXPECT_EQ(3, classes.size());
51 EXPECT_FALSE(classes.contains(""));
52 EXPECT_TRUE(classes.contains("alpha"));
53 EXPECT_TRUE(classes.contains("beta"));
54 EXPECT_TRUE(classes.contains("gamma"));
55 }
56
57 {
58 ClientClasses classes("alpha, , beta ,");
59 EXPECT_EQ(2, classes.size());
60 EXPECT_TRUE(classes.contains("alpha"));
61 EXPECT_FALSE(classes.contains(""));
62 EXPECT_TRUE(classes.contains("beta"));
63 }
64
65 {
66 ClientClasses classes("");
67 EXPECT_TRUE(classes.empty());
68 }
69
70 {
71 ClientClasses classes(" ");
72 EXPECT_TRUE(classes.empty());
73 }
74
75 {
76 ClientClasses classes(", ,, ,");
77 EXPECT_TRUE(classes.empty());
78 }
79 }
80
81 // Check if one can iterate over a ClientClasses object
TEST(ClassifyTest,ClientClassesIterator)82 TEST(ClassifyTest, ClientClassesIterator) {
83 ClientClasses classes("alpha, beta, gamma");
84 size_t count = 0;
85 bool seenalpha = false;
86 bool seenbeta = false;
87 bool seengamma = false;
88 bool seendelta = false;
89 for (ClientClasses::const_iterator it = classes.cbegin();
90 it != classes.cend(); ++it) {
91 ++count;
92 if (*it == "alpha") {
93 seenalpha = true;
94 } else if (*it == "beta") {
95 seenbeta = true;
96 } else if (*it == "gamma") {
97 seengamma = true;
98 } else if (*it == "delta") {
99 seendelta = true;
100 } else {
101 ADD_FAILURE() << "Got unexpected " << *it;
102 }
103 }
104 EXPECT_EQ(count, classes.size());
105 EXPECT_TRUE(seenalpha);
106 EXPECT_TRUE(seenbeta);
107 EXPECT_TRUE(seengamma);
108 EXPECT_FALSE(seendelta);
109 }
110
111 // Check that the ClientClasses::toText function returns
112 // correct values.
TEST(ClassifyTest,ClientClassesToText)113 TEST(ClassifyTest, ClientClassesToText) {
114 // No classes.
115 ClientClasses classes;
116 EXPECT_TRUE(classes.toText().empty());
117
118 // Insert single class name and see if it doesn't include spurious
119 // comma after it.
120 classes.insert("alpha");
121 EXPECT_EQ("alpha", classes.toText());
122
123 // Insert next class name and see that both classes are present.
124 classes.insert("gamma");
125 EXPECT_EQ("alpha, gamma", classes.toText());
126
127 // Insert third class and make sure they get ordered in insert order.
128 classes.insert("beta");
129 EXPECT_EQ("alpha, gamma, beta", classes.toText());
130
131 // Check non-standard separator.
132 EXPECT_EQ("alpha.gamma.beta", classes.toText("."));
133 }
134
135 // Check that selected class can be erased.
TEST(ClassifyTest,Erase)136 TEST(ClassifyTest, Erase) {
137 ClientClasses classes;
138
139 classes.insert("alpha");
140 classes.insert("beta");
141 EXPECT_TRUE(classes.contains("alpha"));
142 EXPECT_TRUE(classes.contains("beta"));
143
144 classes.erase("beta");
145 EXPECT_TRUE(classes.contains("alpha"));
146 EXPECT_FALSE(classes.contains("beta"));
147
148 classes.erase("alpha");
149 EXPECT_FALSE(classes.contains("alpha"));
150 EXPECT_FALSE(classes.contains("beta"));
151 }
152