def test_push_revision_uses_available_delta(self): self.useFixture(fixture_setup.FakeTerminal()) if self.enable_deltas: self.useFixture(fixture_setup.DeltaUploads()) # Create a source snap main(['init']) main(['snap']) snap_file = glob.glob('*.snap')[0] # Upload with mock.patch('snapcraft.storeapi.StatusTracker'): main(['push', snap_file]) # create an additional snap, potentially a delta target main(['snap']) new_snap_file = glob.glob('*.snap')[0] # Upload with mock.patch('snapcraft.storeapi.StatusTracker'): main(['push', new_snap_file]) _, kwargs = self.mock_upload.call_args if self.enable_deltas: self.assertEqual(kwargs.get('delta_format'), 'xdelta3') else: self.assertIsNone(kwargs.get('delta_format'))
def test_push_revision_cached_with_experimental_deltas(self): self.useFixture(fixture_setup.FakeTerminal()) if self.enable_deltas: self.useFixture(fixture_setup.DeltaUploads()) # Create a snap main(['init']) main(['snap']) snap_file = glob.glob('*.snap')[0] # Upload with mock.patch('snapcraft.storeapi.StatusTracker'): main(['push', snap_file]) snap_cache = os.path.join( BaseDirectory.xdg_cache_home, 'snapcraft', 'projects', 'my-snap-name', 'snap_hashes', self.deb_arch, ) cached_snap = os.path.join(snap_cache, file_utils.calculate_sha3_384(snap_file)) if self.enable_deltas: self.assertThat(cached_snap, FileExists()) else: self.assertThat(cached_snap, Not(FileExists()))
def test_push_revision_prune_snap_cache(self): self.useFixture(fixture_setup.FakeTerminal()) self.useFixture(fixture_setup.DeltaUploads()) snap_revision = 9 patcher = mock.patch('snapcraft.storeapi.StoreClient.push_precheck') patcher.start() self.addCleanup(patcher.stop) patcher = mock.patch.object(storeapi.StoreClient, 'get_snap_history') mock_release = patcher.start() self.addCleanup(patcher.stop) mock_release.return_value = [snap_revision] mock_tracker = mock.Mock(storeapi.StatusTracker) mock_tracker.track.return_value = { 'code': 'ready_to_release', 'processed': True, 'can_release': True, 'url': '/fake/url', 'revision': snap_revision, } patcher = mock.patch.object(storeapi.StoreClient, 'upload') mock_upload = patcher.start() self.addCleanup(patcher.stop) mock_upload.return_value = mock_tracker deb_arch = snapcraft.ProjectOptions().deb_arch snap_cache = os.path.join(BaseDirectory.xdg_cache_home, 'snapcraft', 'projects', 'my-snap-name', 'snap_hashes', deb_arch) os.makedirs(snap_cache) for cached_snap in self.cached_snaps: cached_snap = cached_snap.format(deb_arch) open(os.path.join(snap_cache, cached_snap), 'a').close() # Create a snap main(['init']) main(['snap']) snap_file = glob.glob('*.snap')[0] # Upload with mock.patch('snapcraft.storeapi.StatusTracker'): main(['push', snap_file]) real_cached_snap = os.path.join( snap_cache, file_utils.calculate_sha3_384(snap_file)) self.assertThat(os.path.join(snap_cache, real_cached_snap), FileExists()) for snap in self.cached_snaps: snap = snap.format(deb_arch) self.assertThat(os.path.join(snap_cache, snap), Not(FileExists())) self.assertEqual(1, len(os.listdir(snap_cache)))
def test_push_revision_prune_snap_cache(self): self.useFixture(fixture_setup.FakeTerminal()) self.useFixture(fixture_setup.DeltaUploads()) snap_revision = 9 mock_tracker = mock.Mock(storeapi.StatusTracker) mock_tracker.track.return_value = { 'code': 'ready_to_release', 'processed': True, 'can_release': True, 'url': '/fake/url', 'revision': snap_revision, } patcher = mock.patch.object(storeapi.StoreClient, 'upload') mock_upload = patcher.start() self.addCleanup(patcher.stop) mock_upload.return_value = mock_tracker revision_cache = os.path.join(BaseDirectory.xdg_cache_home, 'snapcraft', 'my-snap-name', 'revisions') os.makedirs(revision_cache) for cached_snap in self.cached_snaps: open(os.path.join(revision_cache, cached_snap), 'a').close() # Create a snap main(['init']) main(['snap']) snap_file = glob.glob('*.snap')[0] # Upload with mock.patch('snapcraft.storeapi.StatusTracker'): main(['push', snap_file]) real_cached_snap = _rewrite_snap_filename_with_revision( snap_file, snap_revision) self.assertTrue( os.path.isfile(os.path.join(revision_cache, real_cached_snap))) for snap in self.cached_snaps: self.assertFalse(os.path.isfile(os.path.join(revision_cache, snap))) self.assertEqual(1, len(os.listdir(revision_cache)))
def test_push_with_upload_failure_falls_back(self): self.useFixture(fixture_setup.FakeTerminal()) self.useFixture(fixture_setup.DeltaUploads()) # Create a source snap to delta from main(['init']) main(['snap']) snap_file = glob.glob('*.snap')[0] # Upload with mock.patch('snapcraft.storeapi.StatusTracker'): main(['push', snap_file]) # create a target snap main(['snap']) # Raise exception in delta upload patcher = mock.patch('snapcraft._store._push_delta') mock_push_delta = patcher.start() self.addCleanup(patcher.stop) mock_push_delta.side_effect = StoreDeltaApplicationError( 'There has been a problem while processing a snap delta.') mock_tracker = mock.Mock(storeapi.StatusTracker) mock_tracker.track.return_value = { 'code': 'ready_to_release', 'processed': True, 'can_release': True, 'url': '/fake/url', 'revision': 9, } patcher = mock.patch.object(storeapi.StoreClient, 'upload') mock_upload = patcher.start() self.addCleanup(patcher.stop) mock_upload.return_value = mock_tracker # Upload and ensure fallback is called with mock.patch('snapcraft.storeapi.StatusTracker'): main(['push', snap_file]) mock_upload.assert_called_once_with('my-snap-name', snap_file)
def test_push_revision_cached_with_experimental_deltas(self): self.useFixture(fixture_setup.FakeTerminal()) if self.enable_deltas: self.useFixture(fixture_setup.DeltaUploads()) mock_tracker = mock.Mock(storeapi.StatusTracker) snap_revision = 9 mock_tracker.track.return_value = { 'code': 'ready_to_release', 'processed': True, 'can_release': True, 'url': '/fake/url', 'revision': snap_revision, } patcher = mock.patch.object(storeapi.StoreClient, 'upload') mock_upload = patcher.start() self.addCleanup(patcher.stop) mock_upload.return_value = mock_tracker # Create a snap main(['init']) main(['snap']) snap_file = glob.glob('*.snap')[0] # Upload with mock.patch('snapcraft.storeapi.StatusTracker') as mock_tracker: main(['push', snap_file]) revision_cache = os.path.join(BaseDirectory.xdg_cache_home, 'snapcraft', 'my-snap-name', 'revisions') cached_snap = _rewrite_snap_filename_with_revision( snap_file, snap_revision) self.assertEqual( self.enable_deltas, os.path.isfile(os.path.join(revision_cache, cached_snap)))