blender-asset-tracer/tests/test_shaman_time_tracker.py
Sybren A. Stüvel 9074421ec3 Shaman server support
The Shaman server is a file storage system that identifies files by
SHA256sum and file length. BAT can send packs there by only uploading
changed/new files. The BAT pack is reproduced at the Shaman server's
checkout directory by creating symlinks to the files in its file
storage.

Retrying sending files:

When we can defer uploading a file (that is, when we have other files to
upload as well, and we could send the current file at a later moment) we
send an `X-Shaman-Can-Defer-Upload: true` header in the file upload
request. In that case, when someone else is already uploading that file,
a `208 Already Reported` response is sent and the connection is closed.
Python's Requests library unfortunately won't give us that response if
we're still streaming the request, and raise a ConnectionError exception
instead. This exception can mean two things:

- If the `X-Shaman-Can-Defer-Upload: true` header was sent: someone else
  is currently uploading that file, so defer it.
- If that header was not sent: that file is already completely uploaded
  and does not need to be uploaded again.

Instead of retrying each failed file, after a few failures we now just
resend the definition file to get a new list of files to upload, then
send those. This should considerably reduce the number of HTTP calls
when multiple clients are uploading the same set of files.
2019-03-01 14:07:24 +01:00

30 lines
824 B
Python

import unittest
from unittest import mock
from blender_asset_tracer.pack.shaman import time_tracker
class TimeTrackerTest(unittest.TestCase):
@mock.patch('time.monotonic')
def test_empty_class(self, mock_monotonic):
class TestClass:
pass
mock_monotonic.side_effect = [1.25, 4.75]
with time_tracker.track_time(TestClass, 'some_attr'):
pass
# noinspection PyUnresolvedReferences
self.assertEqual(3.5, TestClass.some_attr)
@mock.patch('time.monotonic')
def test_with_value(self, mock_monotonic):
class TestClass:
some_attr = 4.125
mock_monotonic.side_effect = [1.25, 4.75]
with time_tracker.track_time(TestClass, 'some_attr'):
pass
self.assertEqual(3.5 + 4.125, TestClass.some_attr)