1212f53e8SRatan Gupta #include <experimental/filesystem>
2212f53e8SRatan Gupta #include <fstream>
3212f53e8SRatan Gupta #include <gtest/gtest.h>
4212f53e8SRatan Gupta #include <netinet/in.h>
5212f53e8SRatan Gupta 
6212f53e8SRatan Gupta #include "snmp_client.hpp"
7212f53e8SRatan Gupta #include "snmp_conf_manager.hpp"
8212f53e8SRatan Gupta #include "snmp_serialize.hpp"
9212f53e8SRatan Gupta 
10212f53e8SRatan Gupta namespace phosphor
11212f53e8SRatan Gupta {
12212f53e8SRatan Gupta namespace network
13212f53e8SRatan Gupta {
14212f53e8SRatan Gupta namespace snmp
15212f53e8SRatan Gupta {
16212f53e8SRatan Gupta 
17212f53e8SRatan Gupta constexpr auto clientObjPath = "/xyz/openbmc_test/snmp/client";
18212f53e8SRatan Gupta namespace fs = std::experimental::filesystem;
19212f53e8SRatan Gupta 
20212f53e8SRatan Gupta class TestSerialize : public testing::Test
21212f53e8SRatan Gupta {
22212f53e8SRatan Gupta   public:
23212f53e8SRatan Gupta     sdbusplus::bus::bus bus;
24212f53e8SRatan Gupta     ConfManager manager;
25212f53e8SRatan Gupta     TestSerialize() :
26212f53e8SRatan Gupta         bus(sdbusplus::bus::new_default()),
27212f53e8SRatan Gupta         manager(bus, "/xyz/openbmc_test/snmp/manager")
28212f53e8SRatan Gupta     {
29212f53e8SRatan Gupta         char tmp[] = "/tmp/snmpManager.XXXXXX";
30212f53e8SRatan Gupta         std::string confDir = mkdtemp(tmp);
31212f53e8SRatan Gupta         manager.dbusPersistentLocation = confDir;
32212f53e8SRatan Gupta     }
33212f53e8SRatan Gupta     ~TestSerialize()
34212f53e8SRatan Gupta     {
35212f53e8SRatan Gupta         std::error_code ec;
36212f53e8SRatan Gupta         fs::remove_all(manager.dbusPersistentLocation, ec);
37212f53e8SRatan Gupta     }
38212f53e8SRatan Gupta };
39212f53e8SRatan Gupta 
40212f53e8SRatan Gupta TEST_F(TestSerialize, serialize)
41212f53e8SRatan Gupta {
42*a7ff3850SRatan Gupta     std::string objPath = clientObjPath;
43*a7ff3850SRatan Gupta     objPath += "/" + std::to_string(1);
44212f53e8SRatan Gupta 
45*a7ff3850SRatan Gupta     Client client(bus, objPath.c_str(), manager, "1.1.1.1", 23);
46*a7ff3850SRatan Gupta 
47*a7ff3850SRatan Gupta     auto path = serialize(1, client, manager.dbusPersistentLocation);
48*a7ff3850SRatan Gupta     Client restoreClient(bus, objPath.c_str(), manager);
49212f53e8SRatan Gupta 
50212f53e8SRatan Gupta     deserialize(path, restoreClient);
51212f53e8SRatan Gupta 
52212f53e8SRatan Gupta     EXPECT_EQ("1.1.1.1", restoreClient.address());
53212f53e8SRatan Gupta     EXPECT_EQ(23, restoreClient.port());
54212f53e8SRatan Gupta }
55212f53e8SRatan Gupta 
56212f53e8SRatan Gupta TEST_F(TestSerialize, deserialize_non_existent_file)
57212f53e8SRatan Gupta {
58*a7ff3850SRatan Gupta     std::string objPath = clientObjPath;
59*a7ff3850SRatan Gupta     objPath += "/" + std::to_string(1);
60*a7ff3850SRatan Gupta 
61*a7ff3850SRatan Gupta     Client client(bus, objPath.c_str(), manager);
62212f53e8SRatan Gupta     fs::path path = manager.dbusPersistentLocation;
63*a7ff3850SRatan Gupta     path /= "1";
64212f53e8SRatan Gupta 
65212f53e8SRatan Gupta     auto ret = deserialize(path, client);
66212f53e8SRatan Gupta 
67212f53e8SRatan Gupta     EXPECT_EQ(false, ret);
68212f53e8SRatan Gupta }
69212f53e8SRatan Gupta 
70212f53e8SRatan Gupta TEST_F(TestSerialize, deserialize_empty_file)
71212f53e8SRatan Gupta {
72*a7ff3850SRatan Gupta     std::string objPath = clientObjPath;
73*a7ff3850SRatan Gupta     objPath += "/" + std::to_string(1);
74*a7ff3850SRatan Gupta 
75*a7ff3850SRatan Gupta     Client restoreClient(bus, objPath.c_str(), manager);
76212f53e8SRatan Gupta 
77212f53e8SRatan Gupta     std::fstream file;
78212f53e8SRatan Gupta 
79212f53e8SRatan Gupta     fs::path path = manager.dbusPersistentLocation;
80*a7ff3850SRatan Gupta     path /= "1";
81212f53e8SRatan Gupta 
82212f53e8SRatan Gupta     file.open(path.string(), std::ofstream::out);
83212f53e8SRatan Gupta     file.close();
84212f53e8SRatan Gupta     // deserialize the object with empty file
85212f53e8SRatan Gupta     auto ret = deserialize(path, restoreClient);
86212f53e8SRatan Gupta     EXPECT_EQ(false, ret);
87212f53e8SRatan Gupta }
88212f53e8SRatan Gupta 
89212f53e8SRatan Gupta } // namespace snmp
90212f53e8SRatan Gupta } // namespace network
91212f53e8SRatan Gupta } // namespace phosphor
92