TEST(Settings, Errors) { Settings test; EXPECT_FALSE(test.Open("non-existent")); ASSERT_TRUE(test.Open("test/config.toml.test")); EXPECT_TRUE(test.GetRawString("NonExistent").empty()); EXPECT_TRUE(test.GetStringSet("NonExistent").empty()); auto isEmpty = test.GetArray<std::list, std::string>("NonExistent").empty(); EXPECT_TRUE(isEmpty); }
TEST(Settings, Read) { Settings test; ASSERT_TRUE(test.Open("test/config.toml.test")); EXPECT_EQ("jid_value", test.GetUserJID()); EXPECT_EQ("password_value", test.GetPassword()); EXPECT_EQ("muc_value", test.GetMUC()); EXPECT_EQ("StringValue", test.GetRawString("TestGroup.StringName")); auto stringSet = test.GetStringSet("TestGroup.StringSetName"); EXPECT_EQ(2, stringSet.size()); EXPECT_EQ("StringValue1", *stringSet.begin()); EXPECT_EQ("StringValue2", *stringSet.rbegin()); auto set = test.GetArray<std::vector, std::int64_t>("TestGroup.NumArray"); EXPECT_EQ(3, set.size()); EXPECT_EQ(4, set.at(0)); EXPECT_EQ(5, set.at(1)); EXPECT_EQ(6, set.at(2)); }
bool FilterList::SaveToFile(LPCTSTR pFileName) const { Settings Setting; if (!Setting.Open(pFileName, TEXT("Filters"), Settings::OPEN_WRITE)) return false; Setting.Clear(); for (int i = 0; i < (int)m_FilterList.size(); i++) { const FilterInfo &Filter = m_FilterList[i]; TCHAR szKeyName[64]; int KeyPrefixLength = FormatString(szKeyName, cvLengthOf(szKeyName), TEXT("Filter%d."), i); LPTSTR pszKeyProp = szKeyName + KeyPrefixLength; int MaxKeyProp = cvLengthOf(szKeyName) - KeyPrefixLength; TCHAR szBuffer[64]; CopyString(pszKeyProp, MaxKeyProp, TEXT("Type")); Setting.Write(szKeyName, (int)Filter.Type); CopyString(pszKeyProp, MaxKeyProp, TEXT("Match")); Setting.Write(szKeyName, (int)Filter.Match); if (Filter.Match == FilterInfo::MATCH_EQUAL) { FormatIPAddress(Filter.Address, szBuffer, cvLengthOf(szBuffer)); CopyString(pszKeyProp, MaxKeyProp, TEXT("Address")); Setting.Write(szKeyName, szBuffer); } else if (Filter.Match == FilterInfo::MATCH_RANGE) { FormatIPAddress(Filter.AddressRange.Low, szBuffer, cvLengthOf(szBuffer)); CopyString(pszKeyProp, MaxKeyProp, TEXT("AddressLow")); Setting.Write(szKeyName, szBuffer); FormatIPAddress(Filter.AddressRange.High, szBuffer, cvLengthOf(szBuffer)); CopyString(pszKeyProp, MaxKeyProp, TEXT("AddressHigh")); Setting.Write(szKeyName, szBuffer); } else { cvDebugTrace(TEXT("Invalid filter match type %d\n"), Filter.Match); } if (Filter.HostName[0] != _T('\0')) { CopyString(pszKeyProp, MaxKeyProp, TEXT("HostName")); Setting.Write(szKeyName, Filter.HostName); } CopyString(pszKeyProp, MaxKeyProp, TEXT("Enable")); Setting.Write(szKeyName, Filter.Enable); SYSTEMTIME st; ::FileTimeToSystemTime(&Filter.AddedTime, &st); FormatString(szBuffer, cvLengthOf(szBuffer), TEXT("%d%02d%02d%02d%02d%02d%03d"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); CopyString(pszKeyProp, MaxKeyProp, TEXT("AddedTime")); Setting.Write(szKeyName, szBuffer); if (Filter.Comment[0] != _T('\0')) { CopyString(pszKeyProp, MaxKeyProp, TEXT("Comment")); Setting.Write(szKeyName, Filter.Comment); } } Setting.Close(); return true; }
bool FilterList::LoadFromFile(LPCTSTR pFileName) { Clear(); Settings Setting; if (!Setting.Open(pFileName, TEXT("Filters"), Settings::OPEN_READ)) return false; for (int i = 0;; i++) { TCHAR szKeyName[64]; int KeyPrefixLength = FormatString(szKeyName, cvLengthOf(szKeyName), TEXT("Filter%d."), i); LPTSTR pszKeyProp = szKeyName + KeyPrefixLength; int MaxKeyProp = cvLengthOf(szKeyName) - KeyPrefixLength; FilterInfo Filter; int Type, Match; TCHAR szBuffer[64]; CopyString(pszKeyProp, MaxKeyProp, TEXT("Type")); if (!Setting.Read(szKeyName, &Type)) break; if (Type < 0 || Type >= FilterInfo::TYPE_TRAILER) continue; Filter.Type = (FilterInfo::FilterType)Type; CopyString(pszKeyProp, MaxKeyProp, TEXT("Match")); if (!Setting.Read(szKeyName, &Match) || Match < 0 || Match >= FilterInfo::MATCH_TRAILER) continue; Filter.Match = (FilterInfo::MatchType)Match; if (Filter.Match == FilterInfo::MATCH_EQUAL) { CopyString(pszKeyProp, MaxKeyProp, TEXT("Address")); if (!Setting.Read(szKeyName, szBuffer, cvLengthOf(szBuffer)) || !Filter.Address.Parse(szBuffer)) continue; } else if (Filter.Match == FilterInfo::MATCH_RANGE) { CopyString(pszKeyProp, MaxKeyProp, TEXT("AddressLow")); if (!Setting.Read(szKeyName, szBuffer, cvLengthOf(szBuffer)) || !Filter.AddressRange.Low.Parse(szBuffer)) continue; CopyString(pszKeyProp, MaxKeyProp, TEXT("AddressHigh")); if (!Setting.Read(szKeyName, szBuffer, cvLengthOf(szBuffer)) || !Filter.AddressRange.High.Parse(szBuffer)) continue; } else { cvDebugTrace(TEXT("Invalid filter match type %d\n"), Filter.Match); continue; } Filter.HostName[0] = _T('\0'); CopyString(pszKeyProp, MaxKeyProp, TEXT("HostName")); Setting.Read(szKeyName, Filter.HostName, cvLengthOf(Filter.HostName)); Filter.Enable = true; CopyString(pszKeyProp, MaxKeyProp, TEXT("Enable")); Setting.Read(szKeyName, &Filter.Enable); ::GetSystemTimeAsFileTime(&Filter.AddedTime); CopyString(pszKeyProp, MaxKeyProp, TEXT("AddedTime")); if (Setting.Read(szKeyName, szBuffer, cvLengthOf(szBuffer))) { ULONGLONG Time = StrToUInt64(szBuffer); SYSTEMTIME st; FILETIME ft; st.wYear = (WORD)(Time / 10000000000000); st.wMonth = (WORD)((Time / 100000000000) % 100); st.wDay = (WORD)((Time / 1000000000) % 100); st.wHour = (WORD)((Time / 10000000) % 100); st.wMinute = (WORD)((Time / 100000) % 100); st.wSecond = (WORD)((Time / 1000) % 100); st.wMilliseconds = (WORD)(Time % 1000); if (::SystemTimeToFileTime(&st, &ft)) Filter.AddedTime = ft; } Filter.Comment[0] = _T('\0'); CopyString(pszKeyProp, MaxKeyProp, TEXT("Comment")); Setting.Read(szKeyName, Filter.Comment, cvLengthOf(Filter.Comment)); Filter.ID = ++m_IDCount; AddFilter(Filter); } Setting.Close(); return true; }
TEST(Settings, Reload) { Settings test; ASSERT_TRUE(test.Open("test/config.toml.test")); ASSERT_TRUE(test.Reload()); }