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