Commit Graph

70 Commits

Author SHA1 Message Date
Henry Liu
cfa5a82f82 Fix [kv-4] PerformBackupTask possible NPE/Wrong package report.
mCurrentPackage is null when package doesn't exist, which lead test
failed with NPE
Use request.packageName for case BackupTransport.AGENT_UNKNOWN instead

Bug: 77272500

Test: m -j RunFrameworksServicesRoboTests ROBOTEST_FILTER=PerformBackupTaskTest
Change-Id: I27be85f0c3f95e36edd92d0d552189fbcf6952dd
(cherry picked from commit 87f1209ac6)
2018-04-12 02:44:50 +00:00
Yu-Han Yang
66c7ea91b4 Implements GNSS satellite blacklist
Bug: 38269641

Test: m -j ROBOTEST_FILTER=GnssSatelliteBlacklistHelperTest RunFrameworksServicesRoboTests
Test: atest SettingsBackupTest
Test: Tested with adb on device

Change-Id: Ifaa330bf74353ea5c8826f0000d1935258b8dbf2
2018-04-05 08:57:04 -07:00
Yu-Han Yang
a1862b587f Add NtpTimeHelper
- Refactor GnssLocationProvider around handleInjectNtpTime
- Add robolectric test for NtpTimeHelper

Bug: 73319937
Bug: 38269641
Test: m -j ROBOTEST_FILTER=NtpTimeHelperTest RunFrameworksServicesRoboTests

Change-Id: Ie551a64641b03386c00cb2de5bbaee41150cc40c
2018-04-03 21:20:06 -07:00
Annie Meng
92892163d5 DO NOT MERGE Unrevert update references to backup agent timeouts
Cherry-picked from master (ag/3800434).

Reintroduce change (ag/3742803) that was reverted due to SUW crash
(ag/3780292).

Updates references to backup/restore agent timeouts from hardcoded
constants to the Global setting backup_agent_timeout_parameters.

Bug: 70276070
Test: 1) m -j RunFrameworksServicesRoboTests
2) Manual testing of affected backup/restore paths:
- Wipe device; restore cloud backup via SUW
- adb shell bmgr list sets
- adb shell bmgr restore [package]
- adb shell bmgr restore [token]
- adb backup -all
- adb backup -shared
- adb backup -obb -all
- adb shell bmgr backupnow --all
- adb shell bmgr backupnow [key value package]
- adb shell bmgr backupnow [full data package]
- adb backup -keyvalue [key value package]
- adb restore backup.ab

Change-Id: If9aad572d688451d37178cd7c2d7844be054953c
2018-03-28 18:07:19 +01:00
Artem Iglikov
b873780a3d DO NOT MERGE Revert "DO NOT MERGE Update references to backup/restore agent timeouts"
This reverts commit f77cae6125.

Reason for revert: crashes SUW

Bug: 76128378
Change-Id: Ia77af64892aa5a03109cc4ef4c2c04b256000ba9
2018-03-22 13:07:34 +00:00
Annie Meng
f77cae6125 DO NOT MERGE Update references to backup/restore agent timeouts
With the newly created Global setting for backup/restore agent timeouts
(backup_agent_timeout_parameters introduced in ag/3731401), update
references in backup and restore code to get the timeout values from
the setting instead of referencing constants in BMS.
This makes these timeouts configurable outside of the framework.

The default value of the setting is the same as the constants in BMS so
this should have no change on the timeout values used in the backup and
restore flow.

Bug: 70276070
Test: 1) m -j RunFrameworksServicesRoboTests
Change-Id: I0259bba76d0fed48158b8316f430b315ea98086e
2018-03-20 23:48:27 +00:00
Annie Meng
d069a888cf DO NOT MERGE Create a setting for backup/restore agent timeouts
Part of push to make backup and restore agent timeouts configurable. Creates
a Global setting for the current static BackupManagerService timeouts so
that they can be overriden with P/H. We keep the current default values,
which will be updated once we investigate what more appropriate values are.

Remame the constants to better reflect what they're used
for. Next, we will update the framework to use these constants.

This depends on the refactor of how we observe changes to key value
backup settings (ag/3709997).

Bug: 70276070
Test: m -j RunFrameworksServicesRoboTests ROBOTEST_FILTER=BackupAgentTimeoutParametersTest
Change-Id: Id506314ce0c8bd5e4d1d8b4001b26cbad0056c99
2018-03-15 17:43:56 +00:00
Annie Meng
d3b6e9fe22 Merge "DO NOT MERGE Create a key value settings observer for backup parameters" into pi-dev 2018-03-14 13:40:46 +00:00
Annie Meng
7d3033b11f DO NOT MERGE Create a key value settings observer for backup parameters
Extracts an abstract class to observe changes in backup parameter settings that
are stored as a comma-separated key value list. This class is
responsible for registering and unregistering a content observer on the
setting and updating local references to the parameters.

Refactor BackupManagerConstants and LocalTransportParameters to use this
implementation. This will also be used for the new backup timeout
setting.

Bug: 74346317
Test: 1) m -j RunFrameworksServicesRoboTests ROBOTEST_FILTER=BackupManagerConstantsTest
2) gts-tradefed run commandAndExit gts-dev -m GtsBackupHostTestCases -t com.google.android.gts.backup.TransportFlagsHostSideTest

Change-Id: Id4c50fbcf7479c925515887e3fa70e166dd9955c
2018-03-13 18:47:46 +00:00
Bernardo Rufino
602bf1a8a8 Add tests for TransportStats and some refactor
Added units for http://ag/3709565. Some refactoring.

Test: m -j RunFrameworksServicesRoboTests
Bug: 72485465
Change-Id: Id75a4e0b96936580fd677041e091340b0fff8c1e
(cherry picked from commit cac3a74059)
2018-03-12 15:33:43 +00:00
Bernardo Rufino
60719a4e74 Add measurements for TransportClient connections
Retrievable via 'adb shell dumpsys backup transportstats'.
Sample output:

Average connection time: 36.00 ms
Max connection time: 181 ms
Min connection time: 7 ms
Number of connections: 16
Per transport:
    com.google.android.gms/.backup.BackupTransportService
        Average connection time: 27.71 ms
        Max connection time: 139 ms
        Min connection time: 13 ms
        Number of connections: 14
    com.google.android.gms/.backup.component.D2dTransportService
        Average connection time: 181.00 ms
        Max connection time: 181 ms
        Min connection time: 181 ms
        Number of connections: 1
    android/com.android.internal.backup.LocalTransportService
        Average connection time: 7.00 ms
        Max connection time: 7 ms
        Min connection time: 7 ms
        Number of connections: 1

Bug: 72485465
Test: Will follow in another CL if reviewers OK w/ approach.
Change-Id: I133ed423d0b8471d69e3c3631aadee7d42d0ec0e
(cherry picked from commit e5a976404c)
2018-03-12 12:19:56 +00:00
Anton Hansson
d137c872cd frameworks/base: Set LOCAL_SDK_VERSION where possible.
This change sets LOCAL_SDK_VERSION for all packages where
this is possible without breaking the build, and
LOCAL_PRIVATE_PLATFORM_APIS := true otherwise.

Setting one of these two will be made required soon, and this
is a change in preparation for that. Not setting LOCAL_SDK_VERSION
makes the app implicitly depend on the bootclasspath, which is
often not required. This change effectively makes depending on
private apis opt-in rather than opt-out.

Test: make relevant packages
Bug: 73535841
Exempt-From-Owner-Approval: Global cleanup
Change-Id: I26458e41ecb84de91ac9a356a5d4bafb44f463c1
2018-03-07 11:42:04 +00:00
Bernardo Rufino
c3ec538d4e Add transport tests
Some tests that were lacking.

Test: m -j RunFrameworksServicesRoboTests
Change-Id: Ia6800e950e96d7481d5c74f62147ad3b9b1493ba
2018-03-02 14:17:21 +00:00
Bernardo Rufino
c22741ba32 Merge "More tests for ActiveRestoreSession - 2" 2018-02-28 13:49:26 +00:00
Bernardo Rufino
cea93536bc More tests for ActiveRestoreSession - 2
Around restorePackage().

Test: m - j RunFrameworksServicesRoboTests
Change-Id: I291d899d5bb786a1d394e758698418718d6c4d9b
2018-02-28 11:07:30 +00:00
Annie Meng
0b0ebb616d Merge "Move transport constant to BackupTransport API" 2018-02-27 17:39:58 +00:00
Annie Meng
1b9877ab44 Move transport constant to BackupTransport API
Previously, the transport registration extra was a private
constant. Since GMSCore depends on this value being passed, moving
it to a public API prevents having to define it twice in
framework and GMSCore, and ensures compatibility between the two.

TODO: Update GMSCore with this constant once this drops
into GMSCore.

Bug: 72730566
Test: 1) m -j ROBOTEST_FILTER=TransportManagerTest RunFrameworksServicesRoboTests
2) m -j ROBOTEST_FILTER=TransportClientManagerTest RunFrameworksServicesRoboTests

Change-Id: I8f7a2ca0275047a5d3cc1a530cd86499d0170f2f
2018-02-27 15:17:56 +00:00
Bernardo Rufino
c709366f0b Merge "More tests for ActiveRestoreSession" 2018-02-27 15:05:02 +00:00
Bernardo Rufino
12b6bafcf4 More tests for ActiveRestoreSession
Around restoreAll() and restoreSome(). And some small refactorings in
restore code paths.

Test: m -j RunFrameworksServicesRoboTests
Change-Id: I0ff446ef4dcf15eade189c79e90a22c0f2eda0d6
2018-02-27 12:24:34 +00:00
Andreas Gampe
cea9e6df27 Frameworks: Annotate JUnit4 tests with @Test & @Ignore
Mollify Errorprone.

Bug: 72076216
Bug: 73792882
Test: m javac-check RUN_ERROR_PRONE=true
Test: m RunFrameworksServicesRoboTests
Test: atest AppStateTrackerTest
Test: atest ActivityRecordTests
Change-Id: I8c496067e850a6c1dc17fdadc0a39c621e3a2f68
2018-02-26 08:11:21 -08:00
Bernardo Rufino
ff589c9530 Remove FrameworkShadowPackageManager
Robolectruc upstreamed this and we picked up in 3.6.1 already :)

Test: m - j RunFrameworksServicesRoboTests
Change-Id: I9df1d1dfc56c5aa1d27e36396ddd21c053a3199d
2018-02-26 10:30:58 +00:00
Michal Karpinski
b5e0931dcd Extend XML parser to allow optional requiredFlags attribute
for <include /> rules in <full-backup-content> specification

Give an app developer the option to include files based on the
transport flags exposed by the transport. This allows conditionally
including files as long as the transport identifies itself as
for instance encrypted or device-to-device.

Extend the parsing mechanism to read optional requiredFlags
attributes, and extend existing structures to encompass
that data for BackupAgent to retrieve and act on it
based on FullBackupDataOutput#getTransportFlags().

-- Changes in robotests/

The old version of this CL (that already got reverted) broke our Robolectric
suite because it added an inner class to FullBackup and a dependency on it from
BackupAgent. FullBackup wasn't being built from Android tree (instead it was in
a prebuilt Robolectric snapshot jar of the framework) but BackupAgent was,
which resulted in not finding the inner class.

So, also in this CL. Changing our tests to include everything under
platform/base/core/java/android/app/backup from Android tree.
`m -j RunFrameworksServicesRoboTests` is green now

Bug: 72484288
Test: m -j RunFrameworksServicesRoboTests
Test: runtest frameworks-core -c android.app.backup.FullBackupTest
Test: make cts -j40 && cts-tradefed run cts -m CtsBackupHostTestCases -t android.cts.backup.FullbackupRulesHostSideTest
Change-Id: Ideaed59f8337257aa6a882ff0ce80c170b17d55e
2018-02-22 13:18:02 +00:00
Bernardo Rufino
8553d27745 Add tests for ActiveRestoreSession
Added first set around getAvailableRestoreSets() plus some tidy-up
around setup and unused stubs.

Test: m -j RunFrameworksServicesRoboTests
Change-Id: I9b3bf548251f1262907de96407184bd1822b3429
2018-02-16 14:27:37 +00:00
TreeHugger Robot
0eb747e51e Merge "Update transport connection with registration info" 2018-02-15 13:57:50 +00:00
Annie Meng
36c5613a93 Update transport connection with registration info
When connecting to a transport, let the transport
know if this connection is for registration. This is to
prevent updating transport attributes during registration
in GMSCore.

Bug: 72730566
Test: 1) m -j ROBOTEST_FILTER=TransportManagerTest RunFrameworksServicesRoboTests
2) m -j ROBOTEST_FILTER=TransportClientManagerTest RunFrameworksServicesRoboTests
3) adb reboot; adb logcat | grep BackupTransportManager; check no errors with "...not registered tried to change description"
4) GMSCore Robo tests
Change-Id: I5adf6ea3e668a8e8ed8c568728d109814b6f8975
2018-02-15 10:40:01 +00:00
Bernardo Rufino
228a649635 More unit tests for PerformBackupTask
Around transport and agent failures. Caught a few possible errors, check
TODOs.

Test: m -j RunFrameworksServicesRoboTests
Change-Id: I9d04f4253511032473885ce6c0856c52639f2957
2018-02-12 09:18:12 +00:00
Bernardo Rufino
b97ea7ea23 Add tests for PerformBackupTask
Tests for agent/transport interaction and some more.

Test: m -j RunFrameworksServicesRoboTests
Change-Id: Ie90044bdbdd32e6cfa70d6228841fec2d9fb0188
2018-02-08 15:39:10 +00:00
Bernardo Rufino
03b767733c Annotation for package in FrameworkRobolectricTestRunner
Makes it easier to maintain the tests.

Test: m -j RunFrameworksServicesRoboTests
Change-Id: I798b7c980b4e3426baa6a205d4ca16f82b42109d
2018-01-30 17:52:08 +00:00
Michal Karpinski
fe4ae0c5b1 Rename RefactoredBackupManagerService to BackupManagerService
The interface will be removed in a subsequent CL, it will be
easier to deal with merge conflicts.

Test: 1) m -j RunFrameworksServicesRoboTests
      2) runtest -p com.android.server.backup frameworks-services
Bug: 65823538
Change-Id: I37c4c6758c646e1b18889ed05aa1b1d7c6129cf0
2018-01-26 10:37:32 +00:00
TreeHugger Robot
1e7f8014a8 Merge "Binding on-demand #12: Log and unbind dangling TransportClients" 2018-01-25 16:08:15 +00:00
Bernardo Rufino
3184cc9948 Binding on-demand #12: Log and unbind dangling TransportClients
Extracted connection in TransportClient to static class with weak
reference to TransportClient so that TransportClient is garbage
collected when left undisposed. Created finalize method that logs,
unbinds TransportClient and warns using CloseGuard.
Also adjusted some logging.

Bug: 17140907
Test: m -j RunFrameworksServicesRoboTests
Test: Manually left a dangling TransportClient and observed logs and
connections

Change-Id: I30f89e7c27579089ba29936483abd1b60c9e8e37
2018-01-25 12:38:04 +00:00
Robert Berry
39194c0582 Add #getTransportFlags to BackupDataOutput
This allows a BackupAgent to check whether the transport has client-side
encryption enabled. It can then use this information to decide whether
to back up more sensitive data.

Bug: 72299360
Test: Manually verified full & kv backup agents receive transport flags
Test: m -j RunFrameworksServicesRoboTests
Change-Id: Ibd9b5f9479815e1721e9d6b7663d892b9ab3fcae
2018-01-25 09:28:55 +00:00
Bernardo Rufino
a4517cdb7d Remove use of streams in TransportManager
Test: m -j RunFrameworksServicesRoboTests
Change-Id: Ie5d81ca9e8c8fcda482fa520aa46841800b88210
2018-01-19 12:09:15 +00:00
Bernardo Rufino
070081bc4f Don't use transport binder with the lock held
There was a deadlock around the transport lock. We registered transports
with the transport lock held, this kicked-off transport onCreate()
synchronously, which called TransportManager
updateTransportAttributes(), which tried to acquire mentioned lock but
couldn't. This CL removes the lock for any call to the transport or
operation that triggers a call to the transport (it was
TransportClient.connect() or its variants).

Test: Load GMSCore before fix, boot, register transports, check no ANR
Test: m -j RunFrameworksServicesRoboTests
Test: adb shell bmgr transport -c <transport>, being registered & not
Bug: 72147303
Change-Id: I72ca145d7fb73c0ef29c4aa1b620fea4969481db
2018-01-18 19:20:49 +00:00
Annie Meng
2ab9c4c953 Rename Robo tests to BackupManagerServiceTest
Bug: 71988336
Test: m -j RunFrameworksServicesRoboTests
Change-Id: I79acd816e2e1fc320fd2bea39692ed52cf56a67e
2018-01-17 16:52:46 +00:00
Annie Meng
9ec0407715 Move BackupManagerServiceTest to Robolectric framework
Bug: 71988336
Test: m -j ROBOTEST_FILTER=BackupManagerServiceRoboTest RunFrameworksServicesRoboTests
Change-Id: I81c45267ef98b66c05383bfdca9a1b5ab4ccbfbd
2018-01-17 16:50:45 +00:00
Bernardo Rufino
4e588baaa4 Merge "Move event logging to TransportClient and add connection event" 2018-01-17 15:39:45 +00:00
Bernardo Rufino
ec2965de46 Dispose of TransportClient in updateStateForTransport()
Forgot this one :)

Change-Id: I13126b94ad0272c912a3e1c3d2e8ee06692a1897
Ref: http://go/br-binding-on-demand
Bug: 17140907
Test: m -j RunFrameworksServicesRoboTests
Test: adb shell bmgr transport [-c] <transport>, check connections
2018-01-17 13:45:08 +00:00
Lenka Trochtova
c141d08b70 New management API for making backups mandatory.
Let the device owner make backups with a chosen backup
transport mandatory.

BUG: 64012357
Test: make RunFrameworksServicesRoboTests
Test: manually together with the corresponding GmsCore change.
Test: cts-tradefed run cts -m CtsDevicePolicyManagerTestCases --test
com.android.cts.devicepolicy.DeviceOwnerTest#testGetAndSetMandatoryBackupTransport
Test: cts-tradefed run cts -m CtsBackupHostTestCase --test
android.cts.backup.BackupDeviceOwnerHostSideTest#testMandatoryBackupTransport

Change-Id: I9bfae5799beae3459659e697813b75a9b508ae55
2018-01-16 22:24:11 +01:00
Bernardo Rufino
aa56a6cde3 Move event logging to TransportClient and add connection event
Move event logging from registration to TransportClient and add new
event for connection.

Change-Id: I32022590a36b6f28f960e91f8880a0430e862852
Ref: http://go/br-binding-on-demand
Bug: 17140907
Test: m -j RunFrameworksServicesRoboTest
Test: adb logcat -b events, check relevant events
2018-01-16 15:56:53 +00:00
Bernardo Rufino
41349c02a8 Binding on-demand #10: Remove permanent binding and add registration
This CL is the last of the P1 CLs for binding on-demand. During
transport-usage migration to binding on-demand the permanent-bound
code was still there and we piggybacked on it to register the
transports. Now that everything is migrated we removed the permanent
binding and used the registration code created in the CL #9
(selectTransport) for registering all the transports.

I put a 3s delay on registration after bring-up. Any operation that uses
the transport before that will gracefully fail.

The TransportBoundListener does not return a boolean anymore because it
can't fail anymore (we pass it the data it needs so that it doesn't need
to be exposed to TransportNotRegistered exceptions). It's now called
OnTransportRegisteredListener.

Eligible transports were a similar thing to valid transports from the
permanent binding code, whose only need came from rebinding from what I
could tell. I saw no need for it anymore and removed it. If I missed
something please shout :)

I shuffled methods a bit in TransportManager.

There were a lot of changes to robo test infra to bring together
TransportManager tests and the rest and re-use mocking infra.

Change-Id: If61268228dd0bb724b718abd3dcafdad50e8b3dc
Ref: http://go/br-binding-on-demand
Bug: 17140907
Test: m -j RunFrameworksServicesRoboTest
Test: runtest -p com.android.server.backup frameworks-services
Test: gts-tradefed run commandAndExit gts-dev -m GtsBackupTestCases
Test: gts-tradefed run commandAndExit gts-dev -m GtsBackupHostTestCases
Test: cts-tradefed run commandAndExit cts-dev -m CtsBackupTestCases
Test: adb shell bmgr enable true/false
Test: adb shell bmgr list transports [-c]
Test: adb shell bmgr transport <transport_name>/-c <transport_component>
Test: adb shell bmgr restore <token>/<token> <package>/<package>
Test: adb shell bmgr backup <pacakge>
Test: adb shell bmgr run
Test: adb shell bmgr wipe <transport> <package>
Test: adb shell bmgr fullbackup <package>
Test: adb shell bmgr backupnow --all/<packages>
Test: adb shell cmd jobscheduler run -f android <job_id>
Test: adb shell dumpsys backup
Test: D2D scenario
2018-01-16 14:22:23 +00:00
Annie Meng
789bf28126 Update transport tests for binding on-demand to support SDK 26 API
After Robo 3.5.1 upgrade, these tests should support the new SDK.

Bug: 69153972
Test: m -j RunFrameworkServicesRoboTests
Change-Id: I12be8668b0c8bb7933cc1a30717356d86f1f3737
2018-01-15 12:31:58 +00:00
TreeHugger Robot
0c154bf670 Merge "Adopt robolectric 3.6.1" 2018-01-10 21:28:41 +00:00
Bernardo Rufino
5a484dc45b Binding on-demand #9: selectBackupTransport[Async]
Migrate selectBackupTransport()/selectBackupTransportAsync() to binding
on-demand. To mimic the bind-if-needed behavior that existed before for
selectBackupTransportAsync we now register-if-needed in the selection.
This means a new registerTransport() method was created in the
TransportManager. I intend to use this method with only few
modifications for the first-binding code.

Change-Id: I39661cff0f7b2f8a27da37905dcd93e0aa9b1178
Ref: http://go/br-binding-on-demand
Bug: 17140907
Test: m -j RunFrameworksServicesRoboTest
Test: adb shell bmgr transport <transport>, observe logs
Test: Robolectric tests for TransportManager will go in registration CL
2018-01-09 12:37:06 +00:00
Bartosz Fabianowski
d8a0cb7556 Start BackupManagerConstants content observer
BackupManagerConstants has a content observer that is meant to be
notified whenever backup settings change. However, that observer is
never registered.

Bug: 71622864
Test: cts-tradefed run cts-dev --module CtsBackupHostTestCase
Change-Id: Icbd90ef3af83dd2f29e26a5d787505bcf5681154
2018-01-08 10:55:32 +01:00
James Lemieux
0f5bba003b Adopt robolectric 3.6.1
Bug: 71596155
Test: make RunSettingsLibRoboTests
Change-Id: I0f8e538238c42fed89bc4778a6a717f2eddac9b7
2018-01-06 00:28:25 -08:00
TreeHugger Robot
172bb61656 Merge "Remove transport dir name from TransportClient" 2018-01-05 18:35:55 +00:00
TreeHugger Robot
a068cd68c0 Merge "Binding on-demand #8: Miscellaneous usages" 2018-01-05 18:21:53 +00:00
Bernardo Rufino
516ac95746 Remove transport dir name from TransportClient
To be able to re-use the TransportClient infra for transport
registration, I need to remove transport dir name property from
TransportClient because it's not available before registration
itself. As a result callsites that used getTransportDirName()
from TransportClient will have to go through the
TransportManager for that. Bryan suggested that the
TransportClient wasn't the best place for the property before.

Ref: http://go/br-binding-on-demand
Bug: 17140907
Test: m -j RunFrameworksServicesTests
Change-Id: I3fa335faf97d63adfad1a929336073a70fc8bc02
2018-01-05 16:57:51 +00:00
Bernardo Rufino
fa51853ae5 Binding on-demand #8: Miscellaneous usages
Migrate usages of the transport binder to binding on-demand:
* getDestinationString()
* isAppEligibleForBackup()
* dump()

For getDestinationString() we'll be introducing an invisible bug for
people that haven't updated GMSCore to include the usage of
updateTransportAttributes() API introduced in earlier CL. The bug is
that that text won't change, it'll remain constant. It's invisible
because currently only place that uses that method is Settings in some
circumstances that depend on the transport, and those circunstances
don't happen with our transports. Check http://ag/1831025.

For isAppEligibleForBackup(), a new filterAppsEligibleForBackup() is
created and there we bind on-demand.

Change-Id: Idc9e31f0e8eda8531e204c05a84fafdaf0247d08
Ref: http://go/br-binding-on-demand
Bug: 17140907
Test: adb shell dumpsys backup, observe destination of transports
Test: adb shell bmgr backupnow --all, observe only eligible apps got backed-up
Test: Force-loaded settings screen and observed destination string
Test: m -j RunFrameworksServicesRoboTests
2018-01-05 16:33:33 +00:00