# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)

import os

import pytest

from llnl.util.filesystem import mkdirp, touch

import spack.config
from spack.fetch_strategy import CacheURLFetchStrategy, NoCacheError
from spack.stage import Stage


@pytest.mark.parametrize('_fetch_method', ['curl', 'urllib'])
def test_fetch_missing_cache(tmpdir, _fetch_method):
    """Ensure raise a missing cache file."""
    testpath = str(tmpdir)
    with spack.config.override('config:url_fetch_method', _fetch_method):
        fetcher = CacheURLFetchStrategy(url='file:///not-a-real-cache-file')
        with Stage(fetcher, path=testpath):
            with pytest.raises(NoCacheError, match=r'No cache'):
                fetcher.fetch()


@pytest.mark.parametrize('_fetch_method', ['curl', 'urllib'])
def test_fetch(tmpdir, _fetch_method):
    """Ensure a fetch after expanding is effectively a no-op."""
    testpath = str(tmpdir)
    cache = os.path.join(testpath, 'cache.tar.gz')
    touch(cache)
    url = 'file:///{0}'.format(cache)
    with spack.config.override('config:url_fetch_method', _fetch_method):
        fetcher = CacheURLFetchStrategy(url=url)
        with Stage(fetcher, path=testpath) as stage:
            source_path = stage.source_path
            mkdirp(source_path)
            fetcher.fetch()

[(17, 'pytest.mark.parametrize', 'pytest.mark.parametrize', (['"""_fetch_method"""', "['curl', 'urllib']"], {}), False, 'import pytest\n'), (28, 'pytest.mark.parametrize', 'pytest.mark.parametrize', (['"""_fetch_method"""', "['curl', 'urllib']"], {}), False, 'import pytest\n'), (32, 'os.path.join', 'os.path.join', (['testpath', '"""cache.tar.gz"""'], {}), False, 'import os\n'), (33, 'llnl.util.filesystem.touch', 'touch', (['cache'], {}), False, 'from llnl.util.filesystem import mkdirp, touch\n'), (22, 'spack.fetch_strategy.CacheURLFetchStrategy', 'CacheURLFetchStrategy', ([], {'url': '"""file:///not-a-real-cache-file"""'}), False, 'from spack.fetch_strategy import CacheURLFetchStrategy, NoCacheError\n'), (36, 'spack.fetch_strategy.CacheURLFetchStrategy', 'CacheURLFetchStrategy', ([], {'url': 'url'}), False, 'from spack.fetch_strategy import CacheURLFetchStrategy, NoCacheError\n'), (23, 'spack.stage.Stage', 'Stage', (['fetcher'], {'path': 'testpath'}), False, 'from spack.stage import Stage\n'), (37, 'spack.stage.Stage', 'Stage', (['fetcher'], {'path': 'testpath'}), False, 'from spack.stage import Stage\n'), (39, 'llnl.util.filesystem.mkdirp', 'mkdirp', (['source_path'], {}), False, 'from llnl.util.filesystem import mkdirp, touch\n'), (24, 'pytest.raises', 'pytest.raises', (['NoCacheError'], {'match': '"""No cache"""'}), False, 'import pytest\n')]