|
| 1 | +# shellcheck shell=bash |
| 2 | +# |
| 3 | +# Copyright 2025 The Linux Foundation |
| 4 | +# |
| 5 | +# Licensed under the Apache License, Version 2.0 (the "License"); |
| 6 | +# you may not use this file except in compliance with the License. |
| 7 | +# You may obtain a copy of the License at |
| 8 | +# |
| 9 | +# http://www.apache.org/licenses/LICENSE-2.0 |
| 10 | +# |
| 11 | +# Unless required by applicable law or agreed to in writing, software |
| 12 | +# distributed under the License is distributed on an "AS IS" BASIS, |
| 13 | +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 14 | +# See the License for the specific language governing permissions and |
| 15 | +# limitations under the License. |
| 16 | +# |
| 17 | + |
| 18 | +#include file/copy |
| 19 | +#include core/test/assert_equals |
| 20 | +#include core/test/assert_success |
| 21 | +#include core/test/assert_contains |
| 22 | +#include core/test/prep_step |
| 23 | + |
| 24 | +function file::tests::copy::test() { |
| 25 | + if ! command -v sudo &>/dev/null; then |
| 26 | + apt-get update -qq && apt-get install -y -qq sudo |
| 27 | + fi |
| 28 | + |
| 29 | + local sudoCommand="" |
| 30 | + if [[ $EUID -ne 0 ]] && command -v sudo &>/dev/null; then |
| 31 | + sudoCommand="sudo" |
| 32 | + fi |
| 33 | + |
| 34 | + local sourceFile="/tmp/source_copy_$$" |
| 35 | + local destDir="/tmp/dest_copy_dir_$$" |
| 36 | + |
| 37 | + core::test::prep_step mkdir -p "$destDir" |
| 38 | + core::test::prep_step echo "test content" > "$sourceFile" |
| 39 | + core::test::prep_step $sudoCommand chown root:root "$destDir" |
| 40 | + |
| 41 | + core::test::assert_success file::copy "$sourceFile" "$destDir/" |
| 42 | + |
| 43 | + local copiedFile="$destDir/$(basename "$sourceFile")" |
| 44 | + core::test::assert_success test -f "$copiedFile" |
| 45 | + |
| 46 | + local copiedUser |
| 47 | + copiedUser=$(stat -c '%U' "$copiedFile") |
| 48 | + core::test::assert_equals "root" "$copiedUser" |
| 49 | + |
| 50 | + local copiedGroup |
| 51 | + copiedGroup=$(stat -c '%G' "$copiedFile") |
| 52 | + core::test::assert_equals "root" "$copiedGroup" |
| 53 | + |
| 54 | + local copiedContent |
| 55 | + copiedContent=$(cat "$copiedFile") |
| 56 | + core::test::assert_contains "$copiedContent" "test content" |
| 57 | + |
| 58 | + # Test recursive directory copy |
| 59 | + local sourceDir="/tmp/source_copy_dir_$$" |
| 60 | + local destDir2="/tmp/dest_copy_dir2_$$" |
| 61 | + |
| 62 | + core::test::prep_step mkdir -p "$sourceDir"/{sub1,sub2} |
| 63 | + core::test::prep_step mkdir -p "$destDir2" |
| 64 | + core::test::prep_step touch "$sourceDir"/sub1/file1 |
| 65 | + core::test::prep_step echo "nested content" > "$sourceDir"/sub2/file2 |
| 66 | + core::test::prep_step $sudoCommand chown root:root "$destDir2" |
| 67 | + |
| 68 | + core::test::assert_success file::copy "$sourceDir" "$destDir2/" -r |
| 69 | + |
| 70 | + local copiedDir="$destDir2/$(basename "$sourceDir")" |
| 71 | + core::test::assert_success test -d "$copiedDir" |
| 72 | + core::test::assert_success test -d "$copiedDir/sub1" |
| 73 | + core::test::assert_success test -f "$copiedDir/sub1/file1" |
| 74 | + core::test::assert_success test -f "$copiedDir/sub2/file2" |
| 75 | + |
| 76 | + local copiedDirUser |
| 77 | + copiedDirUser=$(stat -c '%U' "$copiedDir") |
| 78 | + core::test::assert_equals "root" "$copiedDirUser" |
| 79 | + |
| 80 | + local copiedSubdirUser |
| 81 | + copiedSubdirUser=$(stat -c '%U' "$copiedDir/sub1") |
| 82 | + core::test::assert_equals "root" "$copiedSubdirUser" |
| 83 | + |
| 84 | + local copiedFile2User |
| 85 | + copiedFile2User=$(stat -c '%U' "$copiedDir/sub2/file2") |
| 86 | + core::test::assert_equals "root" "$copiedFile2User" |
| 87 | + |
| 88 | + # Test copy with preserve flag |
| 89 | + local sourceFile2="/tmp/source_copy2_$$" |
| 90 | + local destDir3="/tmp/dest_copy_dir3_$$" |
| 91 | + |
| 92 | + core::test::prep_step mkdir -p "$destDir3" |
| 93 | + core::test::prep_step echo "preserve test" > "$sourceFile2" |
| 94 | + core::test::prep_step chmod 644 "$sourceFile2" |
| 95 | + core::test::prep_step $sudoCommand chown root:root "$destDir3" |
| 96 | + |
| 97 | + core::test::assert_success file::copy "$sourceFile2" "$destDir3/" -p |
| 98 | + |
| 99 | + local copiedFile3="$destDir3/$(basename "$sourceFile2")" |
| 100 | + core::test::assert_success test -f "$copiedFile3" |
| 101 | + |
| 102 | + # Test multiple file copies |
| 103 | + local sourceFile3="/tmp/source_copy3_$$" |
| 104 | + local sourceFile4="/tmp/source_copy4_$$" |
| 105 | + local destDir4="/tmp/dest_copy_dir4_$$" |
| 106 | + |
| 107 | + core::test::prep_step mkdir -p "$destDir4" |
| 108 | + core::test::prep_step echo "file3" > "$sourceFile3" |
| 109 | + core::test::prep_step echo "file4" > "$sourceFile4" |
| 110 | + core::test::prep_step $sudoCommand chown root:root "$destDir4" |
| 111 | + |
| 112 | + core::test::assert_success file::copy "$sourceFile3" "$destDir4/" |
| 113 | + core::test::assert_success file::copy "$sourceFile4" "$destDir4/" |
| 114 | + |
| 115 | + core::test::assert_success test -f "$destDir4/$(basename "$sourceFile3")" |
| 116 | + core::test::assert_success test -f "$destDir4/$(basename "$sourceFile4")" |
| 117 | + |
| 118 | + # Test deeply nested directory copy |
| 119 | + local deepSource="/tmp/deep_source_$$" |
| 120 | + local deepDest="/tmp/deep_dest_$$" |
| 121 | + |
| 122 | + core::test::prep_step mkdir -p "$deepSource"/a/b/c/d |
| 123 | + core::test::prep_step mkdir -p "$deepDest" |
| 124 | + core::test::prep_step touch "$deepSource"/a/b/c/d/deep_file |
| 125 | + core::test::prep_step $sudoCommand chown root:root "$deepDest" |
| 126 | + |
| 127 | + core::test::assert_success file::copy "$deepSource" "$deepDest/" -r |
| 128 | + |
| 129 | + local copiedDeep="$deepDest/$(basename "$deepSource")" |
| 130 | + core::test::assert_success test -f "$copiedDeep/a/b/c/d/deep_file" |
| 131 | + |
| 132 | + local copiedDeepFileUser |
| 133 | + copiedDeepFileUser=$(stat -c '%U' "$copiedDeep/a/b/c/d/deep_file") |
| 134 | + core::test::assert_equals "root" "$copiedDeepFileUser" |
| 135 | +} |
0 commit comments