xref: /aosp_15_r20/external/pdfium/testing/scoped_set_tz.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2021 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker #include "testing/scoped_set_tz.h"
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #include <stdlib.h>
8*3ac0a46fSAndroid Build Coastguard Worker #include <time.h>
9*3ac0a46fSAndroid Build Coastguard Worker 
10*3ac0a46fSAndroid Build Coastguard Worker #include "build/build_config.h"
11*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check_op.h"
12*3ac0a46fSAndroid Build Coastguard Worker 
13*3ac0a46fSAndroid Build Coastguard Worker namespace {
14*3ac0a46fSAndroid Build Coastguard Worker 
15*3ac0a46fSAndroid Build Coastguard Worker constexpr char kTZ[] = "TZ";
16*3ac0a46fSAndroid Build Coastguard Worker 
17*3ac0a46fSAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
18*3ac0a46fSAndroid Build Coastguard Worker #define SETENV(name, value) _putenv_s(name, value)
19*3ac0a46fSAndroid Build Coastguard Worker #define TZSET _tzset
20*3ac0a46fSAndroid Build Coastguard Worker #define UNSETENV(name) _putenv_s(name, "")
21*3ac0a46fSAndroid Build Coastguard Worker #else
22*3ac0a46fSAndroid Build Coastguard Worker #define SETENV(name, value) setenv(name, value, 1)
23*3ac0a46fSAndroid Build Coastguard Worker #define TZSET tzset
24*3ac0a46fSAndroid Build Coastguard Worker #define UNSETENV(name) unsetenv(name)
25*3ac0a46fSAndroid Build Coastguard Worker #endif
26*3ac0a46fSAndroid Build Coastguard Worker 
27*3ac0a46fSAndroid Build Coastguard Worker }  // namespace
28*3ac0a46fSAndroid Build Coastguard Worker 
ScopedSetTZ(const std::string & tz)29*3ac0a46fSAndroid Build Coastguard Worker ScopedSetTZ::ScopedSetTZ(const std::string& tz) {
30*3ac0a46fSAndroid Build Coastguard Worker   const char* old_tz = getenv(kTZ);
31*3ac0a46fSAndroid Build Coastguard Worker   if (old_tz)
32*3ac0a46fSAndroid Build Coastguard Worker     old_tz_ = old_tz;
33*3ac0a46fSAndroid Build Coastguard Worker 
34*3ac0a46fSAndroid Build Coastguard Worker   CHECK_EQ(0, SETENV(kTZ, tz.c_str()));
35*3ac0a46fSAndroid Build Coastguard Worker   TZSET();
36*3ac0a46fSAndroid Build Coastguard Worker }
37*3ac0a46fSAndroid Build Coastguard Worker 
~ScopedSetTZ()38*3ac0a46fSAndroid Build Coastguard Worker ScopedSetTZ::~ScopedSetTZ() {
39*3ac0a46fSAndroid Build Coastguard Worker   if (old_tz_.has_value())
40*3ac0a46fSAndroid Build Coastguard Worker     CHECK_EQ(0, SETENV(kTZ, old_tz_.value().c_str()));
41*3ac0a46fSAndroid Build Coastguard Worker   else
42*3ac0a46fSAndroid Build Coastguard Worker     CHECK_EQ(0, UNSETENV(kTZ));
43*3ac0a46fSAndroid Build Coastguard Worker   TZSET();
44*3ac0a46fSAndroid Build Coastguard Worker }
45