1
0
mirror of https://codeberg.org/polarisfm/youtube-dl synced 2024-12-02 05:07:55 +01:00
youtube-dl/test/test_archive.py
Sergio Kef dd065a7305 Add Archive class for efficient archiving
Currently we reread the file for every new link we download.
In cases where user runs youtube_dl to keep their library
up-to-date, this is very inefficient, as most of the links
are already downloaded.
Archive class works half way between a database and an append
log. It's an append log that also keeps a hash set in memory
for fast checking existing links.
A compatibility function was added for reading file's last
modification date
Tests have been added
2020-04-18 00:03:19 +02:00

85 lines
2.8 KiB
Python

#!/usr/bin/env python
from __future__ import unicode_literals
# Allow direct execution
import os
import sys
import unittest
from time import sleep
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from youtube_dl.archive import Archive
class TestArchive(unittest.TestCase):
def setUp(self):
cur_dir = os.path.dirname(os.path.abspath(__file__))
test_archive = os.path.join(cur_dir, "test_archive.txt")
self.archive = Archive(test_archive)
def tearDown(self):
if os.path.exists(self.archive.filepath):
os.remove(self.archive.filepath)
def test_archive_disabled(self):
self.assertTrue(Archive(None)._disabled)
self.assertTrue(Archive("")._disabled)
self.assertFalse(Archive("/anything")._disabled)
def test_archive_read_empty_file(self):
self.archive._read_file()
def test_archive_exists(self):
self.archive.record_download("dl_id")
self.assertTrue("dl_id" in self.archive._data)
self.assertTrue("dl_id" in self.archive)
def test_archive_not_exists(self):
self.assertFalse("dl_id" in self.archive)
def test_archive_last_read_on_write(self):
t1 = self.archive._last_read
self.archive.record_download("dl_id")
t2 = self.archive._last_read
self.assertNotEqual(t1, t2)
def test_archive_last_read_on_read(self):
t1 = self.archive._last_read
self.archive.record_download("dl_id 1")
t2 = self.archive._last_read
self.assertNotEqual(t1, t2)
def test_archive_file_not_changed(self):
self.archive.record_download("dl_id")
self.assertFalse(self.archive._file_changed())
def test_archive_file_changed(self):
self.archive.record_download("dl_id 1")
with open(self.archive.filepath, "a", encoding="utf-8") as f_out:
sleep(0.01)
f_out.write("dl_id 2\n")
self.assertTrue(self.archive._file_changed())
def test_archive_file_changed_exists(self):
self.archive.record_download("dl_id 1")
with open(self.archive.filepath, "a", encoding="utf-8") as f_out:
sleep(0.01)
f_out.write("dl_id 2\n")
self.assertTrue(self.archive._file_changed())
self.assertFalse("dl_id 2" in self.archive._data)
self.assertTrue("dl_id 2" in self.archive)
def test_archive_multiple_writes(self):
self.archive.record_download("dl_id 1")
self.archive.record_download("dl_id 2")
self.archive.record_download("dl_id 3")
expected = "dl_id 1" + "\n" + "dl_id 2" + "\n" + "dl_id 3" + "\n"
with open(self.archive.filepath, "r", encoding="utf-8") as f_in:
self.assertEqual(f_in.read(), expected)
if __name__ == "__main__":
unittest.main()