OLD | NEW |
(Empty) | |
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. |
| 4 |
| 5 import hashlib |
| 6 import json |
| 7 import unittest |
| 8 |
| 9 from infra.libs.gitiles import gitiles |
| 10 from infra.tools.cros_pin import pinfile |
| 11 |
| 12 import mock |
| 13 |
| 14 def h(v): |
| 15 return hashlib.sha1(v).hexdigest() |
| 16 |
| 17 |
| 18 class TestPinfile(unittest.TestCase): |
| 19 |
| 20 _CFG = pinfile.Config('TestConfig', |
| 21 ('repository', 'path'), |
| 22 ('path', 'to', 'pins.json'), |
| 23 ('mywaterfall',)) |
| 24 |
| 25 _MOCK_PINFILE = '{"test": "foo", "release": "bar"}' |
| 26 _CHROMITE_REPO = 'https://example.com/fake' |
| 27 |
| 28 def setUp(self): |
| 29 self._patchers = [] |
| 30 self._pinfile = self._MOCK_PINFILE |
| 31 |
| 32 self._open = mock.mock_open(read_data=self._pinfile) |
| 33 |
| 34 self._write_out = '' |
| 35 def fake_write(data): |
| 36 self._write_out = self._write_out + data |
| 37 self._open().write = mock.Mock(side_effect=fake_write) |
| 38 |
| 39 for patchme, m in ( |
| 40 ('__builtin__.open', self._open), |
| 41 ('infra.libs.gitiles.gitiles.Repository', mock.DEFAULT), |
| 42 ): |
| 43 p = mock.patch(patchme, m) |
| 44 self._patchers.append(p) |
| 45 |
| 46 for p in self._patchers: |
| 47 p.start() |
| 48 |
| 49 self._gitiles = gitiles.Repository(self._CHROMITE_REPO) |
| 50 self._editor = pinfile.Editor('checkout_path', self._gitiles) |
| 51 self._f = self._editor.load(self._CFG) |
| 52 |
| 53 def tearDown(self): |
| 54 for p in reversed(self._patchers): |
| 55 p.stop() |
| 56 |
| 57 def _assertWroteJSON(self, **kw): |
| 58 self.assertEqual(json.loads(self._write_out), kw) |
| 59 |
| 60 def testUpdatesPinSuccessfully(self): |
| 61 pu = self._f.update('test', version=h('baz')) |
| 62 self.assertEqual(pu, pinfile.PinUpdate(name='test', fr='foo', to=h('baz'))) |
| 63 self._assertWroteJSON(test=h('baz'), release='bar') |
| 64 |
| 65 def testUpdateIsNoneForSameValue(self): |
| 66 self._editor._validate = False |
| 67 pu = self._f.update('test', version='foo') |
| 68 self.assertIsNone(pu) |
| 69 |
| 70 def testUpdatesPinToToTSuccessfully(self): |
| 71 self._editor._gitiles.ref_info.return_value = { |
| 72 'commit': 'baz', |
| 73 } |
| 74 pu = self._f.update('test') |
| 75 self.assertEqual(pu, pinfile.PinUpdate(name='test', fr='foo', to='baz')) |
| 76 self._assertWroteJSON(test='baz', release='bar') |
| 77 |
| 78 def testUpdateRejectsNewPinWithoutCreate(self): |
| 79 self.assertRaises(pinfile.ReadOnlyError, |
| 80 self._f.update, 'newpin', create=False, version=h('baz')) |
| 81 |
| 82 def testUpdateWithInvalidCommitHash(self): |
| 83 self._editor._gitiles.ref_info.side_effect = gitiles.GitilesError |
| 84 self.assertRaises(pinfile.InvalidPinError, |
| 85 self._f.update, 'test', version='baz') |
| 86 |
| 87 def testUpdateWithInvalidGitilesCommit(self): |
| 88 self._editor._gitiles.ref_info.side_effect = gitiles.GitilesError |
| 89 self.assertRaises(pinfile.InvalidPinError, |
| 90 self._f.update, 'test', version=h('baz')) |
| 91 |
| 92 def testRemoveDeletesPin(self): |
| 93 pu = self._f.remove('test') |
| 94 self.assertEqual(pu, pinfile.PinUpdate(name='test', fr='foo', to=None)) |
| 95 self._assertWroteJSON(release='bar') |
| 96 |
| 97 pu = self._f.remove('asdf') |
| 98 self.assertIsNone(pu) |
| 99 self._assertWroteJSON(release='bar') |
| 100 |
| 101 def testIterPins(self): |
| 102 self.assertEqual(set(self._f.iterpins()), |
| 103 set([('test', 'foo'), ('release', 'bar')])) |
| 104 |
| 105 def testLoad(self): |
| 106 m = mock.mock_open(read_data='{"foo": "bar"}') |
| 107 with mock.patch('__builtin__.open', m): |
| 108 self.assertEqual(set(self._f.iterpins()), |
| 109 set([('foo', 'bar')])) |
| 110 |
OLD | NEW |