File: time_limit_test_utils.cc

package info (click to toggle)
chromium 138.0.7204.183-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 6,080,960 kB
  • sloc: cpp: 34,937,079; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,954; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,811; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (168 lines) | stat: -rw-r--r-- 6,180 bytes parent folder | download | duplicates (6)
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ash/child_accounts/time_limit_test_utils.h"

#include <algorithm>
#include <optional>
#include <utility>

#include "base/json/json_writer.h"
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"

namespace ash {
namespace time_limit_test_utils {
namespace {

// Definition of private constants.
constexpr char kTimeLimitLastUpdatedAt[] = "last_updated_millis";
constexpr char kTimeWindowLimit[] = "time_window_limit";
constexpr char kTimeUsageLimit[] = "time_usage_limit";
constexpr char kUsageLimitResetAt[] = "reset_at";
constexpr char kUsageLimitUsageQuota[] = "usage_quota_mins";
constexpr char kWindowLimitEntries[] = "entries";
constexpr char kWindowLimitEntryEffectiveDay[] = "effective_day";
constexpr char kWindowLimitEntryEndsAt[] = "ends_at";
constexpr char kWindowLimitEntryStartsAt[] = "starts_at";
constexpr char kWindowLimitEntryTimeHour[] = "hour";
constexpr char kWindowLimitEntryTimeMinute[] = "minute";

}  // namespace

// Definition of public constants.
const char kMonday[] = "MONDAY";
const char kTuesday[] = "TUESDAY";
const char kWednesday[] = "WEDNESDAY";
const char kThursday[] = "THURSDAY";
const char kFriday[] = "FRIDAY";
const char kSaturday[] = "SATURDAY";
const char kSunday[] = "SUNDAY";

base::Time TimeFromString(const char* time_string) {
  base::Time time;
  if (!base::Time::FromUTCString(time_string, &time))
    LOG(ERROR) << "Wrong time string format.";

  return time;
}

std::string CreatePolicyTimestamp(const char* time_string) {
  base::Time time = TimeFromString(time_string);
  return CreatePolicyTimestamp(time);
}

std::string CreatePolicyTimestamp(base::Time time) {
  return base::NumberToString(
      (time - base::Time::UnixEpoch()).InMilliseconds());
}

base::TimeDelta CreateTime(int hour, int minute) {
  DCHECK_LT(hour, 24);
  DCHECK_GE(hour, 0);
  DCHECK_LT(minute, 60);
  DCHECK_GE(minute, 0);
  return base::Minutes(hour * 60 + minute);
}

base::Value::Dict CreatePolicyTime(base::TimeDelta time) {
  DCHECK_EQ(time.InNanoseconds() % base::Minutes(1).InNanoseconds(), 0);
  DCHECK_LT(time, base::Hours(24));

  int hour = time.InHours();
  int minute = time.InMinutes() - time.InHours() * base::Hours(1).InMinutes();
  base::Value::Dict policyTime;
  policyTime.Set(kWindowLimitEntryTimeHour, base::Value(hour));
  policyTime.Set(kWindowLimitEntryTimeMinute, base::Value(minute));
  return policyTime;
}

base::Value::Dict CreateTimeWindow(const std::string& day,
                                   base::TimeDelta start_time,
                                   base::TimeDelta end_time,
                                   base::Time last_updated) {
  base::Value::Dict time_window;
  time_window.Set(kWindowLimitEntryEffectiveDay, base::Value(day));
  time_window.Set(kWindowLimitEntryStartsAt, CreatePolicyTime(start_time));
  time_window.Set(kWindowLimitEntryEndsAt, CreatePolicyTime(end_time));
  time_window.Set(kTimeLimitLastUpdatedAt,
                  base::Value(CreatePolicyTimestamp(last_updated)));
  return time_window;
}

base::Value::Dict CreateTimeUsage(base::TimeDelta usage_quota,
                                  base::Time last_updated) {
  base::Value::Dict time_usage;
  time_usage.Set(kUsageLimitUsageQuota, base::Value(usage_quota.InMinutes()));
  time_usage.Set(kTimeLimitLastUpdatedAt,
                 base::Value(CreatePolicyTimestamp(last_updated)));
  return time_usage;
}

base::Value::Dict CreateTimeLimitPolicy(base::TimeDelta reset_time) {
  base::Value::Dict time_usage_limit;
  time_usage_limit.Set(kUsageLimitResetAt, CreatePolicyTime(reset_time));

  base::Value::Dict time_limit;
  time_limit.Set(kTimeUsageLimit, std::move(time_usage_limit));

  return time_limit;
}

void AddTimeUsageLimit(base::Value::Dict* policy,
                       std::string day,
                       base::TimeDelta quota,
                       base::Time last_updated) {
  // Asserts that the usage limit quota in minutes corresponds to an integer
  // number.
  DCHECK_EQ(quota.InNanoseconds() % base::Minutes(1).InNanoseconds(), 0);
  DCHECK_LT(quota, base::Hours(24));

  std::ranges::transform(day, day.begin(), ::tolower);
  policy->Find(kTimeUsageLimit)
      ->GetDict()
      .Set(day, CreateTimeUsage(quota, last_updated));
}

void AddTimeWindowLimit(base::Value::Dict* policy,
                        const std::string& day,
                        base::TimeDelta start_time,
                        base::TimeDelta end_time,
                        base::Time last_updated) {
  base::Value::Dict* time_window_limit = policy->EnsureDict(kTimeWindowLimit);
  base::Value::List* window_limit_entries =
      time_window_limit->EnsureList(kWindowLimitEntries);
  window_limit_entries->Append(
      CreateTimeWindow(day, start_time, end_time, last_updated));
}

void AddOverride(base::Value::Dict* policy,
                 usage_time_limit::TimeLimitOverride::Action action,
                 base::Time created_at) {
  base::Value::List* overrides = policy->EnsureList(
      usage_time_limit::TimeLimitOverride::kOverridesDictKey);
  usage_time_limit::TimeLimitOverride new_override(action, created_at,
                                                   std::nullopt);
  overrides->Append(new_override.ToDictionary());
}

void AddOverrideWithDuration(base::Value::Dict* policy,
                             usage_time_limit::TimeLimitOverride::Action action,
                             base::Time created_at,
                             base::TimeDelta duration) {
  base::Value::List* overrides = policy->EnsureList(
      usage_time_limit::TimeLimitOverride::kOverridesDictKey);
  usage_time_limit::TimeLimitOverride new_override(action, created_at,
                                                   duration);
  overrides->Append(new_override.ToDictionary());
}

std::string PolicyToString(const base::Value::Dict& policy) {
  std::string json_string;
  base::JSONWriter::Write(policy, &json_string);
  return json_string;
}

}  // namespace time_limit_test_utils
}  // namespace ash