1 // Copyright 2022 The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 // Unit tests for IniFile class.
16 #include "util/ini_file.h"
17 
18 #include <cstdio>
19 #include <fstream>
20 #include <string>
21 
22 #include "gtest/gtest.h"
23 
24 namespace netsim {
25 namespace testing {
26 namespace {
27 
28 class IniFileReadTest : public ::testing::TestWithParam<std::string> {
29  public:
SetUp()30   void SetUp() override {
31     tempFileName_ = std::tmpnam(NULL);
32     std::ofstream outTempFile(tempFileName_);
33     ASSERT_TRUE(outTempFile.is_open());
34     outTempFile << GetParam();
35     outTempFile.close();
36   }
TearDown()37   void TearDown() override {
38     // Delete temp file.
39     ASSERT_EQ(std::remove(tempFileName_), 0);
40   }
41   const char *tempFileName_;
42 };
43 
TEST_P(IniFileReadTest,Read)44 TEST_P(IniFileReadTest, Read) {
45   IniFile iniFile(tempFileName_);
46   iniFile.Read();
47 
48   EXPECT_TRUE(iniFile.HasKey("port"));
49   EXPECT_FALSE(iniFile.HasKey("unknown-key"));
50   EXPECT_TRUE(iniFile.Get("port").has_value());
51   EXPECT_EQ(iniFile.Get("port").value(), "123");
52   EXPECT_FALSE(iniFile.Get("unknown-key").has_value());
53 }
54 
55 INSTANTIATE_TEST_SUITE_P(IniFileParameters, IniFileReadTest,
56                          ::testing::Values("port=123", "port= 123", "port =123",
57                                            " port = 123 "));
58 
TEST(IniFileTest,SetTest)59 TEST(IniFileTest, SetTest) {
60   const char *tempFileName = tmpnam(NULL);
61   IniFile iniFile(tempFileName);
62 
63   EXPECT_FALSE(iniFile.HasKey("port"));
64   EXPECT_FALSE(iniFile.HasKey("unknown-key"));
65   EXPECT_FALSE(iniFile.Get("port").has_value());
66   EXPECT_FALSE(iniFile.Get("unknown-key").has_value());
67 
68   iniFile.Set("port", "123");
69   EXPECT_TRUE(iniFile.HasKey("port"));
70   EXPECT_FALSE(iniFile.HasKey("unknown-key"));
71   EXPECT_EQ(iniFile.Get("port").value(), "123");
72   EXPECT_FALSE(iniFile.Get("unknown-key").has_value());
73 
74   // Update the value of an existing key.
75   iniFile.Set("port", "234");
76   EXPECT_TRUE(iniFile.HasKey("port"));
77   EXPECT_FALSE(iniFile.HasKey("unknown-key"));
78   EXPECT_EQ(iniFile.Get("port").value(), "234");
79   EXPECT_FALSE(iniFile.Get("unknown-key").has_value());
80 }
81 
TEST(IniFileTest,WriteTest)82 TEST(IniFileTest, WriteTest) {
83   const char *tempFileName = tmpnam(NULL);
84   {
85     IniFile iniFile(tempFileName);
86 
87     EXPECT_FALSE(iniFile.HasKey("port"));
88     EXPECT_FALSE(iniFile.HasKey("unknown-key"));
89     EXPECT_FALSE(iniFile.Get("port").has_value());
90     EXPECT_FALSE(iniFile.Get("unknown-key").has_value());
91 
92     iniFile.Set("port", "123");
93     EXPECT_TRUE(iniFile.HasKey("port"));
94     EXPECT_FALSE(iniFile.HasKey("unknown-key"));
95     EXPECT_EQ(iniFile.Get("port").value(), "123");
96     EXPECT_FALSE(iniFile.Get("unknown-key").has_value());
97 
98     iniFile.Write();
99 
100     std::ifstream inTempFile(tempFileName);
101     std::string line;
102     ASSERT_TRUE(getline(inTempFile, line));
103     EXPECT_EQ(line, "port=123");
104     EXPECT_FALSE(getline(inTempFile, line));
105   }
106 
107   // Delete temp file.
108   ASSERT_EQ(std::remove(tempFileName), 0);
109 }
110 
111 }  // namespace
112 }  // namespace testing
113 }  // namespace netsim
114