def test_localsourcepaths_files(tmpdir):
    tmpdir.mkdir('abc')
    tmpdir.join('moo.cow').write('z')
    abcpath = tmpdir.join('abc')
    abcpath.join('hello.txt').write('hello')
    abcpath.join('blah.x').write('x')
    abcpath.join('blah.y').write('x')
    abcpath.join('blah.z').write('x')
    abcpath.mkdir('def')
    defpath = abcpath.join('def')
    defpath.join('world.txt').write('world')
    defpath.join('moo.cow').write('y')

    a = upload.LocalSourcePath()
    a.add_includes('**')
    a.add_includes('*.txt')
    a.add_includes(('moo.cow', '*blah*'))
    with pytest.raises(ValueError):
        a.add_includes('**/**/*')
    a.add_excludes('**')
    a.add_excludes('**/blah.x')
    with pytest.raises(ValueError):
        a.add_excludes('**/**/blah.x')
    a.add_excludes(['world.txt'])
    a.add_path(str(tmpdir))
    a_set = set()
    for file in a.files(True):
        sfile = str(file.parent_path / file.relative_path)
        a_set.add(sfile)

    assert len(a._include) == 3
    assert len(a._exclude) == 2

    assert not a.can_rename()
    assert len(a.paths) == 1
    assert _resolve_pypath(abcpath.join('blah.x')) in a_set
    assert _resolve_pypath(defpath.join('world.txt')) in a_set
    assert _resolve_pypath(defpath.join('moo.cow')) not in a_set

    b = upload.LocalSourcePath()
    b.add_includes(['moo.cow', '*blah*'])
    b.add_includes('*.txt')
    b.add_excludes(('world.txt', ))
    b.add_excludes('**/blah.x')
    b.add_paths([pathlib.Path(str(tmpdir))])
    for file in a.files(True):
        sfile = str(file.parent_path / file.relative_path)
        assert sfile in a_set

    assert upload.LocalSourcePath.is_stdin('-')
    assert upload.LocalSourcePath.is_stdin('/dev/stdin')
    assert not upload.LocalSourcePath.is_stdin('/')

    a = upload.LocalSourcePath()
    a.add_includes('z')
    a.add_path(str(tmpdir) + '/abc/hello.txt')
    a_set = set()
    for file in a.files(True):
        sfile = str(file.parent_path / file.relative_path)
        a_set.add(sfile)
    assert len(a_set) == 0

    c = upload.LocalSourcePath()
    c.add_path('-')
    for file in c.files(False):
        assert file.use_stdin

    d = upload.LocalSourcePath()
    d.add_path(str(tmpdir.join('moo.cow')))
    i = 0
    for file in d.files(True):
        assert str(file.parent_path.absolute()) == str(tmpdir)
        assert str(file.relative_path) == 'moo.cow'
        assert not file.use_stdin
        i += 1
    assert i == 1

    tmpdir.join('moo.cow2').ensure(file=True)
    d.add_path(str(tmpdir.join('moo.cow2')))
    i = 0
    for file in d.files(True):
        i += 1
    assert i == 2
def test_specification(tmpdir):
    lsp = upload.LocalSourcePath()
    lsp.add_paths(['-', '/dev/stdin'])
    with pytest.raises(ValueError):
        upload.Specification(
            upload_options=options.Upload(
                access_tier=None,
                chunk_size_bytes=4194304,
                delete_extraneous_destination=False,
                delete_only=False,
                mode=azmodels.StorageModes.Auto,
                one_shot_bytes=0,
                overwrite=True,
                recursive=True,
                rename=True,
                rsa_public_key=None,
                stdin_as_page_blob_size=0,
                store_file_properties=options.FileProperties(
                    attributes=True,
                    cache_control='cc',
                    content_type='ct',
                    lmt=None,
                    md5=True,
                ),
                strip_components=0,
                vectored_io=None,
            ),
            skip_on_options=options.SkipOn(
                filesize_match=True,
                lmt_ge=False,
                md5_match=True,
            ),
            local_source_path=lsp,
        )

    lsp = upload.LocalSourcePath()
    lsp.add_path(str(tmpdir))
    with pytest.raises(ValueError):
        upload.Specification(
            upload_options=options.Upload(
                access_tier=None,
                chunk_size_bytes=4194304,
                delete_extraneous_destination=False,
                delete_only=False,
                mode=azmodels.StorageModes.Auto,
                one_shot_bytes=0,
                overwrite=True,
                recursive=True,
                rename=True,
                rsa_public_key=None,
                stdin_as_page_blob_size=0,
                store_file_properties=options.FileProperties(
                    attributes=True,
                    cache_control='cc',
                    content_type='ct',
                    lmt=None,
                    md5=True,
                ),
                strip_components=0,
                vectored_io=None,
            ),
            skip_on_options=options.SkipOn(
                filesize_match=True,
                lmt_ge=False,
                md5_match=True,
            ),
            local_source_path=lsp,
        )

    lsp = upload.LocalSourcePath()
    lsp.add_path(str(tmpdir))
    with pytest.raises(ValueError):
        upload.Specification(
            upload_options=options.Upload(
                access_tier=None,
                chunk_size_bytes=-1,
                delete_extraneous_destination=False,
                delete_only=False,
                mode=azmodels.StorageModes.Auto,
                one_shot_bytes=0,
                overwrite=True,
                recursive=True,
                rename=False,
                rsa_public_key=None,
                stdin_as_page_blob_size=0,
                store_file_properties=options.FileProperties(
                    attributes=True,
                    cache_control='cc',
                    content_type='ct',
                    lmt=None,
                    md5=True,
                ),
                strip_components=0,
                vectored_io=None,
            ),
            skip_on_options=options.SkipOn(
                filesize_match=True,
                lmt_ge=False,
                md5_match=True,
            ),
            local_source_path=lsp,
        )

    with pytest.raises(ValueError):
        upload.Specification(
            upload_options=options.Upload(
                access_tier=None,
                chunk_size_bytes=upload._MAX_BLOCK_BLOB_CHUNKSIZE_BYTES + 1,
                delete_extraneous_destination=False,
                delete_only=False,
                mode=azmodels.StorageModes.Auto,
                one_shot_bytes=0,
                overwrite=True,
                recursive=True,
                rename=False,
                rsa_public_key=None,
                stdin_as_page_blob_size=0,
                store_file_properties=options.FileProperties(
                    attributes=True,
                    cache_control='cc',
                    content_type='ct',
                    lmt=None,
                    md5=True,
                ),
                strip_components=0,
                vectored_io=None,
            ),
            skip_on_options=options.SkipOn(
                filesize_match=True,
                lmt_ge=False,
                md5_match=True,
            ),
            local_source_path=lsp,
        )

    with pytest.raises(ValueError):
        upload.Specification(
            upload_options=options.Upload(
                access_tier=None,
                chunk_size_bytes=4194304,
                delete_extraneous_destination=False,
                delete_only=False,
                mode=azmodels.StorageModes.Auto,
                one_shot_bytes=-1,
                overwrite=True,
                recursive=True,
                rename=False,
                rsa_public_key=None,
                stdin_as_page_blob_size=0,
                store_file_properties=options.FileProperties(
                    attributes=True,
                    cache_control='cc',
                    content_type='ct',
                    lmt=None,
                    md5=True,
                ),
                strip_components=0,
                vectored_io=None,
            ),
            skip_on_options=options.SkipOn(
                filesize_match=True,
                lmt_ge=False,
                md5_match=True,
            ),
            local_source_path=lsp,
        )

    with pytest.raises(ValueError):
        upload.Specification(
            upload_options=options.Upload(
                access_tier=None,
                chunk_size_bytes=4194304,
                delete_extraneous_destination=False,
                delete_only=False,
                mode=azmodels.StorageModes.Auto,
                one_shot_bytes=upload._MAX_BLOCK_BLOB_ONESHOT_BYTES + 1,
                overwrite=True,
                recursive=True,
                rename=False,
                rsa_public_key=None,
                stdin_as_page_blob_size=0,
                store_file_properties=options.FileProperties(
                    attributes=True,
                    cache_control=None,
                    content_type=None,
                    lmt=None,
                    md5=True,
                ),
                strip_components=0,
                vectored_io=None,
            ),
            skip_on_options=options.SkipOn(
                filesize_match=True,
                lmt_ge=False,
                md5_match=True,
            ),
            local_source_path=lsp,
        )

    spec = upload.Specification(
        upload_options=options.Upload(
            access_tier=None,
            chunk_size_bytes=4194304,
            delete_extraneous_destination=False,
            delete_only=False,
            mode=azmodels.StorageModes.Auto,
            one_shot_bytes=0,
            overwrite=True,
            recursive=True,
            rename=False,
            rsa_public_key=None,
            stdin_as_page_blob_size=0,
            store_file_properties=options.FileProperties(
                attributes=True,
                cache_control=None,
                content_type=None,
                lmt=None,
                md5=True,
            ),
            strip_components=0,
            vectored_io=None,
        ),
        skip_on_options=options.SkipOn(
            filesize_match=True,
            lmt_ge=False,
            md5_match=True,
        ),
        local_source_path=lsp,
    )
    spec.add_azure_destination_path(azops.DestinationPath())
    assert len(spec.destinations) == 1