aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/cython/Cython/Build/Tests/TestCyCache.py
blob: a0ed3f389a1a6d64fe8bb3d74cfe04d16b18944a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import difflib 
import glob 
import gzip 
import os 
import tempfile 
 
import Cython.Build.Dependencies 
import Cython.Utils 
from Cython.TestUtils import CythonTest 
 
 
class TestCyCache(CythonTest): 
 
    def setUp(self): 
        CythonTest.setUp(self) 
        self.temp_dir = tempfile.mkdtemp( 
            prefix='cycache-test', 
            dir='TEST_TMP' if os.path.isdir('TEST_TMP') else None) 
        self.src_dir = tempfile.mkdtemp(prefix='src', dir=self.temp_dir) 
        self.cache_dir = tempfile.mkdtemp(prefix='cache', dir=self.temp_dir) 
 
    def cache_files(self, file_glob): 
        return glob.glob(os.path.join(self.cache_dir, file_glob)) 
 
    def fresh_cythonize(self, *args, **kwargs): 
        Cython.Utils.clear_function_caches() 
        Cython.Build.Dependencies._dep_tree = None  # discard method caches 
        Cython.Build.Dependencies.cythonize(*args, **kwargs) 
 
    def test_cycache_switch(self): 
        content1 = 'value = 1\n' 
        content2 = 'value = 2\n' 
        a_pyx = os.path.join(self.src_dir, 'a.pyx') 
        a_c = a_pyx[:-4] + '.c' 
 
        open(a_pyx, 'w').write(content1) 
        self.fresh_cythonize(a_pyx, cache=self.cache_dir) 
        self.fresh_cythonize(a_pyx, cache=self.cache_dir) 
        self.assertEqual(1, len(self.cache_files('a.c*'))) 
        a_contents1 = open(a_c).read() 
        os.unlink(a_c) 
 
        open(a_pyx, 'w').write(content2) 
        self.fresh_cythonize(a_pyx, cache=self.cache_dir) 
        a_contents2 = open(a_c).read() 
        os.unlink(a_c) 
 
        self.assertNotEqual(a_contents1, a_contents2, 'C file not changed!') 
        self.assertEqual(2, len(self.cache_files('a.c*'))) 
 
        open(a_pyx, 'w').write(content1) 
        self.fresh_cythonize(a_pyx, cache=self.cache_dir) 
        self.assertEqual(2, len(self.cache_files('a.c*'))) 
        a_contents = open(a_c).read() 
        self.assertEqual( 
            a_contents, a_contents1, 
            msg='\n'.join(list(difflib.unified_diff( 
                a_contents.split('\n'), a_contents1.split('\n')))[:10])) 
 
    def test_cycache_uses_cache(self): 
        a_pyx = os.path.join(self.src_dir, 'a.pyx') 
        a_c = a_pyx[:-4] + '.c' 
        open(a_pyx, 'w').write('pass') 
        self.fresh_cythonize(a_pyx, cache=self.cache_dir) 
        a_cache = os.path.join(self.cache_dir, os.listdir(self.cache_dir)[0]) 
        gzip.GzipFile(a_cache, 'wb').write('fake stuff'.encode('ascii')) 
        os.unlink(a_c) 
        self.fresh_cythonize(a_pyx, cache=self.cache_dir) 
        a_contents = open(a_c).read() 
        self.assertEqual(a_contents, 'fake stuff', 
                         'Unexpected contents: %s...' % a_contents[:100]) 
 
    def test_multi_file_output(self): 
        a_pyx = os.path.join(self.src_dir, 'a.pyx') 
        a_c = a_pyx[:-4] + '.c' 
        a_h = a_pyx[:-4] + '.h' 
        a_api_h = a_pyx[:-4] + '_api.h' 
        open(a_pyx, 'w').write('cdef public api int foo(int x): return x\n') 
        self.fresh_cythonize(a_pyx, cache=self.cache_dir) 
        expected = [a_c, a_h, a_api_h] 
        for output in expected: 
            self.assertTrue(os.path.exists(output), output) 
            os.unlink(output) 
        self.fresh_cythonize(a_pyx, cache=self.cache_dir) 
        for output in expected: 
            self.assertTrue(os.path.exists(output), output) 
 
    def test_options_invalidation(self): 
        hash_pyx = os.path.join(self.src_dir, 'options.pyx') 
        hash_c = hash_pyx[:-len('.pyx')] + '.c' 
 
        open(hash_pyx, 'w').write('pass') 
        self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=False) 
        self.assertEqual(1, len(self.cache_files('options.c*'))) 
 
        os.unlink(hash_c) 
        self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=True) 
        self.assertEqual(2, len(self.cache_files('options.c*'))) 
 
        os.unlink(hash_c) 
        self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=False, show_version=False) 
        self.assertEqual(2, len(self.cache_files('options.c*'))) 
 
        os.unlink(hash_c) 
        self.fresh_cythonize(hash_pyx, cache=self.cache_dir, cplus=False, show_version=True) 
        self.assertEqual(2, len(self.cache_files('options.c*')))