103 lines
4.0 KiB
Python
103 lines
4.0 KiB
Python
# ***** BEGIN GPL LICENSE BLOCK *****
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
#
|
|
# ***** END GPL LICENCE BLOCK *****
|
|
#
|
|
# (c) 2019, Blender Foundation - Sybren A. Stüvel
|
|
import pathlib
|
|
import platform
|
|
|
|
import responses
|
|
|
|
from tests.abstract_test import AbstractBlendFileTest
|
|
from blender_asset_tracer.pack.shaman import transfer
|
|
|
|
httpmock = responses.RequestsMock()
|
|
|
|
|
|
class ShamanTransferTest(AbstractBlendFileTest):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
cls.test_file1 = cls.blendfiles / "linked_cube_compressed.blend"
|
|
cls.test_file2 = cls.blendfiles / "basic_file.blend"
|
|
cls.expected_checksums = {
|
|
cls.test_file1: "3c525e3a01ece11f26ded1e05e43284c4cce575c8074b97c6bdbc414fa2802ab",
|
|
cls.test_file2: "d5283988d95f259069d4cd3c25a40526090534b8d188577b6c6fb36c3d481454",
|
|
}
|
|
cls.file_sizes = {
|
|
cls.test_file1: cls.test_file1.stat().st_size,
|
|
cls.test_file2: cls.test_file2.stat().st_size,
|
|
}
|
|
cls.packed_names = {
|
|
cls.test_file1: pathlib.PurePosixPath("path/in/pack/test1.blend"),
|
|
cls.test_file2: pathlib.PurePosixPath("path/in/pack/test2.blend"),
|
|
}
|
|
|
|
def assertValidCheckoutDef(self, definition_file: bytes):
|
|
# We don't care much about the order, so compare as set.
|
|
expect_lines = set()
|
|
for filepath in [self.test_file1, self.test_file2]:
|
|
checksum = self.expected_checksums[filepath]
|
|
fsize = self.file_sizes[filepath]
|
|
relpath = str(self.packed_names[filepath])
|
|
expect_lines.add(b"%s %d %s" % (checksum.encode(), fsize, relpath.encode()))
|
|
self.assertEqual(expect_lines, set(definition_file.split(b"\n")))
|
|
|
|
@httpmock.activate
|
|
def test_checkout_happy(self):
|
|
checksum1 = self.expected_checksums[self.test_file1]
|
|
fsize1 = self.file_sizes[self.test_file1]
|
|
|
|
def mock_requirements(request):
|
|
self.assertEqual("text/plain", request.headers["Content-Type"])
|
|
self.assertValidCheckoutDef(request.body)
|
|
|
|
body = "file-unknown path/in/pack/test1.blend\n"
|
|
return 200, {"Content-Type": "text/plain"}, body
|
|
|
|
def mock_checkout_create(request):
|
|
self.assertEqual("text/plain", request.headers["Content-Type"])
|
|
self.assertValidCheckoutDef(request.body)
|
|
return 200, {"Content-Type": "text/plain"}, "DA/-JOB-ID"
|
|
|
|
httpmock.add_callback(
|
|
"POST",
|
|
"http://unittest.local:1234/checkout/requirements",
|
|
callback=mock_requirements,
|
|
)
|
|
|
|
httpmock.add(
|
|
"POST", "http://unittest.local:1234/files/%s/%d" % (checksum1, fsize1)
|
|
)
|
|
httpmock.add_callback(
|
|
"POST",
|
|
"http://unittest.local:1234/checkout/create/DA-JOB-ID",
|
|
callback=mock_checkout_create,
|
|
)
|
|
|
|
trans = transfer.ShamanTransferrer(
|
|
"auth-token", self.blendfiles, "http://unittest.local:1234/", "DA-JOB-ID"
|
|
)
|
|
|
|
trans.start()
|
|
trans.queue_copy(self.test_file1, self.packed_names[self.test_file1])
|
|
trans.queue_copy(self.test_file2, self.packed_names[self.test_file2])
|
|
trans.done_and_join()
|
|
|
|
self.assertFalse(trans.has_error, trans.error_message())
|
|
self.assertEqual("DA/-JOB-ID", trans.checkout_location)
|