blob: 93f2e47c11a8b370ffd6e2abceb13e9632a1a461 [file] [log] [blame]
# Copyright 2021 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# -*- coding: utf-8 -*-
"""Tests for pkg_tar."""
# buildifier: disable=bzl-visibility
load("//pkg:mappings.bzl", "pkg_attributes")
load("//pkg:mappings.bzl", "pkg_files", "pkg_mkdirs", "pkg_mklink", "strip_prefix")
load("//pkg:verify_archive.bzl", "verify_archive_test")
load("//pkg/private/tar:tar.bzl", "SUPPORTED_TAR_COMPRESSIONS", "pkg_tar")
load("//tests:my_package_name.bzl", "my_package_naming")
load("//tests/util:defs.bzl", "directory", "fake_artifact", "link_tree")
load("@rules_python//python:defs.bzl", "py_test")
load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
package(
default_applicable_licenses = ["//:license"],
default_visibility = ["//visibility:private"],
)
py_test(
name = "tar_writer_test",
srcs = [
"tar_writer_test.py",
],
imports = ["../.."],
data = [
":compressor",
":test_tar_compression",
":test_tar_package_dir",
":test_tar_package_dir_file",
"//tests:testdata/tar_test.tar",
"//tests:testdata/tar_test.tar.bz2",
"//tests:testdata/tar_test.tar.gz",
"//tests:testdata/tar_test.tar.xz",
"//tests:testdata/test_tar_package_dir_file.txt",
],
python_version = "PY3",
srcs_version = "PY3",
deps = [
"//pkg/private/tar:tar_writer",
"@bazel_tools//tools/python/runfiles",
],
)
genrule(
name = "generate_files",
outs = [
"etc/nsswitch.conf",
"usr/titi",
],
cmd = "for i in $(OUTS); do echo 1 >$$i; done",
)
directory(
name = "generate_tree",
contents = "hello there",
filenames = [
# buildifier: don't sort
"b/e",
"a/a",
"b/c/d",
"b/d",
"a/b/c",
],
)
py_binary(
name = "compressor",
srcs = ["compressor.py"],
python_version = "PY3",
srcs_version = "PY3",
)
pkg_tar(
name = "test_tar_compression",
compressor = ":compressor",
compressor_args = "-a -b -c",
deps = ["//tests:testdata/tar_test.tar"],
)
#
# Tests for package_file_name
#
my_package_naming(
name = "my_package_variables",
label = "some_value",
)
pkg_tar(
name = "test_tar_naming",
srcs = [
":BUILD",
],
package_file_name = "test_naming_{label}.tar",
package_variables = ":my_package_variables",
)
pkg_mkdirs(
name = "mydir",
dirs = [
"mydir",
],
)
pkg_tar(
name = "test_tar_package_dir_substitution",
srcs = [
":BUILD",
":mydir",
],
package_dir = "level1/{label}/level3",
package_variables = ":my_package_variables",
)
pkg_mklink(
name = "mylink",
link_name = "mylink",
target = "dangling",
)
pkg_tar(
name = "test_tar_package_dir",
srcs = [
":etc/nsswitch.conf",
":mylink",
],
package_dir = "/my/package",
)
pkg_tar(
name = "test_tar_package_dir_file",
srcs = [
":etc/nsswitch.conf",
],
package_dir_file = "//tests:testdata/test_tar_package_dir_file.txt",
)
pkg_tar(
name = "test_tar_out",
srcs = [
":BUILD",
],
out = "out.tar",
)
[pkg_tar(
name = "test-tar-basic-%s" % ext,
srcs = [
":etc/nsswitch.conf",
":usr/titi",
],
extension = "tar.%s" % ext if ext else "tar",
mode = "0644",
modes = {"usr/titi": "0755"},
owner = "42.24",
ownername = "titi.tata",
ownernames = {"etc/nsswitch.conf": "tata.titi"},
owners = {"etc/nsswitch.conf": "24.42"},
package_dir = "/",
strip_prefix = ".",
symlinks = {"usr/bin/java": "/path/to/bin/java"},
) for ext in SUPPORTED_TAR_COMPRESSIONS]
[pkg_tar(
name = "test-tar-inclusion-%s" % ext,
deps = [
":test-tar-basic-%s" % ext,
":test_tar_naming",
],
) for ext in SUPPORTED_TAR_COMPRESSIONS]
pkg_tar(
name = "test-tar-strip_prefix-empty",
srcs = [
":etc/nsswitch.conf",
],
strip_prefix = "",
)
pkg_tar(
name = "test-tar-strip_prefix-none",
srcs = [
":etc/nsswitch.conf",
],
)
pkg_tar(
name = "test-tar-strip_prefix-etc",
srcs = [
":etc/nsswitch.conf",
],
strip_prefix = "etc",
)
pkg_tar(
name = "test-tar-strip_prefix-dot",
srcs = [
":etc/nsswitch.conf",
"@bazel_tools//tools/python/runfiles",
],
strip_prefix = ".",
)
pkg_tar(
name = "test-tar-strip_prefix-substring",
srcs = [
":etc/nsswitch.conf",
],
strip_prefix = "et",
)
pkg_tar(
name = "test-tar-files_dict",
files = {
":etc/nsswitch.conf": "not-etc/mapped-filename.conf",
},
)
pkg_tar(
name = "test-tar-empty_files",
empty_files = [
"/a",
"/b",
],
mode = "0o777",
)
pkg_tar(
name = "test-tar-empty_dirs",
empty_dirs = [
"/tmp",
"/pmt",
],
mode = "0o777",
)
pkg_tar(
name = "test-tar-mtime",
srcs = [
":etc/nsswitch.conf",
],
mtime = 946684740, # 1999-12-31, 23:59
portable_mtime = False,
)
pkg_tar(
name = "test-tar-long-filename",
srcs = [
"//tests:testdata/file_with_a_ridiculously_long_name_consectetur_adipiscing_elit_fusce_laoreet_lorem_neque_sed_pharetra_erat.txt",
],
# TODO(https://github.com/bazelbuild/rules_pkg/issues/462): The old test
# used to have strip_prefix. But strip_prefix is just plain broken w.r.t.
# files from other packages. We end up with an internal expected data_path
# of tests/tar/<strip_prefix>. But the files coming in have the real paths.
# strip_prefix = "testdata",
)
pkg_tar(
name = "test-tar-repackaging-long-filename",
package_dir = "can_i_repackage_a_file_with_a_long_name",
deps = [
":test-tar-long-filename",
],
)
verify_archive_test(
name = "repackaging_long_filename_test",
max_size = 2,
must_contain = [
"can_i_repackage_a_file_with_a_long_name/file_with_a_ridiculously_long_name_consectetur_adipiscing_elit_fusce_laoreet_lorem_neque_sed_pharetra_erat.txt",
],
must_contain_regex = [
".*can_i_repackage_a_file_with_a_long_name/$",
],
# there is really no need for these cases. I just want to use all the test capabilities.
must_not_contain = [
"i_am_not here",
],
must_not_contain_regex = [
"^five.is.right.out",
],
target = ":test-tar-repackaging-long-filename",
)
pkg_tar(
name = "test-tar-tree-artifact",
srcs = [
":generate_tree",
"//tests:loremipsum_txt",
],
package_dir = "a_tree",
)
pkg_files(
name = "tree_noroot",
srcs = [
":generate_tree",
],
strip_prefix = "generate_tree",
)
pkg_tar(
name = "test-tar-tree-artifact-noroot",
srcs = [
":tree_noroot",
"//tests:loremipsum_txt",
],
package_dir = "a_tree",
)
fake_artifact(
name = "a_program",
files = ["//tests:testdata/executable.sh"],
runfiles = ["BUILD"],
)
pkg_tar(
name = "test-tar-with-runfiles",
srcs = [
":a_program",
],
include_runfiles = True,
)
pkg_tar(
name = "test_tar_leading_dotslash",
srcs = [
"//tests:loremipsum_txt",
],
package_dir = ".",
)
py_test(
name = "pkg_tar_test",
size = "medium",
srcs = [
"pkg_tar_test.py",
],
imports = ["../.."],
data = [
":test-pkg-tar-from-pkg-files-with-attributes",
":test-pkg-tar-with-attributes",
":test-remap-paths-tree-artifact",
":test-tar-empty_dirs.tar",
":test-tar-empty_files.tar",
":test-tar-files_dict.tar",
":test-tar-long-filename",
":test-tar-mtime.tar",
":test-tar-repackaging-long-filename.tar",
":test-tar-strip_prefix-dot.tar",
":test-tar-strip_prefix-empty.tar",
":test-tar-strip_prefix-etc.tar",
":test-tar-strip_prefix-none.tar",
":test-tar-strip_prefix-substring.tar",
":test-tar-tree-artifact",
":test-tar-tree-artifact-noroot",
":test-tar-with-runfiles",
":test-tree-input-with-strip-prefix",
":test_tar_leading_dotslash",
":test_tar_package_dir_substitution.tar",
"//tests:testdata/tar_test.tar",
"//tests:testdata/tar_test.tar.bz2",
"//tests:testdata/tar_test.tar.gz",
"//tests:testdata/tar_test.tar.xz",
"//tests:testdata/test_tar_package_dir_file.txt",
] + [
":test-tar-basic-%s" % compression
for compression in SUPPORTED_TAR_COMPRESSIONS
] + [
":test-tar-inclusion-%s" % compression
for compression in SUPPORTED_TAR_COMPRESSIONS
],
python_version = "PY3",
deps = [
"//pkg/private/tar:tar_writer",
"@bazel_tools//tools/python/runfiles",
],
)
test_suite(
name = "windows_tests",
tags = [
"-slow",
],
visibility = ["//visibility:private"],
)
test_suite(
name = "all_windows_tests",
tests = [":windows_tests"],
)
pkg_tar(
name = "test-tar-compression-from-extension-targz",
srcs = [
"//tests:testdata/loremipsum.txt",
],
extension = ".tar.gz",
)
pkg_files(
name = "test-pkg-files-with-attributes",
srcs = [
"//tests:testdata/loremipsum.txt",
],
attributes = pkg_attributes(
gid = 1000,
group = "grp",
mode = "0440",
uid = 0,
user = "person",
),
prefix = "/foo/bar",
)
pkg_tar(
name = "test-pkg-tar-from-pkg-files-with-attributes",
srcs = [
":test-pkg-files-with-attributes",
],
)
pkg_tar(
name = "test-pkg-tar-with-attributes",
srcs = [
"//tests:testdata/loremipsum.txt",
],
owner = "0.1000",
package_dir = "/foo/bar",
)
pkg_tar(
name = "test-tar-compression-from-extension-tgz",
srcs = [
"//tests:testdata/loremipsum.txt",
],
extension = "tgz",
)
pkg_tar(
name = "test-tar-compression-from-extension-bz2",
srcs = [
"//tests:testdata/loremipsum.txt",
],
extension = ".bz2",
)
py_test(
name = "is_compressed_test",
srcs = ["is_compressed_test.py"],
data = [
":test-tar-compression-from-extension-bz2",
":test-tar-compression-from-extension-targz",
":test-tar-compression-from-extension-tgz",
],
python_version = "PY3",
srcs_version = "PY3",
deps = [
"@bazel_tools//tools/python/runfiles",
],
)
directory(
name = "generate_tree_with_prefix",
contents = "hello there",
filenames = [
"a/a",
"a/b",
],
outdir = "tree_prefix_to_strip",
)
pkg_tar(
name = "test-tree-input-with-strip-prefix",
srcs = [
":generate_tree_with_prefix",
],
strip_prefix = "tree_prefix_to_strip",
)
directory(
name = "tree_artifact_to_rename",
contents = "hello there",
filenames = [
"a",
"rename_me/should_not_rename",
],
outdir = "rename_me",
)
pkg_tar(
name = "test-remap-paths-tree-artifact",
srcs = [
":tree_artifact_to_rename",
],
remap_paths = {
"/rename_me": "a_new_name",
},
)
#
# Test with symlinks
#
link_tree(
name = "node_modules",
links = {
"foo": ".pnpm/foo@1.0.0/node_modules/foo",
".pnpm/bar@1.0.0/node_modules/bar": "STORE/bar",
".pnpm/foo@1.0.0/node_modules/foo": "STORE/foo",
".pnpm/foo@1.0.0/node_modules/bar": "../../bar@1.0.0/node_modules/bar",
},
package_dir = "node_modules",
)
directory(
name = "tree_artifact_with_links",
contents = "hello there",
filenames = [
"foo/hello.txt",
"foo/bar/baz",
],
# TODO(https://github.com/bazelbuild/rules_pkg/issues/750)
#links = {
# "foo/bar/hello": "../hello.txt",
# "foo/bar/alt_baz": "baz",
# "foo/alt_baz": "bar/baz",
#},
)
# This target has symlinks 3 ways.
# - mklinks rules.
# - source files that are symlinks
# - tree artifacts
pkg_tar(
name = "relative_links_tar",
srcs = [
":node_modules",
":tree_artifact_with_links",
"//tests:file_and_link",
],
symlinks = {
"tree_artifact/toss_in_another": "/foo",
},
)
verify_archive_test(
name = "relative_links_test",
min_size = 10,
must_contain = [
"BUILD",
"outer_BUILD",
"node_modules/.pnpm/bar@1.0.0/node_modules/bar",
],
tags = ["nowindows"],
target = ":relative_links_tar",
verify_links = {
"node_modules/.pnpm/foo@1.0.0/node_modules/bar": "../../bar@1.0.0/node_modules/bar",
"tree_artifact/toss_in_another": "/foo",
},
)
pkg_tar(
name = "relative_links_re_tar",
package_dir = "new/base",
symlinks = {
# We expect package_dir to apply to this
"tree_artifact/toss_in_another": "some_target",
# But we protect the user from duplicationg package_dir in their
# link. That was the old behavior of symlink.
"new/base/something/this": "that",
},
deps = [
":relative_links_tar",
],
)
verify_archive_test(
name = "relative_links_re_test",
min_size = 10,
must_contain = [
"new/base/BUILD",
"new/base/outer_BUILD",
"new/base/node_modules/.pnpm/bar@1.0.0/node_modules/bar",
],
must_not_contain = [
"BUILD",
"new/base/new/base/something/this",
],
tags = ["nowindows"],
target = ":relative_links_re_tar",
verify_links = {
"new/base/node_modules/.pnpm/foo@1.0.0/node_modules/bar": "../../bar@1.0.0/node_modules/bar",
"new/base/tree_artifact/toss_in_another": "some_target",
"new/base/something/this": "that",
},
)