2016-11-04 17:34:42 +01:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
from Crypto.Cipher import AES
|
|
|
|
import mock
|
|
|
|
from twisted.trial import unittest
|
2018-03-27 23:35:31 +02:00
|
|
|
from twisted.internet import defer
|
2016-11-04 17:34:42 +01:00
|
|
|
|
2018-02-12 20:19:15 +01:00
|
|
|
from lbrynet.database.storage import SQLiteStorage
|
2018-02-21 22:41:15 +01:00
|
|
|
from lbrynet.core.StreamDescriptor import get_sd_info, BlobStreamDescriptorReader
|
2016-11-04 17:34:42 +01:00
|
|
|
from lbrynet.core import BlobManager
|
|
|
|
from lbrynet.core import Session
|
2017-06-26 03:04:04 +02:00
|
|
|
from lbrynet.file_manager import EncryptedFileCreator
|
|
|
|
from lbrynet.file_manager import EncryptedFileManager
|
2017-09-28 19:21:26 +02:00
|
|
|
from lbrynet.tests import mocks
|
|
|
|
from lbrynet.tests.util import mk_db_and_blob_dir, rm_db_and_blob_dir
|
2016-11-04 17:34:42 +01:00
|
|
|
|
|
|
|
MB = 2**20
|
|
|
|
|
2018-02-21 22:41:15 +01:00
|
|
|
|
2016-11-04 17:34:42 +01:00
|
|
|
def iv_generator():
|
|
|
|
while True:
|
|
|
|
yield '3' * AES.block_size
|
|
|
|
|
|
|
|
|
|
|
|
class CreateEncryptedFileTest(unittest.TestCase):
|
|
|
|
timeout = 5
|
2018-02-21 22:41:15 +01:00
|
|
|
|
2018-02-12 20:19:15 +01:00
|
|
|
@defer.inlineCallbacks
|
2016-11-04 17:34:42 +01:00
|
|
|
def setUp(self):
|
2017-01-17 04:23:20 +01:00
|
|
|
mocks.mock_conf_settings(self)
|
2017-07-27 06:11:12 +02:00
|
|
|
self.tmp_db_dir, self.tmp_blob_dir = mk_db_and_blob_dir()
|
2016-11-04 17:34:42 +01:00
|
|
|
|
2018-02-12 20:19:15 +01:00
|
|
|
self.session = mock.Mock(spec=Session.Session)(None, None)
|
|
|
|
self.session.payment_rate_manager.min_blob_data_payment_rate = 0
|
2018-03-27 23:35:31 +02:00
|
|
|
self.blob_manager = BlobManager.DiskBlobManager(self.tmp_blob_dir, SQLiteStorage(self.tmp_db_dir))
|
2018-02-12 20:19:15 +01:00
|
|
|
self.session.blob_manager = self.blob_manager
|
|
|
|
self.session.storage = self.session.blob_manager.storage
|
|
|
|
self.file_manager = EncryptedFileManager.EncryptedFileManager(self.session, object())
|
|
|
|
yield self.session.blob_manager.storage.setup()
|
|
|
|
yield self.session.blob_manager.setup()
|
|
|
|
|
2017-07-27 06:11:12 +02:00
|
|
|
@defer.inlineCallbacks
|
2016-11-04 17:34:42 +01:00
|
|
|
def tearDown(self):
|
2017-07-27 06:11:12 +02:00
|
|
|
yield self.blob_manager.stop()
|
2018-02-12 20:19:15 +01:00
|
|
|
yield self.session.storage.stop()
|
2017-07-27 06:11:12 +02:00
|
|
|
rm_db_and_blob_dir(self.tmp_db_dir, self.tmp_blob_dir)
|
2016-11-04 17:34:42 +01:00
|
|
|
|
2017-09-13 06:15:57 +02:00
|
|
|
@defer.inlineCallbacks
|
2016-11-04 17:34:42 +01:00
|
|
|
def create_file(self, filename):
|
|
|
|
handle = mocks.GenFile(3*MB, '1')
|
|
|
|
key = '2'*AES.block_size
|
2018-02-12 20:19:15 +01:00
|
|
|
out = yield EncryptedFileCreator.create_lbry_file(self.session, self.file_manager, filename, handle,
|
|
|
|
key, iv_generator())
|
2017-09-13 06:15:57 +02:00
|
|
|
defer.returnValue(out)
|
2016-11-04 17:34:42 +01:00
|
|
|
|
2017-10-12 17:14:03 +02:00
|
|
|
@defer.inlineCallbacks
|
2016-11-04 17:34:42 +01:00
|
|
|
def test_can_create_file(self):
|
2018-02-12 20:19:15 +01:00
|
|
|
expected_stream_hash = "41e6b247d923d191b154fb6f1b8529d6ddd6a73d65c35" \
|
|
|
|
"7b1acb742dd83151fb66393a7709e9f346260a4f4db6de10c25"
|
2018-02-21 22:41:15 +01:00
|
|
|
expected_sd_hash = "db043b44384c149126685990f6bb6563aa565ae331303d522" \
|
|
|
|
"c8728fe0534dd06fbcacae92b0891787ad9b68ffc8d20c1"
|
2016-11-04 17:34:42 +01:00
|
|
|
filename = 'test.file'
|
2018-02-12 20:19:15 +01:00
|
|
|
lbry_file = yield self.create_file(filename)
|
|
|
|
sd_hash = yield self.session.storage.get_sd_blob_hash_for_stream(lbry_file.stream_hash)
|
|
|
|
|
2018-02-21 22:41:15 +01:00
|
|
|
# read the sd blob file
|
|
|
|
sd_blob = self.blob_manager.blobs[sd_hash]
|
|
|
|
sd_reader = BlobStreamDescriptorReader(sd_blob)
|
|
|
|
sd_file_info = yield sd_reader.get_info()
|
|
|
|
|
|
|
|
# this comes from the database, the blobs returned are sorted
|
|
|
|
sd_info = yield get_sd_info(self.session.storage, lbry_file.stream_hash, include_blobs=True)
|
|
|
|
self.assertDictEqual(sd_info, sd_file_info)
|
2018-02-22 17:29:41 +01:00
|
|
|
self.assertListEqual(sd_info['blobs'], sd_file_info['blobs'])
|
2018-02-21 22:41:15 +01:00
|
|
|
self.assertEqual(sd_info['stream_hash'], expected_stream_hash)
|
|
|
|
self.assertEqual(len(sd_info['blobs']), 3)
|
|
|
|
self.assertNotEqual(sd_info['blobs'][0]['length'], 0)
|
|
|
|
self.assertNotEqual(sd_info['blobs'][1]['length'], 0)
|
|
|
|
self.assertEqual(sd_info['blobs'][2]['length'], 0)
|
2018-02-12 20:19:15 +01:00
|
|
|
self.assertEqual(expected_stream_hash, lbry_file.stream_hash)
|
|
|
|
self.assertEqual(sd_hash, lbry_file.sd_hash)
|
|
|
|
self.assertEqual(sd_hash, expected_sd_hash)
|
2017-10-12 17:14:03 +02:00
|
|
|
blobs = yield self.blob_manager.get_all_verified_blobs()
|
2018-02-12 20:19:15 +01:00
|
|
|
self.assertEqual(3, len(blobs))
|
2017-10-12 17:14:03 +02:00
|
|
|
num_should_announce_blobs = yield self.blob_manager.count_should_announce_blobs()
|
2018-02-12 20:19:15 +01:00
|
|
|
self.assertEqual(2, num_should_announce_blobs)
|
2016-11-04 17:34:42 +01:00
|
|
|
|
2017-10-12 17:14:03 +02:00
|
|
|
@defer.inlineCallbacks
|
2016-11-04 17:34:42 +01:00
|
|
|
def test_can_create_file_with_unicode_filename(self):
|
|
|
|
expected_stream_hash = ('d1da4258f3ce12edb91d7e8e160d091d3ab1432c2e55a6352dce0'
|
|
|
|
'2fd5adb86fe144e93e110075b5865fff8617776c6c0')
|
|
|
|
filename = u'☃.file'
|
2018-02-12 20:19:15 +01:00
|
|
|
lbry_file = yield self.create_file(filename)
|
|
|
|
self.assertEqual(expected_stream_hash, lbry_file.stream_hash)
|