- added testsuite for new "repairwc" command
[opensuse:osc.git] / tests / test_repairwc.py
1 import osc.core
2 import osc.oscerr
3 import os
4 import sys
5 from common import GET, PUT, POST, DELETE, OscTestCase
6 from xml.etree import cElementTree as ET
7 FIXTURES_DIR = os.path.join(os.getcwd(), 'repairwc_fixtures')
8
9 def suite():
10     import unittest
11     return unittest.makeSuite(TestRepairWC)
12
13 rev_dummy = '<revision rev="repository">\n  <srcmd5>empty</srcmd5>\n</revision>'
14
15 class TestRepairWC(OscTestCase):
16     def _get_fixtures_dir(self):
17         return FIXTURES_DIR
18
19     def __assertNotRaises(self, exception, meth, *args, **kwargs):
20         try:
21             meth(*args, **kwargs)
22         except exception:
23             self.fail('%s raised' % exception.__name__)
24
25     def test_working_empty(self):
26         """consistent, empty working copy"""
27         self._change_to_pkg('working_empty')
28         self.__assertNotRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
29
30     def test_working_nonempty(self):
31         """
32         consistent, non-empty working copy. One file is in conflict,
33         one file is marked for deletion and one file has state 'A'
34         """
35         self._change_to_pkg('working_nonempty')
36         self.__assertNotRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
37
38     def test_buildfiles(self):
39         """
40         wc has a _buildconfig_prj_arch and a _buildinfo_prj_arch.xml in the storedir
41         """
42         self._change_to_pkg('buildfiles')
43         self.__assertNotRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
44
45     @GET('http://localhost/source/osctest/simple1/foo?rev=1', text='This is a simple test.\n')
46     def test_simple1(self):
47         """a file is marked for deletion but storefile doesn't exist"""
48         self._change_to_pkg('simple1')
49         self.assertRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
50         p = osc.core.Package('.', wc_check=False)
51         p.wc_repair()
52         self.assertTrue(os.path.exists(os.path.join('.osc', 'foo')))
53         self._check_deletelist('foo\n')
54         self._check_status(p, 'foo', 'D')
55         self._check_status(p, 'nochange', 'M')
56         self._check_status(p, 'merge', ' ')
57         self._check_status(p, 'toadd1', '?')
58         # additional cleanup check
59         self.__assertNotRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
60
61     def test_simple2(self):
62         """a file "somefile" exists in the storedir which isn't tracked"""
63         self._change_to_pkg('simple2')
64         self.assertRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
65         p = osc.core.Package('.', wc_check=False)
66         p.wc_repair()
67         self.assertFalse(os.path.exists(os.path.join('.osc', 'somefile')))
68         self._check_deletelist('foo\n')
69         self._check_status(p, 'foo', 'D')
70         self._check_status(p, 'nochange', 'M')
71         self._check_status(p, 'merge', ' ')
72         self._check_status(p, 'toadd1', '?')
73         # additional cleanup check
74         self.__assertNotRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
75
76     def test_simple3(self):
77         """toadd1 has state 'A' and a file .osc/toadd1 exists"""
78         self._change_to_pkg('simple3')
79         self.assertRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
80         p = osc.core.Package('.', wc_check=False)
81         p.wc_repair()
82         self.assertFalse(os.path.exists(os.path.join('.osc', 'toadd1')))
83         self._check_deletelist('foo\n')
84         self._check_status(p, 'foo', 'D')
85         self._check_status(p, 'nochange', 'M')
86         self._check_status(p, 'merge', ' ')
87         self._check_addlist('toadd1\n')
88         self._check_status(p, 'toadd1', 'A')
89         # additional cleanup check
90         self.__assertNotRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
91
92     def test_simple4(self):
93         """a file is listed in _to_be_deleted but isn't present in _files"""
94         self._change_to_pkg('simple4')
95         self.assertRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
96         p = osc.core.Package('.', wc_check=False)
97         p.wc_repair()
98         self._check_deletelist('foo\n')
99         self._check_status(p, 'foo', 'D')
100         self._check_status(p, 'nochange', 'M')
101         self._check_status(p, 'merge', ' ')
102         self._check_status(p, 'toadd1', '?')
103         # additional cleanup check
104         self.__assertNotRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
105
106     def test_simple5(self):
107         """a file is listed in _in_conflict but isn't present in _files"""
108         self._change_to_pkg('simple5')
109         self.assertRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
110         p = osc.core.Package('.', wc_check=False)
111         p.wc_repair()
112         self.assertFalse(os.path.exists(os.path.join('.osc', '_in_conflict')))
113         self._check_deletelist('foo\n')
114         self._check_status(p, 'foo', 'D')
115         self._check_status(p, 'nochange', 'M')
116         self._check_status(p, 'merge', ' ')
117         self._check_status(p, 'toadd1', '?')
118         # additional cleanup check
119         self.__assertNotRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
120
121     @GET('http://localhost/source/osctest/simple6/foo?rev=1', text='This is a simple test.\n')
122     def test_simple6(self):
123         """
124         a file is listed in _to_be_deleted and is present
125         in _files but the storefile is missing
126         """
127         self._change_to_pkg('simple6')
128         self.assertRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
129         p = osc.core.Package('.', wc_check=False)
130         p.wc_repair()
131         self.assertTrue(os.path.exists(os.path.join('.osc', 'foo')))
132         self._check_deletelist('foo\n')
133         self._check_status(p, 'foo', 'D')
134         self._check_status(p, 'nochange', 'M')
135         self._check_status(p, 'merge', ' ')
136         self._check_status(p, 'toadd1', '?')
137         # additional cleanup check
138         self.__assertNotRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
139
140     def test_simple7(self):
141         """files marked as skipped don't exist in the storedir"""
142         self._change_to_pkg('simple7')
143         self.__assertNotRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
144
145     def test_simple8(self):
146         """
147         a file is marked as skipped but the skipped file exists in the storedir
148         """
149         self._change_to_pkg('simple8')
150         self.assertRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
151         p = osc.core.Package('.', wc_check=False)
152         p.wc_repair()
153         self.assertFalse(os.path.exists(os.path.join('.osc', 'skipped')))
154         self._check_deletelist('foo\n')
155         self._check_status(p, 'foo', 'D')
156         self._check_status(p, 'nochange', 'M')
157         self._check_status(p, 'merge', ' ')
158         self._check_status(p, 'toadd1', '?')
159         self._check_status(p, 'skipped', 'S')
160         # additional cleanup check
161         self.__assertNotRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
162
163     @GET('http://localhost/source/osctest/multiple/merge?rev=1', text='Is it\npossible to\nmerge this file?I hope so...\n')
164     @GET('http://localhost/source/osctest/multiple/nochange?rev=1', text='This file didn\'t change.\n')
165     def test_multiple(self):
166         """
167         a storefile is missing, a file is listed in _to_be_deleted
168         but is not present in _files, a file is listed in _in_conflict
169         but the storefile is missing and a file exists in the storedir
170         but is not present in _files
171         """
172         self._change_to_pkg('multiple')
173         self.assertRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
174         p = osc.core.Package('.', wc_check=False)
175         p.wc_repair()
176         self.assertTrue(os.path.exists(os.path.join('.osc', 'foo')))
177         self.assertFalse(os.path.exists(os.path.join('.osc', 'unknown_file')))
178         self._check_deletelist('foo\n')
179         self._check_status(p, 'foo', 'D')
180         self._check_status(p, 'nochange', 'C')
181         self._check_status(p, 'merge', ' ')
182         self._check_status(p, 'foobar', 'A')
183         self._check_status(p, 'toadd1', '?')
184         # additional cleanup check
185         self.__assertNotRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Package, '.')
186
187 if __name__ == '__main__':
188     import unittest
189     unittest.main()