summaryrefslogtreecommitdiffstats
path: root/yql/essentials/minikql/runtime_settings/ut/runtime_settings_hash_ut.cpp
blob: 64195a283754294ecf28e9510b81d7ae59d29aa1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <yql/essentials/minikql/runtime_settings/runtime_settings_hash.h>
#include <yql/essentials/minikql/runtime_settings/runtime_settings_configuration.h>

#include <library/cpp/testing/unittest/registar.h>

namespace NYql {

namespace {

TString DumpRuntimeSettingsToString(const TRuntimeSettings& settings) {
    TStringStream stream;
    TRuntimeSettingsConfiguration configuration(settings);
    configuration.SerializeStaticSettings([&](const TString&, const TString& value) {
        stream << value;
    });
    for (const auto& [module, settings] : settings.GetUdfSettings()) {
        stream << " " << module;
        for (const auto& [key, value] : settings) {
            stream << " " << key << " " << value;
        }
    }
    return stream.Str();
}

} // namespace

Y_UNIT_TEST_SUITE(TRuntimeSettingsHashTest) {

Y_UNIT_TEST(StableHashIsStable) {
    std::array<TRuntimeSettings::TPtr, 2> configs;
    for (auto& config : configs) {
        config = MakeRuntimeSettingsMutable();
        config->DatumValidation.Set(EDatumValidationMode::Cheap);
        config->SetUdfSetting("ModuleB", "Key2", "Val2");
        config->SetUdfSetting("ModuleA", "Key1", "Val1");
    }

    const auto hash1 = StableHashRuntimeSettings(*configs[0]);
    const auto hash2 = StableHashRuntimeSettings(*configs[1]);
    UNIT_ASSERT_VALUES_EQUAL(hash1, hash2);

    const auto emptyHash = StableHashRuntimeSettings(*MakeIntrusive<TRuntimeSettingsConfiguration>());
    UNIT_ASSERT_VALUES_UNEQUAL(hash1, emptyHash);
}

Y_UNIT_TEST(StableHashDiffersByContent) {
    auto config1 = MakeIntrusive<TRuntimeSettingsConfiguration>();
    config1->DatumValidation.Set(EDatumValidationMode::Cheap);

    auto config2 = MakeIntrusive<TRuntimeSettingsConfiguration>();
    config2->DatumValidation.Set(EDatumValidationMode::Expensive);

    UNIT_ASSERT_VALUES_UNEQUAL(StableHashRuntimeSettings(*config1), StableHashRuntimeSettings(*config2));
}

Y_UNIT_TEST(StableHashUdfSettingOrderIndependent) {
    auto config1 = MakeIntrusive<TRuntimeSettingsConfiguration>();
    config1->SetUdfSetting("ModuleA", "Key1", "Val1");
    config1->SetUdfSetting("ModuleA", "Key2", "Val2");
    config1->SetUdfSetting("ModuleB", "Key3", "Val3");

    auto config2 = MakeIntrusive<TRuntimeSettingsConfiguration>();
    config2->SetUdfSetting("ModuleB", "Key3", "Val3");
    config2->SetUdfSetting("ModuleA", "Key2", "Val2");
    config2->SetUdfSetting("ModuleA", "Key1", "Val1");

    UNIT_ASSERT_VALUES_EQUAL(StableHashRuntimeSettings(*config1), StableHashRuntimeSettings(*config2));
}

Y_UNIT_TEST(StableHashUdfModuleBoundaryIsDistinct) {
    auto config1 = MakeIntrusive<TRuntimeSettingsConfiguration>();
    config1->SetUdfSetting("1", "2", "3");
    config1->SetUdfSetting("1", "4", "5");
    config1->SetUdfSetting("1", "6", "7");
    config1->SetUdfSetting("1", "8", "9");

    auto config2 = MakeIntrusive<TRuntimeSettingsConfiguration>();
    config2->SetUdfSetting("1", "2", "3");
    config2->SetUdfSetting("4", "5", "6");
    config2->SetUdfSetting("7", "8", "9");
    UNIT_ASSERT_VALUES_EQUAL(DumpRuntimeSettingsToString(*config1), DumpRuntimeSettingsToString(*config2));
    UNIT_ASSERT_VALUES_UNEQUAL(StableHashRuntimeSettings(*config1), StableHashRuntimeSettings(*config2));
}

} // Y_UNIT_TEST_SUITE(TRuntimeSettingsHashTest)

} // namespace NYql