1 // Copyright (C) 2018-2019 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
9 #include <cc/stamped_element.h>
10 #include <boost/date_time/gregorian/gregorian.hpp>
11 #include <boost/date_time/posix_time/posix_time.hpp>
12 #include <gtest/gtest.h>
13
14 using namespace isc::data;
15
16 namespace {
17
18 // Tests that the modification timestamp is by default set to current
19 // time and the identifier is set to 0.
TEST(StampedElementTest,create)20 TEST(StampedElementTest, create) {
21 StampedElement element;
22
23 // Default identifier is 0.
24 EXPECT_EQ(0, element.getId());
25
26 // By default there is no server tag.
27 EXPECT_TRUE(element.getServerTags().empty());
28
29 // Checking that the delta between now and the timestamp is within
30 // 5s range should be sufficient.
31 boost::posix_time::time_duration delta =
32 boost::posix_time::second_clock::local_time() -
33 element.getModificationTime();
34 EXPECT_LT(delta.seconds(), 5);
35 }
36
37 // Tests that default id can be overridden by a new value.
TEST(StampedElementTest,setId)38 TEST(StampedElementTest, setId) {
39 StampedElement element;
40 element.setId(123);
41 EXPECT_EQ(123, element.getId());
42 }
43
44 // Tests that the modification timestamp can be set to an arbitrary
45 // value.
TEST(StampedElementTest,setModificationTime)46 TEST(StampedElementTest, setModificationTime) {
47 boost::posix_time::ptime
48 modification_time(boost::gregorian::date(2002, boost::date_time::Jan, 10),
49 boost::posix_time::time_duration(1,2,3));
50 StampedElement element;
51 element.setModificationTime(modification_time);
52 EXPECT_TRUE(element.getModificationTime() == modification_time);
53 }
54
55 // Tests that updating modification timestamp sets it to the current
56 // time.
TEST(StampedElementTest,update)57 TEST(StampedElementTest, update) {
58 boost::posix_time::ptime
59 modification_time(boost::gregorian::date(2002, boost::date_time::Jan, 10),
60 boost::posix_time::time_duration(1,2,3));
61 StampedElement element;
62 element.setModificationTime(modification_time);
63 element.updateModificationTime();
64
65 // Checking that the delta between now and the timestamp is within
66 // 5s range should be sufficient.
67 boost::posix_time::time_duration delta =
68 boost::posix_time::second_clock::local_time() -
69 element.getModificationTime();
70 EXPECT_LT(delta.seconds(), 5);
71 }
72
73 // Tests that one or more server tag can be specified.
TEST(StampedElementTest,setServerTag)74 TEST(StampedElementTest, setServerTag) {
75 StampedElement element;
76 element.setServerTag("foo");
77 EXPECT_EQ(1, element.getServerTags().size());
78 EXPECT_EQ("foo", element.getServerTags().begin()->get());
79
80 element.setServerTag("bar");
81 EXPECT_EQ(2, element.getServerTags().size());
82
83 EXPECT_TRUE(element.hasServerTag(ServerTag("foo")));
84 EXPECT_TRUE(element.hasServerTag(ServerTag("bar")));
85 EXPECT_FALSE(element.hasServerTag(ServerTag("xyz")));
86 EXPECT_FALSE(element.hasAllServerTag());
87
88 element.setServerTag(ServerTag::ALL);
89 EXPECT_TRUE(element.hasAllServerTag());
90 }
91
92 // Tests that a server tag can be deleted.
TEST(StampedElementTest,delServerTag)93 TEST(StampedElementTest, delServerTag) {
94 StampedElement element;
95 EXPECT_THROW(element.delServerTag("foo"), isc::NotFound);
96 element.setServerTag("foo");
97 element.setServerTag("bar");
98
99 ASSERT_EQ(2, element.getServerTags().size());
100 EXPECT_TRUE(element.hasServerTag(ServerTag("foo")));
101 EXPECT_TRUE(element.hasServerTag(ServerTag("bar")));
102
103 EXPECT_NO_THROW(element.delServerTag("foo"));
104 ASSERT_EQ(1, element.getServerTags().size());
105 EXPECT_TRUE(element.hasServerTag(ServerTag("bar")));
106
107 EXPECT_NO_THROW(element.delServerTag("bar"));
108 EXPECT_EQ(0, element.getServerTags().size());
109 EXPECT_THROW(element.delServerTag("bar"), isc::NotFound);
110 }
111
112
113 // Test that metadata can be created from the StampedElement.
TEST(StampedElementTest,getMetadata)114 TEST(StampedElementTest, getMetadata) {
115 StampedElement element;
116 element.setServerTag("world");
117 auto metadata = element.getMetadata();
118 ASSERT_TRUE(metadata);
119 ASSERT_EQ(Element::map, metadata->getType());
120
121 auto server_tags_element = metadata->get("server-tags");
122 ASSERT_TRUE(server_tags_element);
123 EXPECT_EQ(Element::list, server_tags_element->getType());
124 EXPECT_EQ(1, server_tags_element->size());
125
126 auto server_tag_element = server_tags_element->get(0);
127 ASSERT_TRUE(server_tag_element);
128 EXPECT_EQ(Element::string, server_tag_element->getType());
129 EXPECT_EQ("world", server_tag_element->stringValue());
130 }
131
132 }
133