Mercurial > hgrepos > Python > apps > py-cutils
annotate tests/test_shasum.py @ 177:089c40240061
Add an alternate implementation for generating directory tree digests:
- Do not use something like os.walk() but use os.scandir() directly.
- Recursively generate the subdirectory digests only when needed and in
the right order.
This fixes that the order of subdirectories in the output did not
match the application order of its directory digests.
The new implementation also should make filtering (that will be
implemented later) easier.
NOTE: The tree digests of the old and the new implementation are identical.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Sat, 11 Jan 2025 17:41:28 +0100 |
| parents | af8318191ed3 |
| children | 7f797d71bd5e |
| rev | line source |
|---|---|
|
101
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1 # -*- coding: utf-8 -*- |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
2 r"""Unit tests |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
3 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
4 """ |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
5 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
6 from __future__ import absolute_import, print_function |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
7 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
8 import io |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
9 import os |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
10 import sys |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
11 import unittest |
|
102
83dd2506f8f8
FIX: Make tests work on Python 2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
101
diff
changeset
|
12 try: |
|
83dd2506f8f8
FIX: Make tests work on Python 2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
101
diff
changeset
|
13 from StringIO import StringIO |
|
83dd2506f8f8
FIX: Make tests work on Python 2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
101
diff
changeset
|
14 except ImportError: |
|
83dd2506f8f8
FIX: Make tests work on Python 2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
101
diff
changeset
|
15 StringIO = None |
|
101
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
16 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
17 from _test_setup import DATADIR |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
18 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
19 from cutils import shasum |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
20 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
21 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
22 PY2 = sys.version_info[0] <= 2 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
23 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
24 |
|
102
83dd2506f8f8
FIX: Make tests work on Python 2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
101
diff
changeset
|
25 def _memfile(): |
|
83dd2506f8f8
FIX: Make tests work on Python 2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
101
diff
changeset
|
26 if StringIO: |
|
83dd2506f8f8
FIX: Make tests work on Python 2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
101
diff
changeset
|
27 return StringIO() |
|
83dd2506f8f8
FIX: Make tests work on Python 2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
101
diff
changeset
|
28 else: |
|
83dd2506f8f8
FIX: Make tests work on Python 2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
101
diff
changeset
|
29 return io.StringIO() |
|
83dd2506f8f8
FIX: Make tests work on Python 2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
101
diff
changeset
|
30 |
|
83dd2506f8f8
FIX: Make tests work on Python 2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
101
diff
changeset
|
31 |
|
101
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
32 class ChangedDir(object): |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
33 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
34 """Context manager to temporarily change the directory""" |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
35 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
36 def __init__(self, path): |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
37 self._new_dir = path |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
38 self._prev_dir = None |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
39 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
40 def __enter__(self): |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
41 self._prev_dir = os.getcwd() |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
42 os.chdir(self._new_dir) |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
43 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
44 def __exit__(self, *args, **kwds): |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
45 if self._prev_dir is not None: |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
46 os.chdir(self._prev_dir) |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
47 self._prev_dir = None |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
48 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
49 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
50 class SignifyTests(unittest.TestCase): |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
51 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
52 def test_empty(self): |
|
102
83dd2506f8f8
FIX: Make tests work on Python 2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
101
diff
changeset
|
53 destfile = _memfile() |
|
101
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
54 opts = shasum.gen_opts(algorithm="SHA256", |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
55 dest=destfile, |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
56 files=[os.path.join(DATADIR, "empty")]) |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
57 shasum.shasum(opts) |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
58 self.assertTrue( |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
59 destfile.getvalue().startswith( |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
60 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *")) |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
61 |
| 103 | 62 def test_empty_with_name(self): |
| 63 destfile = _memfile() | |
| 64 with ChangedDir(DATADIR): | |
| 65 opts = shasum.gen_opts(algorithm="SHA256", | |
| 66 dest=destfile, | |
| 67 files=["empty"]) | |
| 68 shasum.shasum(opts) | |
| 69 self.assertEqual( | |
| 70 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *empty\n", | |
| 71 destfile.getvalue()) | |
| 72 | |
| 73 def test_empty_with_name_bsd(self): | |
| 74 destfile = _memfile() | |
| 75 with ChangedDir(DATADIR): | |
| 76 opts = shasum.gen_opts(algorithm="SHA512", | |
| 77 dest=destfile, | |
| 78 files=["empty"], | |
| 79 bsd=True) | |
| 80 shasum.shasum(opts) | |
| 81 self.assertEqual( | |
| 82 "SHA512 (empty) = cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e\n", | |
| 83 destfile.getvalue()) | |
| 84 | |
|
101
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
85 def test_empty_mmap(self): |
|
102
83dd2506f8f8
FIX: Make tests work on Python 2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
101
diff
changeset
|
86 destfile = _memfile() |
|
101
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
87 opts = shasum.gen_opts(algorithm="SHA256", |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
88 dest=destfile, |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
89 files=[os.path.join(DATADIR, "empty")], |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
90 mmap=True) |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
91 shasum.shasum(opts) |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
92 self.assertTrue( |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
93 destfile.getvalue().startswith( |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
94 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *")) |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
95 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
96 def test_empty_no_mmap(self): |
|
102
83dd2506f8f8
FIX: Make tests work on Python 2
Franz Glasner <f.glasner@feldmann-mg.com>
parents:
101
diff
changeset
|
97 destfile = _memfile() |
|
101
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
98 opts = shasum.gen_opts(algorithm="SHA256", |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
99 dest=destfile, |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
100 files=[os.path.join(DATADIR, "empty")], |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
101 mmap=False) |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
102 shasum.shasum(opts) |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
103 self.assertTrue( |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
104 destfile.getvalue().startswith( |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
105 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *")) |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
106 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
107 |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
108 if __name__ == "__main__": |
|
5de499711a92
Begin some unittests for shasum
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
109 sys.exit(unittest.main()) |
