Index: infra/tools/cros_pin/test/pinfile_test.py |
diff --git a/infra/tools/cros_pin/test/pinfile_test.py b/infra/tools/cros_pin/test/pinfile_test.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7740f24db6a91ed5f3db60ceb8631fcbac845e0d |
--- /dev/null |
+++ b/infra/tools/cros_pin/test/pinfile_test.py |
@@ -0,0 +1,110 @@ |
+# Copyright 2015 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import hashlib |
+import json |
+import unittest |
+ |
+from infra.libs.gitiles import gitiles |
+from infra.tools.cros_pin import pinfile |
+ |
+import mock |
+ |
+def h(v): |
+ return hashlib.sha1(v).hexdigest() |
+ |
+ |
+class TestPinfile(unittest.TestCase): |
+ |
+ _CFG = pinfile.Config('TestConfig', |
+ ('repository', 'path'), |
+ ('path', 'to', 'pins.json'), |
+ ('mywaterfall',)) |
+ |
+ _MOCK_PINFILE = '{"test": "foo", "release": "bar"}' |
+ _CHROMITE_REPO = 'https://example.com/fake' |
+ |
+ def setUp(self): |
+ self._patchers = [] |
+ self._pinfile = self._MOCK_PINFILE |
+ |
+ self._open = mock.mock_open(read_data=self._pinfile) |
+ |
+ self._write_out = '' |
+ def fake_write(data): |
+ self._write_out = self._write_out + data |
+ self._open().write = mock.Mock(side_effect=fake_write) |
+ |
+ for patchme, m in ( |
+ ('__builtin__.open', self._open), |
+ ('infra.libs.gitiles.gitiles.Repository', mock.DEFAULT), |
+ ): |
+ p = mock.patch(patchme, m) |
+ self._patchers.append(p) |
+ |
+ for p in self._patchers: |
+ p.start() |
+ |
+ self._gitiles = gitiles.Repository(self._CHROMITE_REPO) |
+ self._editor = pinfile.Editor('checkout_path', self._gitiles) |
+ self._f = self._editor.load(self._CFG) |
+ |
+ def tearDown(self): |
+ for p in reversed(self._patchers): |
+ p.stop() |
+ |
+ def _assertWroteJSON(self, **kw): |
+ self.assertEqual(json.loads(self._write_out), kw) |
+ |
+ def testUpdatesPinSuccessfully(self): |
+ pu = self._f.update('test', version=h('baz')) |
+ self.assertEqual(pu, pinfile.PinUpdate(name='test', fr='foo', to=h('baz'))) |
+ self._assertWroteJSON(test=h('baz'), release='bar') |
+ |
+ def testUpdateIsNoneForSameValue(self): |
+ self._editor._validate = False |
+ pu = self._f.update('test', version='foo') |
+ self.assertIsNone(pu) |
+ |
+ def testUpdatesPinToToTSuccessfully(self): |
+ self._editor._gitiles.ref_info.return_value = { |
+ 'commit': 'baz', |
+ } |
+ pu = self._f.update('test') |
+ self.assertEqual(pu, pinfile.PinUpdate(name='test', fr='foo', to='baz')) |
+ self._assertWroteJSON(test='baz', release='bar') |
+ |
+ def testUpdateRejectsNewPinWithoutCreate(self): |
+ self.assertRaises(pinfile.ReadOnlyError, |
+ self._f.update, 'newpin', create=False, version=h('baz')) |
+ |
+ def testUpdateWithInvalidCommitHash(self): |
+ self._editor._gitiles.ref_info.side_effect = gitiles.GitilesError |
+ self.assertRaises(pinfile.InvalidPinError, |
+ self._f.update, 'test', version='baz') |
+ |
+ def testUpdateWithInvalidGitilesCommit(self): |
+ self._editor._gitiles.ref_info.side_effect = gitiles.GitilesError |
+ self.assertRaises(pinfile.InvalidPinError, |
+ self._f.update, 'test', version=h('baz')) |
+ |
+ def testRemoveDeletesPin(self): |
+ pu = self._f.remove('test') |
+ self.assertEqual(pu, pinfile.PinUpdate(name='test', fr='foo', to=None)) |
+ self._assertWroteJSON(release='bar') |
+ |
+ pu = self._f.remove('asdf') |
+ self.assertIsNone(pu) |
+ self._assertWroteJSON(release='bar') |
+ |
+ def testIterPins(self): |
+ self.assertEqual(set(self._f.iterpins()), |
+ set([('test', 'foo'), ('release', 'bar')])) |
+ |
+ def testLoad(self): |
+ m = mock.mock_open(read_data='{"foo": "bar"}') |
+ with mock.patch('__builtin__.open', m): |
+ self.assertEqual(set(self._f.iterpins()), |
+ set([('foo', 'bar')])) |
+ |