-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Expand file tree
/
Copy pathExperiment.cpp
More file actions
104 lines (91 loc) · 3.69 KB
/
Experiment.cpp
File metadata and controls
104 lines (91 loc) · 3.69 KB
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
#include "pch.h"
#include "winget/Experiment.h"
#include "winget/UserSettings.h"
#include "Experiment/Experiment.h"
#include "AppInstallerTelemetry.h"
namespace AppInstaller::Settings
{
namespace
{
ExperimentState GetExperimentStateInternal(Experiment::Key key, const UserSettings& userSettings)
{
if (!GroupPolicies().IsEnabled(TogglePolicy::Policy::Experiments))
{
AICLI_LOG(Core, Info, << "Experiment " << Experiment::GetExperiment(key).Name() <<
" is disabled due to group policy: " << TogglePolicy::GetPolicy(TogglePolicy::Policy::Experiments).RegValueName());
return { false, ExperimentToggleSource::Policy };
}
if (key == Experiment::Key::None)
{
return { false, ExperimentToggleSource::Default };
}
auto experiment = Experiment::GetExperiment(key);
auto userSettingsExperiments = userSettings.Get<Setting::Experiments>();
auto jsonName = std::string(experiment.JsonName());
if (userSettingsExperiments.find(jsonName) != userSettingsExperiments.end())
{
auto isEnabled = userSettingsExperiments[jsonName];
AICLI_LOG(Core, Info, << "Experiment " << experiment.Name() << " is set to " << (isEnabled ? "true" : "false") << " in user settings");
return { isEnabled, ExperimentToggleSource::UserSetting };
}
auto isEnabled = AppInstaller::Experiment::IsEnabled(experiment.GetKey());
AICLI_LOG(Core, Info, << "Experiment " << experiment.Name() << " is set to " << (isEnabled ? "true" : "false"));
return { isEnabled, ExperimentToggleSource::Default };
}
std::string ExperimentToggleSourceToString(ExperimentToggleSource source)
{
switch (source)
{
case ExperimentToggleSource::Default:
return "Default";
case ExperimentToggleSource::Policy:
return "Policy";
case ExperimentToggleSource::UserSetting:
return "UserSetting";
default:
return "Unknown";
}
}
}
std::string ExperimentState::ToJson() const
{
Json::Value root;
root["IsEnabled"] = m_isEnabled;
root["ToggleSource"] = ExperimentToggleSourceToString(m_toggleSource);
Json::StreamWriterBuilder builder;
return Json::writeString(builder, root);
}
ExperimentState Experiment::GetStateInternal(Key key)
{
return GetExperimentStateInternal(key, User());
}
ExperimentState Experiment::GetState(Key key)
{
return Logging::Telemetry().GetExperimentState(key);
}
Experiment Experiment::GetExperiment(Key key)
{
switch (key)
{
case Key::CDN:
return Experiment{ "winget source CDN experiment", "CDN", "https://aka.ms/winget-settings", "CDN"};
#ifndef AICLI_DISABLE_TEST_HOOKS
case Key::TestExperiment:
return Experiment{ "Test experiment", "TestExperiment", "https://aka.ms/winget-settings", "TestExperiment" };
#endif
default:
THROW_HR(E_UNEXPECTED);
}
}
std::vector<Experiment> Experiment::GetAllExperiments()
{
std::vector<Experiment> result;
for (Key_t i = 0x1; i < static_cast<Key_t>(Key::Max); ++i)
{
result.emplace_back(GetExperiment(static_cast<Key>(i)));
}
return result;
}
}