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