Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2c1e86ed authored by Luke Huang's avatar Luke Huang Committed by Automerger Merge Worker
Browse files

Fix default value problem of DnsResolver Experiments#getFlag() am: a893556b...

Fix default value problem of DnsResolver Experiments#getFlag() am: a893556b am: d97fa753 am: 2f233162 am: 4f3c39e7 am: 7b99113d

Change-Id: I125a6eeecee4995640d276c06b7d9f48108e33f1
parents 3e315509 7b99113d
Loading
Loading
Loading
Loading
+8 −3
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


#include "Experiments.h"
#include "Experiments.h"


#include <android-base/format.h>
#include <netdutils/DumpWriter.h>
#include <netdutils/DumpWriter.h>
#include <string>
#include <string>


@@ -46,21 +47,25 @@ void Experiments::dump(DumpWriter& dw) const {
    dw.println("Experiments list: ");
    dw.println("Experiments list: ");
    for (const auto& [key, value] : mFlagsMapInt) {
    for (const auto& [key, value] : mFlagsMapInt) {
        ScopedIndent indentStats(dw);
        ScopedIndent indentStats(dw);
        dw.println("%.*s: %d", static_cast<int>(key.length()), key.data(), value);
        if (value == Experiments::kFlagIntDefault) {
            dw.println(fmt::format("{}: UNSET", key));
        } else {
            dw.println(fmt::format("{}: {}", key, value));
        }
    }
    }
}
}


void Experiments::updateInternal() {
void Experiments::updateInternal() {
    std::lock_guard guard(mMutex);
    std::lock_guard guard(mMutex);
    for (const auto& key : kExperimentFlagKeyList) {
    for (const auto& key : kExperimentFlagKeyList) {
        mFlagsMapInt[key] = mGetExperimentFlagIntFunction(key, 0);
        mFlagsMapInt[key] = mGetExperimentFlagIntFunction(key, Experiments::kFlagIntDefault);
    }
    }
}
}


int Experiments::getFlag(std::string_view key, int defaultValue) const {
int Experiments::getFlag(std::string_view key, int defaultValue) const {
    std::lock_guard guard(mMutex);
    std::lock_guard guard(mMutex);
    auto it = mFlagsMapInt.find(key);
    auto it = mFlagsMapInt.find(key);
    if (it != mFlagsMapInt.end()) {
    if (it != mFlagsMapInt.end() && it->second != Experiments::kFlagIntDefault) {
        return it->second;
        return it->second;
    }
    }
    return defaultValue;
    return defaultValue;
+3 −0
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


#pragma once
#pragma once


#include <climits>
#include <mutex>
#include <mutex>
#include <string>
#include <string>
#include <string_view>
#include <string_view>
@@ -49,6 +50,8 @@ class Experiments {
    // (retry_count, retransmission_time_interval, dot_connect_timeout_ms)
    // (retry_count, retransmission_time_interval, dot_connect_timeout_ms)
    static constexpr const char* const kExperimentFlagKeyList[] = {
    static constexpr const char* const kExperimentFlagKeyList[] = {
            "keep_listening_udp", "parallel_lookup", "parallel_lookup_sleep_time"};
            "keep_listening_udp", "parallel_lookup", "parallel_lookup_sleep_time"};
    // This value is used in updateInternal as the default value if any flags can't be found.
    static constexpr int kFlagIntDefault = INT_MIN;
    // For testing.
    // For testing.
    friend class ExperimentsTest;
    friend class ExperimentsTest;
    const GetExperimentFlagIntFunction mGetExperimentFlagIntFunction;
    const GetExperimentFlagIntFunction mGetExperimentFlagIntFunction;
+30 −0
Original line number Original line Diff line number Diff line
@@ -59,6 +59,19 @@ class ExperimentsTest : public ::testing::Test {
        EXPECT_THAT(mExperiments.mFlagsMapInt, ::testing::ContainerEq(sFakeFlagsMapInt));
        EXPECT_THAT(mExperiments.mFlagsMapInt, ::testing::ContainerEq(sFakeFlagsMapInt));
    }
    }


    void expectFlagsMapIntDefault() {
        std::lock_guard guard(mExperiments.mMutex);
        for (const auto& [key, value] : mExperiments.mFlagsMapInt) {
            EXPECT_EQ(value, Experiments::kFlagIntDefault);
        }
    }

    void expectGetDnsExperimentFlagIntDefault(int value) {
        for (const auto& key : Experiments::kExperimentFlagKeyList) {
            EXPECT_EQ(mExperiments.getFlag(key, value), value);
        }
    }

    void expectGetDnsExperimentFlagInt() {
    void expectGetDnsExperimentFlagInt() {
        std::unordered_map<std::string_view, int> tempMap;
        std::unordered_map<std::string_view, int> tempMap;
        for (const auto& key : Experiments::kExperimentFlagKeyList) {
        for (const auto& key : Experiments::kExperimentFlagKeyList) {
@@ -78,6 +91,9 @@ class ExperimentsTest : public ::testing::Test {
        std::lock_guard guard(mExperiments.mMutex);
        std::lock_guard guard(mExperiments.mMutex);
        for (const auto& [key, value] : mExperiments.mFlagsMapInt) {
        for (const auto& [key, value] : mExperiments.mFlagsMapInt) {
            std::string flagDump = fmt::format("{}: {}", key, value);
            std::string flagDump = fmt::format("{}: {}", key, value);
            if (value == Experiments::kFlagIntDefault) {
                flagDump = fmt::format("{}: UNSET", key);
            }
            SCOPED_TRACE(flagDump);
            SCOPED_TRACE(flagDump);
            size_t pos = dumpString.find(flagDump, startPos);
            size_t pos = dumpString.find(flagDump, startPos);
            EXPECT_NE(pos, std::string::npos);
            EXPECT_NE(pos, std::string::npos);
@@ -110,6 +126,17 @@ TEST_F(ExperimentsTest, getDnsExperimentFlagInt) {
    }
    }
}
}


TEST_F(ExperimentsTest, getDnsExperimentFlagIntDefaultValue) {
    // Clear the map and make mExperiments initialized with our default int value.
    sFakeFlagsMapInt.clear();
    mExperiments.update();
    expectFlagsMapIntDefault();
    std::vector<int> testValues = {100, 50, 30, 5};
    for (int testValue : testValues) {
        expectGetDnsExperimentFlagIntDefault(testValue);
    }
}

TEST_F(ExperimentsTest, dump) {
TEST_F(ExperimentsTest, dump) {
    std::vector<int> testValues = {100, 37, 0, 30};
    std::vector<int> testValues = {100, 37, 0, 30};
    for (int testValue : testValues) {
    for (int testValue : testValues) {
@@ -117,6 +144,9 @@ TEST_F(ExperimentsTest, dump) {
        mExperiments.update();
        mExperiments.update();
        expectDumpOutput();
        expectDumpOutput();
    }
    }
    sFakeFlagsMapInt.clear();
    mExperiments.update();
    expectDumpOutput();
}
}


}  // namespace android::net
}  // namespace android::net