| #!/bin/bash |
| # Copyright 2017-2020 The Verible Authors. |
| # |
| # 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. |
| |
| # Find input files |
| MY_INPUT_FILE="${TEST_TMPDIR}/myinput.txt" |
| readonly MY_INPUT_FILE |
| MY_OUTPUT_FILE="${TEST_TMPDIR}/myoutput.txt" |
| readonly MY_OUTPUT_FILE |
| MY_EXPECT_FILE="${TEST_TMPDIR}/myexpect.txt" |
| readonly MY_EXPECT_FILE |
| |
| # Process script flags and arguments. |
| [[ "$#" == 1 ]] || { |
| echo "Expecting 1 positional argument, verible-patch-tool path." |
| exit 1 |
| } |
| patch_tool="$1" |
| |
| ################################################################################ |
| # Test no command. |
| |
| "$patch_tool" > "$MY_OUTPUT_FILE" 2>&1 |
| |
| status="$?" |
| [[ $status == 1 ]] || { |
| "Expected exit code 1, but got $status" |
| exit 1 |
| } |
| |
| ################################################################################ |
| # Test invalid command. |
| |
| "$patch_tool" wish > "$MY_OUTPUT_FILE" 2>&1 |
| |
| status="$?" |
| [[ $status == 1 ]] || { |
| "Expected exit code 1, but got $status" |
| exit 1 |
| } |
| |
| ################################################################################ |
| # Test the 'help' command. |
| |
| "$patch_tool" help > "$MY_OUTPUT_FILE" 2>&1 |
| |
| status="$?" |
| [[ $status == 0 ]] || { |
| "Expected exit code 0, but got $status" |
| exit 1 |
| } |
| |
| grep -q "changed-lines" "$MY_OUTPUT_FILE" || { |
| echo "Expected \"changed-lines\" in $MY_OUTPUT_FILE but didn't find it. Got:" |
| cat "$MY_OUTPUT_FILE" |
| exit 1 |
| } |
| |
| ################################################################################ |
| # Test 'help' on a specific command. |
| |
| "$patch_tool" help help > "$MY_OUTPUT_FILE" 2>&1 |
| |
| status="$?" |
| [[ $status == 0 ]] || { |
| "Expected exit code 0, but got $status" |
| exit 1 |
| } |
| |
| ################################################################################ |
| # Test changed-lines: missing patchfile argument. |
| |
| "$patch_tool" changed-lines > /dev/null |
| |
| status="$?" |
| [[ $status == 1 ]] || { |
| "Expected exit code 1, but got $status" |
| exit 1 |
| } |
| |
| ################################################################################ |
| # Test changed-lines: using a fake patch file. |
| |
| cat > "$MY_INPUT_FILE" <<EOF |
| --- /path/to/file1.txt 2017-01-01 |
| +++ /path/to/file1.txt 2017-01-01 |
| @@ -9,3 +12,6 @@ |
| same |
| +new |
| +new too |
| same |
| +new three |
| same |
| --- /dev/null 2017-01-01 |
| +++ /path/to/file2.txt 2017-01-01 |
| @@ -0,0 +1,3 @@ |
| +do |
| +re |
| +mi |
| EOF |
| |
| cat > "$MY_EXPECT_FILE" <<EOF |
| /path/to/file1.txt 13-14,16 |
| /path/to/file2.txt |
| EOF |
| |
| "$patch_tool" changed-lines "$MY_INPUT_FILE" > "$MY_OUTPUT_FILE" |
| |
| status="$?" |
| [[ $status == 0 ]] || { |
| "Expected exit code 0, but got $status" |
| exit 1 |
| } |
| |
| diff -u "$MY_EXPECT_FILE" "$MY_OUTPUT_FILE" || { |
| exit 1 |
| } |
| |
| # Same but piped into stdin. |
| |
| "$patch_tool" changed-lines - < "$MY_INPUT_FILE" > "$MY_OUTPUT_FILE" |
| |
| status="$?" |
| [[ $status == 0 ]] || { |
| "Expected exit code 0, but got $status" |
| exit 1 |
| } |
| |
| diff -u "$MY_EXPECT_FILE" "$MY_OUTPUT_FILE" || { |
| exit 1 |
| } |
| |
| ################################################################################ |
| # Test changed-lines: reading a malformed patch file. |
| |
| cat > "$MY_INPUT_FILE" <<EOF |
| --- /path/to/file1.txt 2017-01-01 |
| +++ /path/to/file1.txt 2017-01-01 |
| @@ -1,1 +1,1 @@ |
| EOF |
| |
| "$patch_tool" changed-lines "$MY_INPUT_FILE" > /dev/null |
| |
| status="$?" |
| [[ $status == 1 ]] || { |
| "Expected exit code 1, but got $status" |
| exit 1 |
| } |
| |
| ################################################################################ |
| # Test changed-lines: reading a nonexistent patch file. |
| |
| "$patch_tool" changed-lines "$MY_INPUT_FILE.does.not.exist" > /dev/null |
| |
| status="$?" |
| [[ $status == 1 ]] || { |
| "Expected exit code 1, but got $status" |
| exit 1 |
| } |
| |
| ################################################################################ |
| # Test stdin-test noninteractively. |
| |
| cat > "$MY_INPUT_FILE" <<EOF |
| Lovely file! |
| EOF |
| |
| "$patch_tool" stdin-test < "$MY_INPUT_FILE" > "$MY_OUTPUT_FILE" |
| |
| status="$?" |
| [[ $status == 0 ]] || { |
| "Expected exit code 0, but got $status" |
| exit 1 |
| } |
| |
| grep -q "Lovely file" "$MY_OUTPUT_FILE" || { |
| echo "Expected \"Lovely file\" in $MY_OUTPUT_FILE but didn't find it. Got:" |
| cat "$MY_OUTPUT_FILE" |
| exit 1 |
| } |
| |
| ################################################################################ |
| # Test cat-test noninteractively. |
| |
| cat > "$MY_INPUT_FILE".1 <<EOF |
| 111111 |
| EOF |
| |
| cat > "$MY_INPUT_FILE".2 <<EOF |
| 222222 |
| EOF |
| |
| "$patch_tool" cat-test "$MY_INPUT_FILE".1 > "$MY_OUTPUT_FILE" |
| |
| status="$?" |
| [[ $status == 0 ]] || { |
| "Expected exit code 0, but got $status" |
| exit 1 |
| } |
| |
| grep -q "111111" "$MY_OUTPUT_FILE" || { |
| echo "Expected \"111111\" in $MY_OUTPUT_FILE but didn't find it. Got:" |
| cat "$MY_OUTPUT_FILE" |
| exit 1 |
| } |
| |
| # Test single redirection |
| "$patch_tool" cat-test - < "$MY_INPUT_FILE".1 > "$MY_OUTPUT_FILE" |
| |
| status="$?" |
| [[ $status == 0 ]] || { |
| "Expected exit code 0, but got $status" |
| exit 1 |
| } |
| |
| grep -q "111111" "$MY_OUTPUT_FILE" || { |
| echo "Expected \"111111\" in $MY_OUTPUT_FILE but didn't find it. Got:" |
| cat "$MY_OUTPUT_FILE" |
| exit 1 |
| } |
| |
| # Test single redirection with one other file |
| "$patch_tool" cat-test - "$MY_INPUT_FILE".2 < "$MY_INPUT_FILE".1 > "$MY_OUTPUT_FILE" |
| |
| status="$?" |
| [[ $status == 0 ]] || { |
| "Expected exit code 0, but got $status" |
| exit 1 |
| } |
| |
| grep -q "111111" "$MY_OUTPUT_FILE" || { |
| echo "Expected \"111111\" in $MY_OUTPUT_FILE but didn't find it. Got:" |
| cat "$MY_OUTPUT_FILE" |
| exit 1 |
| } |
| |
| grep -q "222222" "$MY_OUTPUT_FILE" || { |
| echo "Expected \"222222\" in $MY_OUTPUT_FILE but didn't find it. Got:" |
| cat "$MY_OUTPUT_FILE" |
| exit 1 |
| } |
| |
| # Test single redirection with one other file, different order |
| "$patch_tool" cat-test "$MY_INPUT_FILE".2 - < "$MY_INPUT_FILE".1 > "$MY_OUTPUT_FILE" |
| |
| status="$?" |
| [[ $status == 0 ]] || { |
| "Expected exit code 0, but got $status" |
| exit 1 |
| } |
| |
| grep -q "111111" "$MY_OUTPUT_FILE" || { |
| echo "Expected \"111111\" in $MY_OUTPUT_FILE but didn't find it. Got:" |
| cat "$MY_OUTPUT_FILE" |
| exit 1 |
| } |
| |
| grep -q "222222" "$MY_OUTPUT_FILE" || { |
| echo "Expected \"222222\" in $MY_OUTPUT_FILE but didn't find it. Got:" |
| cat "$MY_OUTPUT_FILE" |
| exit 1 |
| } |
| |
| rm -f "$MY_INPUT_FILE".{1,2} |
| |
| ################################################################################ |
| # Test apply-pick: missing patchfile argument |
| |
| "$patch_tool" apply-pick > "$MY_OUTPUT_FILE" 2>&1 |
| |
| status="$?" |
| [[ $status == 1 ]] || { |
| "Expected exit code 1, but got $status" |
| exit 1 |
| } |
| |
| grep -q "Missing patchfile argument" "$MY_OUTPUT_FILE" || { |
| echo "Expected \"Missing patchfile argument\" in $MY_OUTPUT_FILE but didn't find it. Got:" |
| cat "$MY_OUTPUT_FILE" |
| exit 1 |
| } |
| |
| ################################################################################ |
| # Test apply-pick: nonexistent patchfile |
| |
| "$patch_tool" apply-pick "$MY_INPUT_FILE.does.not.exist" > /dev/null |
| |
| status="$?" |
| [[ $status == 1 ]] || { |
| "Expected exit code 1, but got $status" |
| exit 1 |
| } |
| |
| ################################################################################ |
| # Test apply-pick: reading a malformed patch file. |
| |
| cat > "$MY_INPUT_FILE" <<EOF |
| --- /path/to/file1.txt 2017-01-01 |
| +++ /path/to/file1.txt 2017-01-01 |
| @@ -1,1 +1,1 @@ |
| EOF |
| |
| "$patch_tool" apply-pick "$MY_INPUT_FILE" > /dev/null |
| |
| status="$?" |
| [[ $status == 1 ]] || { |
| "Expected exit code 1, but got $status" |
| exit 1 |
| } |
| |
| ################################################################################ |
| # Test apply-pick: various declining/accepting of patch hunks |
| |
| # 1. generate patch from two files |
| |
| # Let the 'original' file be write-able for in-place modification. |
| cat > "$MY_INPUT_FILE".orig <<EOF |
| a |
| b |
| c |
| d |
| e |
| f |
| g |
| h |
| EOF |
| |
| cp "$MY_INPUT_FILE".orig "$MY_INPUT_FILE".bkp |
| chmod -w "$MY_INPUT_FILE".bkp |
| |
| # Delete two lines 'b' and 'g'. |
| cat > "$MY_INPUT_FILE".proposed <<EOF |
| a |
| c |
| d |
| e |
| f |
| h |
| EOF |
| chmod -w "$MY_INPUT_FILE".proposed |
| |
| # Use only 1 line of context to prevent hunks from merging. |
| # Expect two hunks in this patch. |
| diff -U 1 "$MY_INPUT_FILE".orig "$MY_INPUT_FILE".proposed > "$MY_INPUT_FILE".patch |
| chmod -w "$MY_INPUT_FILE".patch |
| |
| # 2. Run apply-pick. |
| # Pass patchfile via file. |
| |
| # User declines all hunks. |
| cat > "$MY_INPUT_FILE".user-input <<EOF |
| n |
| n |
| EOF |
| |
| "$patch_tool" apply-pick "$MY_INPUT_FILE".patch < "$MY_INPUT_FILE".user-input > /dev/null |
| |
| status="$?" |
| [[ $status == 0 ]] || { |
| "Expected exit code 0, but got $status" |
| exit 1 |
| } |
| |
| diff -u "$MY_INPUT_FILE".bkp "$MY_INPUT_FILE".orig || { |
| echo "Expected these files to match, but got the above diff." |
| exit 1 |
| } |
| |
| # 2a.1 Pass patchfile via stdin redirection. |
| # This doesn't work yet. |
| if false |
| then |
| ( "$patch_tool" apply-pick - < "$MY_INPUT_FILE".patch ) < "$MY_INPUT_FILE".user-input > /dev/null |
| |
| status="$?" |
| [[ $status == 0 ]] || { |
| "Expected exit code 0, but got $status" |
| exit 1 |
| } |
| |
| diff -u "$MY_INPUT_FILE".bkp "$MY_INPUT_FILE".orig || { |
| echo "Expected these files to match, but got the above diff." |
| exit 1 |
| } |
| fi |
| |
| # 2b. User accepts only the first hunk |
| cat > "$MY_INPUT_FILE".user-input <<EOF |
| y |
| n |
| EOF |
| |
| "$patch_tool" apply-pick "$MY_INPUT_FILE".patch < "$MY_INPUT_FILE".user-input > /dev/null |
| |
| status="$?" |
| [[ $status == 0 ]] || { |
| "Expected exit code 0, but got $status" |
| exit 1 |
| } |
| |
| # Expect only 'b' to be deleted. |
| cat > "$MY_EXPECT_FILE" <<EOF |
| a |
| c |
| d |
| e |
| f |
| g |
| h |
| EOF |
| |
| # Expect original file to have been modified in-place. |
| diff -u "$MY_EXPECT_FILE" "$MY_INPUT_FILE".orig || { |
| echo "Expected these files to match, but got the above diff." |
| exit 1 |
| } |
| |
| # Restore the original file for the next test. |
| cp "$MY_INPUT_FILE".bkp "$MY_INPUT_FILE".orig |
| chmod u+w "$MY_INPUT_FILE".orig |
| |
| # 2c. User accepts only the second hunk |
| cat > "$MY_INPUT_FILE".user-input <<EOF |
| n |
| y |
| EOF |
| |
| "$patch_tool" apply-pick "$MY_INPUT_FILE".patch < "$MY_INPUT_FILE".user-input > /dev/null |
| |
| status="$?" |
| [[ $status == 0 ]] || { |
| "Expected exit code 0, but got $status" |
| exit 1 |
| } |
| |
| # Expect only 'g' to be deleted. |
| cat > "$MY_EXPECT_FILE" <<EOF |
| a |
| b |
| c |
| d |
| e |
| f |
| h |
| EOF |
| |
| # Expect original file to have been modified in-place. |
| diff -u "$MY_EXPECT_FILE" "$MY_INPUT_FILE".orig || { |
| echo "Expected these files to match, but got the above diff." |
| exit 1 |
| } |
| |
| # Restore the original file for the next test. |
| cp "$MY_INPUT_FILE".bkp "$MY_INPUT_FILE".orig |
| chmod u+w "$MY_INPUT_FILE".orig |
| |
| # 2d. User accepts both hunks. |
| cat > "$MY_INPUT_FILE".user-input <<EOF |
| y |
| y |
| EOF |
| |
| "$patch_tool" apply-pick "$MY_INPUT_FILE".patch < "$MY_INPUT_FILE".user-input > /dev/null |
| |
| status="$?" |
| [[ $status == 0 ]] || { |
| "Expected exit code 0, but got $status" |
| exit 1 |
| } |
| |
| # Expect 'b' and 'g' to be deleted. |
| cat > "$MY_EXPECT_FILE" <<EOF |
| a |
| c |
| d |
| e |
| f |
| h |
| EOF |
| |
| # Expect original file to have been modified in-place. |
| diff -u "$MY_EXPECT_FILE" "$MY_INPUT_FILE".orig || { |
| echo "Expected these files to match, but got the above diff." |
| exit 1 |
| } |
| |
| # Restore the original file for the next test. |
| cp "$MY_INPUT_FILE".bkp "$MY_INPUT_FILE".orig |
| chmod u+w "$MY_INPUT_FILE".orig |
| |
| ################################################################################ |
| echo "PASS" |