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