diff --git a/NetworkManager/lib/ts_setup b/NetworkManager/lib/ts_setup old mode 100755 new mode 100644 diff --git a/NetworkManager/lib/ts_teardown b/NetworkManager/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/NetworkManager/tsuite b/NetworkManager/tsuite old mode 100755 new mode 100644 diff --git a/ant-condition-fail-build.sh b/ant-condition-fail-build.sh index c4ad44ff073418aca8ac86503b2bf6494f6fc485..08854355986f0bd57632240b7da1f80fa5a158a6 100644 --- a/ant-condition-fail-build.sh +++ b/ant-condition-fail-build.sh @@ -1,84 +1,84 @@ -#!/bin/bash -############################################################################### -# @用例ID: 20260405-232654-173528830 -# @用例名称: ant-condition-fail-build -# @用例级别: 3 -# @用例标签: ant -# @扩展属性: -# @用例类型: 功能测试 -# @自动化: 1 -# @超时时间: 0 -# @用例描述: 验证 ant 构建脚本中的 fail 条件触发后命令返回失败 -############################################################################### -if [ -z "$TST_TS_TOPDIR" ]; then - TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" - while [ "$TST_TS_TOPDIR" != "/" ]; do - [ -f "${TST_TS_TOPDIR}/tsuite" ] && break - TST_TS_TOPDIR="$(dirname "$TST_TS_TOPDIR")" - done - export TST_TS_TOPDIR -fi -source "${TST_TS_TOPDIR}/common/lib/common.sh" || exit 1 -############################################################################### - -g_tmpdir="$(mktemp -d)" -g_buildfile="$g_tmpdir/build.xml" -g_marker_file="$g_tmpdir/should_not_exist.txt" - -tc_setup() { - msg "this is tc_setup" - - # @预置条件: 安装软件包 - msg "CHECK: 安装 ant 软件包的命令即将执行, 实际值=ant" - assert_true yum install -y ant - - # @预置条件: 创建包含条件 fail 逻辑的 Ant 构建文件 - cat > "$g_buildfile" < - - - - - - unexpected success - - -EOF - - return 0 -} - -do_test() { - msg "this is do_test" - - # @测试步骤: 执行包含 fail 条件的 verify 目标 - # @预期结果: ant 命令执行失败,退出码非 0 - ant -f "$g_buildfile" verify > "$g_tmpdir/ant.out" 2>&1 - ret=$? - msg "CHECK: 执行 ant verify 的退出码, 实际值=$ret" - assert_false [ $ret -eq 0 ] - - # @测试步骤: 检查 fail 触发后后续 echo 是否未执行 - # @预期结果: 标记文件不存在 - msg "CHECK: 标记文件是否不存在, 实际值=$([ -f "$g_marker_file" ] && echo 存在 || echo 不存在)" - assert_true test ! -f "$g_marker_file" - - # @测试步骤: 检查输出中不应出现 BUILD SUCCESSFUL - # @预期结果: 输出不包含 BUILD SUCCESSFUL - grep -q -i "BUILD SUCCESSFUL" "$g_tmpdir/ant.out" - ret=$? - msg "CHECK: ant 输出不应包含 BUILD SUCCESSFUL, 实际值=$ret" - assert_true [ $ret -ne 0 ] - - return 0 -} - -tc_teardown() { - msg "this is tc_teardown" - rm -rfv "$g_tmpdir" || return 1 - return 0 -} - -############################################################################### -tst_main "$@" -############################################################################### +#!/bin/bash +############################################################################### +# @用例ID: 20260405-232654-173528830 +# @用例名称: ant-condition-fail-build +# @用例级别: 3 +# @用例标签: ant +# @扩展属性: +# @用例类型: 功能测试 +# @自动化: 1 +# @超时时间: 0 +# @用例描述: 验证 ant 构建脚本中的 fail 条件触发后命令返回失败 +############################################################################### +if [ -z "$TST_TS_TOPDIR" ]; then + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + while [ "$TST_TS_TOPDIR" != "/" ]; do + [ -f "${TST_TS_TOPDIR}/tsuite" ] && break + TST_TS_TOPDIR="$(dirname "$TST_TS_TOPDIR")" + done + export TST_TS_TOPDIR +fi +source "${TST_TS_TOPDIR}/common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" +g_buildfile="$g_tmpdir/build.xml" +g_marker_file="$g_tmpdir/should_not_exist.txt" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 安装软件包 + msg "CHECK: 安装 ant 软件包的命令即将执行, 实际值=ant" + assert_true yum install -y ant + + # @预置条件: 创建包含条件 fail 逻辑的 Ant 构建文件 + cat > "$g_buildfile" < + + + + + + unexpected success + + +EOF + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤: 执行包含 fail 条件的 verify 目标 + # @预期结果: ant 命令执行失败,退出码非 0 + ant -f "$g_buildfile" verify > "$g_tmpdir/ant.out" 2>&1 + ret=$? + msg "CHECK: 执行 ant verify 的退出码, 实际值=$ret" + assert_false [ $ret -eq 0 ] + + # @测试步骤: 检查 fail 触发后后续 echo 是否未执行 + # @预期结果: 标记文件不存在 + msg "CHECK: 标记文件是否不存在, 实际值=$([ -f "$g_marker_file" ] && echo 存在 || echo 不存在)" + assert_true test ! -f "$g_marker_file" + + # @测试步骤: 检查输出中不应出现 BUILD SUCCESSFUL + # @预期结果: 输出不包含 BUILD SUCCESSFUL + grep -q -i "BUILD SUCCESSFUL" "$g_tmpdir/ant.out" + ret=$? + msg "CHECK: ant 输出不应包含 BUILD SUCCESSFUL, 实际值=$ret" + assert_true [ $ret -ne 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git a/bash/lib/ts_setup b/bash/lib/ts_setup old mode 100755 new mode 100644 diff --git a/bash/lib/ts_teardown b/bash/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/bash/tsuite b/bash/tsuite old mode 100755 new mode 100644 diff --git a/bind/lib/ts_setup b/bind/lib/ts_setup old mode 100755 new mode 100644 diff --git a/bind/lib/ts_teardown b/bind/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/bind/tsuite b/bind/tsuite old mode 100755 new mode 100644 diff --git a/binutils/lib/ts_setup b/binutils/lib/ts_setup old mode 100755 new mode 100644 diff --git a/binutils/lib/ts_teardown b/binutils/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/binutils/tsuite b/binutils/tsuite old mode 100755 new mode 100644 diff --git a/coreutils/lib/ts_setup b/coreutils/lib/ts_setup old mode 100755 new mode 100644 diff --git a/coreutils/lib/ts_teardown b/coreutils/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/coreutils/tsuite b/coreutils/tsuite old mode 100755 new mode 100644 diff --git a/curl/lib/ts_setup b/curl/lib/ts_setup old mode 100755 new mode 100644 diff --git a/curl/lib/ts_teardown b/curl/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/curl/testcase/curl-basic-http-get.sh b/curl/testcase/curl-basic-http-get.sh new file mode 100644 index 0000000000000000000000000000000000000000..11cb581ae976ace529308be019044666404d3577 --- /dev/null +++ b/curl/testcase/curl-basic-http-get.sh @@ -0,0 +1,90 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20260425-180001-000000001 +# @用例名称: curl-basic-http-get +# @用例级别: 3 +# @用例标签: curl,http,get +# @扩展属性: +# @用例类型: 功能测试 +# @自动化: 1 +# @超时时间: 0 +# @用例描述: 验证 curl 基本的 HTTP GET 请求功能,包括获取网页内容、返回码和输出保存 +############################################################################### +if [ -z "$TST_TS_TOPDIR" ]; then + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + while [ "$TST_TS_TOPDIR" != "/" ]; do + [ -f "${TST_TS_TOPDIR}/tsuite" ] && break + TST_TS_TOPDIR="$(dirname "$TST_TS_TOPDIR")" + done + export TST_TS_TOPDIR +fi +source "${TST_TS_TOPDIR}/common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" +g_output_file="$g_tmpdir/response.txt" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 安装 curl 软件包 + msg "CHECK: 安装 curl 软件包" + assert_true yum install -y curl + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤: 使用 curl 发起基本 HTTP GET 请求并保存响应 + # @预期结果: 命令执行成功,返回码为 0 + curl -s "http://httpbin.org/get" -o "$g_output_file" + ret=$? + msg "CHECK: curl GET 请求返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证下载的响应文件存在且非空 + # @预期结果: 文件存在且大小大于 0 + msg "CHECK: 响应文件是否存在且非空" + assert_true test -s "$g_output_file" + + # @测试步骤: 验证响应内容包含 JSON 格式的 url 字段 + # @预期结果: 响应内容包含 url 字段 + grep -q "\"url\"" "$g_output_file" + ret=$? + msg "CHECK: 响应包含 url 字段, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证响应内容包含请求的 URL + # @预期结果: 响应中包含 httpbin.org/get + grep -q "httpbin.org/get" "$g_output_file" + ret=$? + msg "CHECK: 响应包含请求 URL, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 curl 直接输出到 stdout 并检查返回码 + # @预期结果: 命令执行成功,返回码为 0 + curl -s "http://httpbin.org/get" > /dev/null + ret=$? + msg "CHECK: curl GET 请求输出到 stdout 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 curl -w 获取 HTTP 状态码 + # @预期结果: HTTP 状态码为 200 + http_code=$(curl -s -o /dev/null -w "%{http_code}" "http://httpbin.org/get") + msg "CHECK: HTTP 状态码, 实际值=$http_code" + assert_true [ "$http_code" = "200" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git a/curl/testcase/curl-cookie-handling.sh b/curl/testcase/curl-cookie-handling.sh new file mode 100644 index 0000000000000000000000000000000000000000..6624b2d4088254175b802b02a0849bdf64776094 --- /dev/null +++ b/curl/testcase/curl-cookie-handling.sh @@ -0,0 +1,108 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20260425-180008-000000008 +# @用例名称: curl-cookie-handling +# @用例级别: 3 +# @用例标签: curl,http,cookie,-b,-c +# @扩展属性: +# @用例类型: 功能测试 +# @自动化: 1 +# @超时时间: 0 +# @用例描述: 验证 curl Cookie 处理功能,包括 -c 保存 Cookie、-b 发送 Cookie 和 Cookie 持久化 +############################################################################### +if [ -z "$TST_TS_TOPDIR" ]; then + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + while [ "$TST_TS_TOPDIR" != "/" ]; do + [ -f "${TST_TS_TOPDIR}/tsuite" ] && break + TST_TS_TOPDIR="$(dirname "$TST_TS_TOPDIR")" + done + export TST_TS_TOPDIR +fi +source "${TST_TS_TOPDIR}/common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" +g_cookie_jar="$g_tmpdir/cookies.txt" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 安装 curl 软件包 + msg "CHECK: 安装 curl 软件包" + assert_true yum install -y curl + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤: 使用 -c 保存服务器返回的 Cookie 到文件 + # @预期结果: Cookie 文件创建成功且非空 + curl -s -c "$g_cookie_jar" "http://httpbin.org/cookies/set?testcookie=testvalue" -o /dev/null + ret=$? + msg "CHECK: curl -c 保存 Cookie 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + assert_true test -s "$g_cookie_jar" + + # @测试步骤: 验证 Cookie 文件包含设置的 Cookie + # @预期结果: Cookie 文件包含 testcookie + grep -q "testcookie" "$g_cookie_jar" + ret=$? + msg "CHECK: Cookie 文件包含 testcookie, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -b 从 Cookie 文件发送 Cookie + # @预期结果: 请求成功,服务器收到 Cookie + curl -s -b "$g_cookie_jar" "http://httpbin.org/cookies" -o "$g_tmpdir/cookie_response.txt" + ret=$? + msg "CHECK: curl -b 发送 Cookie 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证服务器收到了 Cookie + # @预期结果: 响应中包含 testcookie + grep -q "testcookie" "$g_tmpdir/cookie_response.txt" + ret=$? + msg "CHECK: 服务器收到 Cookie, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -b 直接指定 Cookie 字符串 + # @预期结果: 请求成功,服务器收到指定的 Cookie + curl -s -b "mycookie=myvalue" "http://httpbin.org/cookies" -o "$g_tmpdir/cookie_str_response.txt" + ret=$? + msg "CHECK: curl -b 字符串发送 Cookie 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证服务器收到了字符串指定的 Cookie + # @预期结果: 响应中包含 mycookie + grep -q "mycookie" "$g_tmpdir/cookie_str_response.txt" + ret=$? + msg "CHECK: 服务器收到字符串 Cookie, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 同时使用 -b 和 -c,发送并保存 Cookie + # @预期结果: Cookie 文件更新成功 + curl -s -b "$g_cookie_jar" -c "$g_cookie_jar" "http://httpbin.org/cookies/set?newcookie=newvalue" -o /dev/null + ret=$? + msg "CHECK: curl -b -c 同时使用返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证 Cookie 文件包含新 Cookie + # @预期结果: Cookie 文件包含 newcookie + grep -q "newcookie" "$g_cookie_jar" + ret=$? + msg "CHECK: Cookie 文件包含新 Cookie, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git a/curl/testcase/curl-custom-headers.sh b/curl/testcase/curl-custom-headers.sh new file mode 100644 index 0000000000000000000000000000000000000000..2766ba2bd2cd5bc86d620e20877034cb5b9d7ed7 --- /dev/null +++ b/curl/testcase/curl-custom-headers.sh @@ -0,0 +1,111 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20260425-180004-000000004 +# @用例名称: curl-custom-headers +# @用例级别: 3 +# @用例标签: curl,http,headers,-H +# @扩展属性: +# @用例类型: 功能测试 +# @自动化: 1 +# @超时时间: 0 +# @用例描述: 验证 curl 自定义请求头功能,包括 -H 添加单个和多个自定义请求头 +############################################################################### +if [ -z "$TST_TS_TOPDIR" ]; then + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + while [ "$TST_TS_TOPDIR" != "/" ]; do + [ -f "${TST_TS_TOPDIR}/tsuite" ] && break + TST_TS_TOPDIR="$(dirname "$TST_TS_TOPDIR")" + done + export TST_TS_TOPDIR +fi +source "${TST_TS_TOPDIR}/common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 安装 curl 软件包 + msg "CHECK: 安装 curl 软件包" + assert_true yum install -y curl + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤: 使用 -H 添加单个自定义请求头 X-Custom-Header + # @预期结果: 请求成功,响应中包含自定义头信息 + curl -s -H "X-Custom-Header: TestValue" "http://httpbin.org/headers" -o "$g_tmpdir/headers1.txt" + ret=$? + msg "CHECK: curl -H 单个请求头返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证响应中包含自定义头 + # @预期结果: 响应中包含 X-Custom-Header 和 TestValue + grep -q "TestValue" "$g_tmpdir/headers1.txt" + ret=$? + msg "CHECK: 响应包含自定义头值, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用多个 -H 添加多个自定义请求头 + # @预期结果: 请求成功,响应中包含所有自定义头 + curl -s -H "X-First-Header: FirstValue" -H "X-Second-Header: SecondValue" "http://httpbin.org/headers" -o "$g_tmpdir/headers2.txt" + ret=$? + msg "CHECK: curl 多个 -H 请求头返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证响应中包含第一个自定义头 + # @预期结果: 响应中包含 FirstValue + grep -q "FirstValue" "$g_tmpdir/headers2.txt" + ret=$? + msg "CHECK: 响应包含第一个自定义头值, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证响应中包含第二个自定义头 + # @预期结果: 响应中包含 SecondValue + grep -q "SecondValue" "$g_tmpdir/headers2.txt" + ret=$? + msg "CHECK: 响应包含第二个自定义头值, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -H 修改 Content-Type 请求头 + # @预期结果: 请求成功,Content-Type 被修改 + curl -s -H "Content-Type: application/json" "http://httpbin.org/headers" -o "$g_tmpdir/headers3.txt" + ret=$? + msg "CHECK: curl -H 修改 Content-Type 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证响应中包含修改后的 Content-Type + # @预期结果: 响应中包含 application/json + grep -q "application/json" "$g_tmpdir/headers3.txt" + ret=$? + msg "CHECK: 响应包含修改后的 Content-Type, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -H 添加 Accept 请求头 + # @预期结果: 请求成功,响应中包含 Accept 头 + curl -s -H "Accept: text/html" "http://httpbin.org/headers" -o "$g_tmpdir/headers4.txt" + ret=$? + msg "CHECK: curl -H Accept 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + grep -q "text/html" "$g_tmpdir/headers4.txt" + ret=$? + msg "CHECK: 响应包含 Accept 头, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git a/curl/testcase/curl-download-file.sh b/curl/testcase/curl-download-file.sh new file mode 100644 index 0000000000000000000000000000000000000000..c671f2b554f6c19b978d16b8a15d1432ca918ecc --- /dev/null +++ b/curl/testcase/curl-download-file.sh @@ -0,0 +1,94 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20260425-180002-000000002 +# @用例名称: curl-download-file +# @用例级别: 3 +# @用例标签: curl,download,-O,-o +# @扩展属性: +# @用例类型: 功能测试 +# @自动化: 1 +# @超时时间: 0 +# @用例描述: 验证 curl 下载文件功能,包括 -o 指定文件名下载和 -O 保留远程文件名下载 +############################################################################### +if [ -z "$TST_TS_TOPDIR" ]; then + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + while [ "$TST_TS_TOPDIR" != "/" ]; do + [ -f "${TST_TS_TOPDIR}/tsuite" ] && break + TST_TS_TOPDIR="$(dirname "$TST_TS_TOPDIR")" + done + export TST_TS_TOPDIR +fi +source "${TST_TS_TOPDIR}/common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 安装 curl 软件包 + msg "CHECK: 安装 curl 软件包" + assert_true yum install -y curl + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤: 使用 -o 选项指定文件名下载文件 + # @预期结果: 文件下载成功,指定文件名的文件存在且非空 + curl -s -o "$g_tmpdir/custom_name.json" "http://httpbin.org/json" + ret=$? + msg "CHECK: curl -o 下载返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + assert_true test -s "$g_tmpdir/custom_name.json" + + # @测试步骤: 验证下载的 JSON 文件内容包含 slideshow 字段 + # @预期结果: 文件内容包含 slideshow 字段 + grep -q "slideshow" "$g_tmpdir/custom_name.json" + ret=$? + msg "CHECK: 下载文件包含 slideshow 字段, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -O 选项保留远程文件名下载 + # @预期结果: 文件下载成功,文件名为远程文件名 + cd "$g_tmpdir" + curl -s -O "http://httpbin.org/json" + ret=$? + msg "CHECK: curl -O 下载返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + assert_true test -s "$g_tmpdir/json" + + # @测试步骤: 使用 -o 下载二进制内容(如图片)并验证文件大小 + # @预期结果: 下载成功且文件非空 + curl -s -o "$g_tmpdir/image.png" "http://httpbin.org/image/png" + ret=$? + msg "CHECK: curl 下载 PNG 图片返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + assert_true test -s "$g_tmpdir/image.png" + + # @测试步骤: 验证下载的 PNG 文件大小大于 0 字节 + # @预期结果: 文件大小大于 100 字节(有效 PNG 图片) + file_size=$(stat -c%s "$g_tmpdir/image.png" 2>/dev/null || stat -f%z "$g_tmpdir/image.png" 2>/dev/null) + msg "CHECK: PNG 文件大小, 实际值=$file_size" + assert_true [ "$file_size" -gt 100 ] + + # @测试步骤: 使用 -w 获取下载的 HTTP 状态码 + # @预期结果: HTTP 状态码为 200 + http_code=$(curl -s -o /dev/null -w "%{http_code}" "http://httpbin.org/json") + msg "CHECK: 下载 HTTP 状态码, 实际值=$http_code" + assert_true [ "$http_code" = "200" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git a/curl/testcase/curl-follow-redirect.sh b/curl/testcase/curl-follow-redirect.sh new file mode 100644 index 0000000000000000000000000000000000000000..7bc927ea4c8a8489ce373651af6e464455377ecd --- /dev/null +++ b/curl/testcase/curl-follow-redirect.sh @@ -0,0 +1,96 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20260425-180005-000000005 +# @用例名称: curl-follow-redirect +# @用例级别: 3 +# @用例标签: curl,http,redirect,-L +# @扩展属性: +# @用例类型: 功能测试 +# @自动化: 1 +# @超时时间: 0 +# @用例描述: 验证 curl 跟随重定向功能,包括 -L 自动跟随重定向和不使用 -L 时的行为差异 +############################################################################### +if [ -z "$TST_TS_TOPDIR" ]; then + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + while [ "$TST_TS_TOPDIR" != "/" ]; do + [ -f "${TST_TS_TOPDIR}/tsuite" ] && break + TST_TS_TOPDIR="$(dirname "$TST_TS_TOPDIR")" + done + export TST_TS_TOPDIR +fi +source "${TST_TS_TOPDIR}/common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 安装 curl 软件包 + msg "CHECK: 安装 curl 软件包" + assert_true yum install -y curl + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤: 不使用 -L 访问重定向 URL,获取 HTTP 状态码 + # @预期结果: 返回 302 重定向状态码 + http_code=$(curl -s -o /dev/null -w "%{http_code}" "http://httpbin.org/redirect/2") + msg "CHECK: 不使用 -L 的 HTTP 状态码, 实际值=$http_code" + assert_true [ "$http_code" = "302" ] + + # @测试步骤: 使用 -L 跟随重定向访问同一 URL + # @预期结果: 返回 200 状态码,表示成功跟随重定向 + http_code=$(curl -s -L -o /dev/null -w "%{http_code}" "http://httpbin.org/redirect/2") + msg "CHECK: 使用 -L 的 HTTP 状态码, 实际值=$http_code" + assert_true [ "$http_code" = "200" ] + + # @测试步骤: 使用 -L 跟随重定向并保存响应内容 + # @预期结果: 响应文件非空且包含最终页面内容 + curl -s -L "http://httpbin.org/redirect/1" -o "$g_tmpdir/redirect_response.txt" + ret=$? + msg "CHECK: curl -L 跟随重定向返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + assert_true test -s "$g_tmpdir/redirect_response.txt" + + # @测试步骤: 验证跟随重定向后的响应包含最终页面内容 + # @预期结果: 响应中包含 url 字段(httpbin.org/get 的响应) + grep -q "\"url\"" "$g_tmpdir/redirect_response.txt" + ret=$? + msg "CHECK: 重定向响应包含 url 字段, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 --max-redirs 限制最大重定向次数 + # @预期结果: 限制重定向次数后请求成功或返回适当错误码 + curl -s -L --max-redirs 1 "http://httpbin.org/redirect/1" -o "$g_tmpdir/max_redirect.txt" + ret=$? + msg "CHECK: curl --max-redirs 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -L 访问绝对路径重定向 + # @预期结果: 跟随绝对路径重定向成功 + http_code=$(curl -s -L -o /dev/null -w "%{http_code}" "http://httpbin.org/absolute-redirect/1") + msg "CHECK: 绝对路径重定向 HTTP 状态码, 实际值=$http_code" + assert_true [ "$http_code" = "200" ] + + # @测试步骤: 使用 -L 访问相对路径重定向 + # @预期结果: 跟随相对路径重定向成功 + http_code=$(curl -s -L -o /dev/null -w "%{http_code}" "http://httpbin.org/relative-redirect/1") + msg "CHECK: 相对路径重定向 HTTP 状态码, 实际值=$http_code" + assert_true [ "$http_code" = "200" ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git a/curl/testcase/curl-form-upload.sh b/curl/testcase/curl-form-upload.sh new file mode 100644 index 0000000000000000000000000000000000000000..4fffde4c17453c17212d9b72b1269f17c164e45a --- /dev/null +++ b/curl/testcase/curl-form-upload.sh @@ -0,0 +1,118 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20260425-180012-000000012 +# @用例名称: curl-form-upload +# @用例级别: 3 +# @用例标签: curl,http,form,-F,upload +# @扩展属性: +# @用例类型: 功能测试 +# @自动化: 1 +# @超时时间: 0 +# @用例描述: 验证 curl 表单上传功能,包括 -F 提交表单数据和文件上传 +############################################################################### +if [ -z "$TST_TS_TOPDIR" ]; then + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + while [ "$TST_TS_TOPDIR" != "/" ]; do + [ -f "${TST_TS_TOPDIR}/tsuite" ] && break + TST_TS_TOPDIR="$(dirname "$TST_TS_TOPDIR")" + done + export TST_TS_TOPDIR +fi +source "${TST_TS_TOPDIR}/common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" +g_upload_file="$g_tmpdir/upload_test.txt" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 安装 curl 软件包 + msg "CHECK: 安装 curl 软件包" + assert_true yum install -y curl + + # @预置条件: 创建用于上传的测试文件 + echo "This is a test file for curl upload." > "$g_upload_file" + echo "Line 2 of test file." >> "$g_upload_file" + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤: 使用 -F 提交简单表单字段 + # @预期结果: 表单提交成功,响应中包含提交的数据 + curl -s -F "username=testuser" -F "email=test@example.com" "https://httpbin.org/post" -o "$g_tmpdir/form_response.txt" + ret=$? + msg "CHECK: curl -F 提交表单返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证响应中包含表单字段 + # @预期结果: 响应中包含 testuser + grep -q "testuser" "$g_tmpdir/form_response.txt" + ret=$? + msg "CHECK: 响应包含表单字段 username, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证响应中包含 email 字段 + # @预期结果: 响应中包含 test@example.com + grep -q "test@example.com" "$g_tmpdir/form_response.txt" + ret=$? + msg "CHECK: 响应包含表单字段 email, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -F 上传文件 + # @预期结果: 文件上传成功,返回码为 0 + curl -s -F "file=@$g_upload_file" "https://httpbin.org/post" -o "$g_tmpdir/upload_response.txt" + ret=$? + msg "CHECK: curl -F 上传文件返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证上传响应中包含文件内容 + # @预期结果: 响应中包含上传文件的内容 + grep -q "This is a test file" "$g_tmpdir/upload_response.txt" + ret=$? + msg "CHECK: 上传响应包含文件内容, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -F 指定文件类型上传,通过 --trace-ascii 捕获完整请求 + # @预期结果: 文件上传成功,请求中 Content-Type 被正确设置为 text/plain + curl -s --trace-ascii "$g_tmpdir/typed_upload_trace.txt" -F "file=@$g_upload_file;type=text/plain" "https://httpbin.org/post" -o "$g_tmpdir/typed_upload.txt" + ret=$? + msg "CHECK: curl -F 指定文件类型上传返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证请求中包含 text/plain 类型 + # @预期结果: trace 输出中包含 text/plain(curl 在 multipart part 中设置了该 Content-Type) + grep -q "text/plain" "$g_tmpdir/typed_upload_trace.txt" + ret=$? + msg "CHECK: 请求中包含 text/plain 类型, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 同时提交表单字段和文件 + # @预期结果: 请求成功,响应中包含字段和文件 + curl -s -F "description=test upload" -F "file=@$g_upload_file" "https://httpbin.org/post" -o "$g_tmpdir/mixed_response.txt" + ret=$? + msg "CHECK: curl -F 同时提交字段和文件返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证混合提交响应中包含描述字段 + # @预期结果: 响应中包含 test upload + grep -q "test upload" "$g_tmpdir/mixed_response.txt" + ret=$? + msg "CHECK: 混合提交响应包含描述字段, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git a/curl/testcase/curl-http-post-data.sh b/curl/testcase/curl-http-post-data.sh new file mode 100644 index 0000000000000000000000000000000000000000..c2d11f8bb94da293f8161e5c86289430d4582cd8 --- /dev/null +++ b/curl/testcase/curl-http-post-data.sh @@ -0,0 +1,112 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20260425-180003-000000003 +# @用例名称: curl-http-post-data +# @用例级别: 3 +# @用例标签: curl,http,post,-X,-d +# @扩展属性: +# @用例类型: 功能测试 +# @自动化: 1 +# @超时时间: 0 +# @用例描述: 验证 curl 发送 HTTP POST 请求功能,包括 -X POST 指定方法、-d 发送表单数据和 JSON 数据 +############################################################################### +if [ -z "$TST_TS_TOPDIR" ]; then + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + while [ "$TST_TS_TOPDIR" != "/" ]; do + [ -f "${TST_TS_TOPDIR}/tsuite" ] && break + TST_TS_TOPDIR="$(dirname "$TST_TS_TOPDIR")" + done + export TST_TS_TOPDIR +fi +source "${TST_TS_TOPDIR}/common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" +g_output_file="$g_tmpdir/response.txt" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 安装 curl 软件包 + msg "CHECK: 安装 curl 软件包" + assert_true yum install -y curl + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤: 使用 -X POST 发送 POST 请求 + # @预期结果: 请求成功,返回码为 0 + curl -s -X POST "https://httpbin.org/post" -o "$g_output_file" + ret=$? + msg "CHECK: curl POST 请求返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证响应来自 POST 端点 + # @预期结果: 响应 JSON 中 url 字段包含 /post 路径 + grep -q '/post' "$g_output_file" + ret=$? + msg "CHECK: 响应 url 包含 /post, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -d 发送表单数据 + # @预期结果: 表单数据成功发送,响应中包含提交的数据 + curl -s -X POST -d "name=testuser&age=25" "https://httpbin.org/post" -o "$g_tmpdir/form_response.txt" + ret=$? + msg "CHECK: curl -d 发送表单数据返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证表单数据在响应中 + # @预期结果: 响应中包含提交的 name 和 age 字段 + grep -q "testuser" "$g_tmpdir/form_response.txt" + ret=$? + msg "CHECK: 响应包含 name 字段值, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + grep -q "25" "$g_tmpdir/form_response.txt" + ret=$? + msg "CHECK: 响应包含 age 字段值, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -H Content-Type 发送 JSON 数据 + # @预期结果: JSON 数据成功发送,返回码为 0 + curl -s -X POST -H "Content-Type: application/json" -d '{"key":"value"}' "https://httpbin.org/post" -o "$g_tmpdir/json_response.txt" + ret=$? + msg "CHECK: curl 发送 JSON 数据返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证 JSON 数据在响应中 + # @预期结果: 响应中包含提交的 key 和 value + grep -q "\"key\"" "$g_tmpdir/json_response.txt" + ret=$? + msg "CHECK: 响应包含 JSON key 字段, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 --data-urlencode 发送 URL 编码数据 + # @预期结果: 编码数据成功发送,返回码为 0 + curl -s -X POST --data-urlencode "message=hello world" "https://httpbin.org/post" -o "$g_tmpdir/encode_response.txt" + ret=$? + msg "CHECK: curl --data-urlencode 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证编码数据在响应中 + # @预期结果: 响应中包含 hello world + grep -q "hello" "$g_tmpdir/encode_response.txt" + ret=$? + msg "CHECK: 响应包含编码数据, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git a/curl/testcase/curl-response-headers-only.sh b/curl/testcase/curl-response-headers-only.sh new file mode 100644 index 0000000000000000000000000000000000000000..9df2d23ddacda941d772fc98c005d100a0ae45b7 --- /dev/null +++ b/curl/testcase/curl-response-headers-only.sh @@ -0,0 +1,111 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20260425-180007-000000007 +# @用例名称: curl-response-headers-only +# @用例级别: 3 +# @用例标签: curl,http,headers,-I,HEAD +# @扩展属性: +# @用例类型: 功能测试 +# @自动化: 1 +# @超时时间: 0 +# @用例描述: 验证 curl 仅获取响应头功能,包括 -I 发送 HEAD 请求获取响应头信息 +############################################################################### +if [ -z "$TST_TS_TOPDIR" ]; then + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + while [ "$TST_TS_TOPDIR" != "/" ]; do + [ -f "${TST_TS_TOPDIR}/tsuite" ] && break + TST_TS_TOPDIR="$(dirname "$TST_TS_TOPDIR")" + done + export TST_TS_TOPDIR +fi +source "${TST_TS_TOPDIR}/common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 安装 curl 软件包 + msg "CHECK: 安装 curl 软件包" + assert_true yum install -y curl + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤: 使用 -I 选项发送 HEAD 请求获取响应头 + # @预期结果: 命令执行成功,返回码为 0 + curl -s -I "http://httpbin.org/get" -o "$g_tmpdir/headers.txt" + ret=$? + msg "CHECK: curl -I 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证响应头包含 HTTP 状态行 + # @预期结果: 响应头包含 HTTP/200 + grep -q "HTTP/" "$g_tmpdir/headers.txt" + ret=$? + msg "CHECK: 响应头包含 HTTP 状态行, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证响应头包含 Content-Type + # @预期结果: 响应头包含 Content-Type 字段 + grep -q "Content-Type" "$g_tmpdir/headers.txt" + ret=$? + msg "CHECK: 响应头包含 Content-Type, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证响应头包含 Date 字段 + # @预期结果: 响应头包含 Date 字段 + grep -q "Date" "$g_tmpdir/headers.txt" + ret=$? + msg "CHECK: 响应头包含 Date, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证 -I 响应不包含响应体内容 + # @预期结果: 响应头文件中不包含 JSON 数据字段 + grep -q "\"url\"" "$g_tmpdir/headers.txt" + ret=$? + msg "CHECK: -I 响应不包含响应体, 实际值=$ret" + assert_true [ $ret -ne 0 ] + + # @测试步骤: 使用 -I 获取不同资源类型的响应头 + # @预期结果: 不同资源返回不同的 Content-Type + curl -s -I "http://httpbin.org/image/png" -o "$g_tmpdir/img_headers.txt" + ret=$? + msg "CHECK: curl -I 获取图片响应头返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证图片资源的 Content-Type 为 image/png + # @预期结果: Content-Type 包含 image/png + grep -q "image/png" "$g_tmpdir/img_headers.txt" + ret=$? + msg "CHECK: 图片 Content-Type 为 image/png, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -I 获取 HTML 页面的响应头 + # @预期结果: HTML 页面返回正确的 Content-Type + curl -s -I "http://httpbin.org/html" -o "$g_tmpdir/html_headers.txt" + ret=$? + msg "CHECK: curl -I 获取 HTML 响应头返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + grep -q "text/html" "$g_tmpdir/html_headers.txt" + ret=$? + msg "CHECK: HTML Content-Type 为 text/html, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git a/curl/testcase/curl-silent-mode.sh b/curl/testcase/curl-silent-mode.sh new file mode 100644 index 0000000000000000000000000000000000000000..7f2742eeea59894dabbdc945c4c27ccb228c606a --- /dev/null +++ b/curl/testcase/curl-silent-mode.sh @@ -0,0 +1,105 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20260425-180010-000000010 +# @用例名称: curl-silent-mode +# @用例级别: 3 +# @用例标签: curl,silent,-s,-S +# @扩展属性: +# @用例类型: 功能测试 +# @自动化: 1 +# @超时时间: 0 +# @用例描述: 验证 curl 静默模式功能,包括 -s 静默模式和 -S 显示错误,以及进度条控制 +############################################################################### +if [ -z "$TST_TS_TOPDIR" ]; then + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + while [ "$TST_TS_TOPDIR" != "/" ]; do + [ -f "${TST_TS_TOPDIR}/tsuite" ] && break + TST_TS_TOPDIR="$(dirname "$TST_TS_TOPDIR")" + done + export TST_TS_TOPDIR +fi +source "${TST_TS_TOPDIR}/common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 安装 curl 软件包 + msg "CHECK: 安装 curl 软件包" + assert_true yum install -y curl + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤: 使用 -s 静默模式下载文件 + # @预期结果: 下载成功,无进度条输出到 stderr + curl -s "http://httpbin.org/get" -o "$g_tmpdir/silent_out.txt" 2> "$g_tmpdir/silent_err.txt" + ret=$? + msg "CHECK: curl -s 静默下载返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证 -s 模式下 stderr 无进度条输出 + # @预期结果: stderr 输出为空 + err_size=$(stat -c%s "$g_tmpdir/silent_err.txt" 2>/dev/null || stat -f%z "$g_tmpdir/silent_err.txt" 2>/dev/null) + msg "CHECK: -s 模式 stderr 大小, 实际值=$err_size" + assert_true [ "$err_size" -eq 0 ] + + # @测试步骤: 验证 -s 模式下响应文件非空 + # @预期结果: 响应文件存在且非空 + assert_true test -s "$g_tmpdir/silent_out.txt" + + # @测试步骤: 不使用 -s 下载文件,检查是否有进度条输出 + # @预期结果: 下载成功,stderr 包含进度信息 + curl "http://httpbin.org/get" -o "$g_tmpdir/normal_out.txt" 2> "$g_tmpdir/normal_err.txt" + ret=$? + msg "CHECK: curl 不使用 -s 下载返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证非静默模式下 stderr 有输出 + # @预期结果: stderr 输出非空 + assert_true test -s "$g_tmpdir/normal_err.txt" + + # @测试步骤: 使用 -sS 静默但显示错误 + # @预期结果: 正常请求成功,错误时仍显示错误信息 + curl -sS "http://httpbin.org/get" -o "$g_tmpdir/sS_out.txt" 2> "$g_tmpdir/sS_err.txt" + ret=$? + msg "CHECK: curl -sS 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证 -sS 模式下正常请求 stderr 无进度条 + # @预期结果: 正常请求时 stderr 为空 + err_size=$(stat -c%s "$g_tmpdir/sS_err.txt" 2>/dev/null || stat -f%z "$g_tmpdir/sS_err.txt" 2>/dev/null) + msg "CHECK: -sS 正常请求 stderr 大小, 实际值=$err_size" + assert_true [ "$err_size" -eq 0 ] + + # @测试步骤: 使用 -sS 访问不存在的 URL,验证错误信息显示 + # @预期结果: 请求失败,stderr 包含错误信息 + curl -sS "http://httpbin.org/status/404" -o /dev/null 2> "$g_tmpdir/sS_error.txt" + ret=$? + msg "CHECK: curl -sS 访问 404 返回码, 实际值=$ret" + + # @测试步骤: 使用 --progress-bar 显示进度条 + # @预期结果: 下载成功 + curl -s --progress-bar "http://httpbin.org/get" -o "$g_tmpdir/progress_out.txt" 2> "$g_tmpdir/progress_err.txt" + ret=$? + msg "CHECK: curl --progress-bar 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + assert_true test -s "$g_tmpdir/progress_out.txt" + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git a/curl/testcase/curl-timeout-setting.sh b/curl/testcase/curl-timeout-setting.sh new file mode 100644 index 0000000000000000000000000000000000000000..479e30568db9b58196cad0d0d7bbee17008eb010 --- /dev/null +++ b/curl/testcase/curl-timeout-setting.sh @@ -0,0 +1,99 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20260425-180009-000000009 +# @用例名称: curl-timeout-setting +# @用例级别: 3 +# @用例标签: curl,timeout,--connect-timeout,-m +# @扩展属性: +# @用例类型: 功能测试 +# @自动化: 1 +# @超时时间: 0 +# @用例描述: 验证 curl 超时设置功能,包括 --connect-timeout 连接超时和 -m 最大传输时间 +############################################################################### +if [ -z "$TST_TS_TOPDIR" ]; then + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + while [ "$TST_TS_TOPDIR" != "/" ]; do + [ -f "${TST_TS_TOPDIR}/tsuite" ] && break + TST_TS_TOPDIR="$(dirname "$TST_TS_TOPDIR")" + done + export TST_TS_TOPDIR +fi +source "${TST_TS_TOPDIR}/common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 安装 curl 软件包 + msg "CHECK: 安装 curl 软件包" + assert_true yum install -y curl + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤: 使用 --connect-timeout 设置连接超时为 10 秒,访问正常 URL + # @预期结果: 在超时时间内连接成功,返回码为 0 + curl -s --connect-timeout 10 "https://httpbin.org/get" -o /dev/null + ret=$? + msg "CHECK: --connect-timeout 10 访问正常 URL 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -m 设置极短最大传输时间(2秒),访问延迟 URL + # @预期结果: 传输超时,返回码非 0(-m 限制整个操作时间,包括传输) + curl -s -m 2 "http://httpbin.org/delay/5" -o /dev/null + ret=$? + msg "CHECK: -m 2 访问延迟 URL 返回码, 实际值=$ret" + assert_true [ $ret -ne 0 ] + + # @测试步骤: 使用 -m 设置最大传输时间为 10 秒,访问正常 URL + # @预期结果: 在最大时间内完成,返回码为 0 + curl -s -m 10 "https://httpbin.org/get" -o /dev/null + ret=$? + msg "CHECK: -m 10 访问正常 URL 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -m 设置极短最大传输时间(1秒),访问延迟 URL + # @预期结果: 传输超时,返回码非 0 + curl -s -m 1 "http://httpbin.org/delay/5" -o /dev/null + ret=$? + msg "CHECK: -m 1 访问延迟 URL 返回码, 实际值=$ret" + assert_true [ $ret -ne 0 ] + + # @测试步骤: 同时设置 --connect-timeout 和 -m,访问正常 URL + # @预期结果: 请求成功完成,返回码为 0 + curl -s --connect-timeout 5 -m 10 "https://httpbin.org/get" -o /dev/null + ret=$? + msg "CHECK: 同时设置超时访问正常 URL 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 --connect-timeout 访问不可达地址(较长超时) + # @预期结果: 连接超时,返回码非 0 + curl -s --connect-timeout 2 "http://192.0.2.1" -o /dev/null 2>&1 + ret=$? + msg "CHECK: --connect-timeout 2 访问不可达地址返回码, 实际值=$ret" + assert_true [ $ret -ne 0 ] + + # @测试步骤: 使用 --max-time 访问延迟 2 秒的 URL,设置超时 5 秒 + # @预期结果: 在超时前完成,返回码为 0 + curl -s --max-time 5 "https://httpbin.org/delay/2" -o /dev/null + ret=$? + msg "CHECK: --max-time 5 访问 delay/2 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git a/curl/testcase/curl-user-agent.sh b/curl/testcase/curl-user-agent.sh new file mode 100644 index 0000000000000000000000000000000000000000..d3b6669725bf54b89c53b72aa01bd5ce63059671 --- /dev/null +++ b/curl/testcase/curl-user-agent.sh @@ -0,0 +1,113 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20260425-180011-000000011 +# @用例名称: curl-user-agent +# @用例级别: 3 +# @用例标签: curl,http,user-agent,-A +# @扩展属性: +# @用例类型: 功能测试 +# @自动化: 1 +# @超时时间: 0 +# @用例描述: 验证 curl 自定义 User-Agent 功能,包括 -A 设置 User-Agent 和默认 User-Agent +############################################################################### +if [ -z "$TST_TS_TOPDIR" ]; then + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + while [ "$TST_TS_TOPDIR" != "/" ]; do + [ -f "${TST_TS_TOPDIR}/tsuite" ] && break + TST_TS_TOPDIR="$(dirname "$TST_TS_TOPDIR")" + done + export TST_TS_TOPDIR +fi +source "${TST_TS_TOPDIR}/common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 安装 curl 软件包 + msg "CHECK: 安装 curl 软件包" + assert_true yum install -y curl + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤: 不设置 User-Agent 发送请求,查看默认值 + # @预期结果: 请求成功,响应中包含默认 curl User-Agent + curl -s "http://httpbin.org/user-agent" -o "$g_tmpdir/default_ua.txt" + ret=$? + msg "CHECK: curl 默认 User-Agent 请求返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证默认 User-Agent 包含 curl + # @预期结果: 响应中包含 curl 字样 + grep -q "curl" "$g_tmpdir/default_ua.txt" + ret=$? + msg "CHECK: 默认 User-Agent 包含 curl, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -A 设置自定义 User-Agent + # @预期结果: 请求成功,响应中显示自定义 User-Agent + curl -s -A "MyTestAgent/1.0" "http://httpbin.org/user-agent" -o "$g_tmpdir/custom_ua.txt" + ret=$? + msg "CHECK: curl -A 自定义 User-Agent 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证自定义 User-Agent 被正确设置 + # @预期结果: 响应中包含 MyTestAgent/1.0 + grep -q "MyTestAgent" "$g_tmpdir/custom_ua.txt" + ret=$? + msg "CHECK: 自定义 User-Agent 被设置, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -H 设置 User-Agent 头 + # @预期结果: 请求成功,响应中显示通过 -H 设置的 User-Agent + curl -s -H "User-Agent: HeaderAgent/2.0" "http://httpbin.org/user-agent" -o "$g_tmpdir/header_ua.txt" + ret=$? + msg "CHECK: curl -H 设置 User-Agent 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证 -H 设置的 User-Agent 被正确设置 + # @预期结果: 响应中包含 HeaderAgent/2.0 + grep -q "HeaderAgent" "$g_tmpdir/header_ua.txt" + ret=$? + msg "CHECK: -H 设置的 User-Agent 被设置, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -A 设置浏览器 User-Agent 模拟浏览器访问 + # @预期结果: 请求成功,响应中显示浏览器 User-Agent + curl -s -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" "http://httpbin.org/user-agent" -o "$g_tmpdir/browser_ua.txt" + ret=$? + msg "CHECK: curl -A 模拟浏览器返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证浏览器 User-Agent 被正确设置 + # @预期结果: 响应中包含 Mozilla + grep -q "Mozilla" "$g_tmpdir/browser_ua.txt" + ret=$? + msg "CHECK: 浏览器 User-Agent 被设置, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用空字符串 -A "" 清除 User-Agent + # @预期结果: 请求成功 + curl -s -A "" "http://httpbin.org/user-agent" -o "$g_tmpdir/empty_ua.txt" + ret=$? + msg "CHECK: curl -A 空字符串返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git a/curl/testcase/curl-verbose-output.sh b/curl/testcase/curl-verbose-output.sh new file mode 100644 index 0000000000000000000000000000000000000000..1cad37643b063338a0a6578e423b42f9c1453e78 --- /dev/null +++ b/curl/testcase/curl-verbose-output.sh @@ -0,0 +1,114 @@ +#!/bin/bash +############################################################################### +# @用例ID: 20260425-180006-000000006 +# @用例名称: curl-verbose-output +# @用例级别: 3 +# @用例标签: curl,verbose,-v,-i +# @扩展属性: +# @用例类型: 功能测试 +# @自动化: 1 +# @超时时间: 0 +# @用例描述: 验证 curl 详细输出模式功能,包括 -v 显示通信过程和 -i 显示响应头 +############################################################################### +if [ -z "$TST_TS_TOPDIR" ]; then + TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")" + while [ "$TST_TS_TOPDIR" != "/" ]; do + [ -f "${TST_TS_TOPDIR}/tsuite" ] && break + TST_TS_TOPDIR="$(dirname "$TST_TS_TOPDIR")" + done + export TST_TS_TOPDIR +fi +source "${TST_TS_TOPDIR}/common/lib/common.sh" || exit 1 +############################################################################### + +g_tmpdir="$(mktemp -d)" + +tc_setup() { + msg "this is tc_setup" + + # @预置条件: 安装 curl 软件包 + msg "CHECK: 安装 curl 软件包" + assert_true yum install -y curl + + return 0 +} + +do_test() { + msg "this is do_test" + + # @测试步骤: 使用 -v 选项显示详细通信过程 + # @预期结果: 输出包含请求和响应的详细信息 + curl -s -v "http://httpbin.org/get" > "$g_tmpdir/verbose.txt" 2>&1 + ret=$? + msg "CHECK: curl -v 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证 -v 输出包含请求头信息 + # @预期结果: 输出中包含 > GET 请求行 + grep -q "> GET" "$g_tmpdir/verbose.txt" + ret=$? + msg "CHECK: -v 输出包含请求行, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证 -v 输出包含响应头信息 + # @预期结果: 输出中包含 < 响应头标记 + grep -q "< " "$g_tmpdir/verbose.txt" + ret=$? + msg "CHECK: -v 输出包含响应头标记, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证 -v 输出包含 HTTP 响应状态行 + # @预期结果: 输出中包含 HTTP/ 状态行 + grep -q "HTTP/" "$g_tmpdir/verbose.txt" + ret=$? + msg "CHECK: -v 输出包含 HTTP 状态行, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 -i 选项在输出中包含响应头 + # @预期结果: 输出包含 HTTP 响应头和响应体 + curl -s -i "http://httpbin.org/get" -o "$g_tmpdir/with_headers.txt" + ret=$? + msg "CHECK: curl -i 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证 -i 输出包含 Content-Type 响应头 + # @预期结果: 输出中包含 Content-Type 头 + grep -q "Content-Type" "$g_tmpdir/with_headers.txt" + ret=$? + msg "CHECK: -i 输出包含 Content-Type, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 验证 -i 输出包含响应体内容 + # @预期结果: 输出中包含 url 字段(响应体内容) + grep -q "\"url\"" "$g_tmpdir/with_headers.txt" + ret=$? + msg "CHECK: -i 输出包含响应体, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + # @测试步骤: 使用 --trace 选项记录完整通信过程到文件 + # @预期结果: trace 文件创建成功且非空 + curl -s --trace "$g_tmpdir/trace.log" "http://httpbin.org/get" -o /dev/null + ret=$? + msg "CHECK: curl --trace 返回码, 实际值=$ret" + assert_true [ $ret -eq 0 ] + assert_true test -s "$g_tmpdir/trace.log" + + # @测试步骤: 验证 trace 日志包含通信记录 + # @预期结果: trace 文件包含发送和接收的数据记录 + grep -q "Recv" "$g_tmpdir/trace.log" + ret=$? + msg "CHECK: trace 日志包含接收记录, 实际值=$ret" + assert_true [ $ret -eq 0 ] + + return 0 +} + +tc_teardown() { + msg "this is tc_teardown" + rm -rfv "$g_tmpdir" || return 1 + return 0 +} + +############################################################################### +tst_main "$@" +############################################################################### diff --git a/curl/tsuite b/curl/tsuite old mode 100755 new mode 100644 diff --git a/dnf/lib/ts_setup b/dnf/lib/ts_setup old mode 100755 new mode 100644 diff --git a/dnf/lib/ts_teardown b/dnf/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/dnf/tsuite b/dnf/tsuite old mode 100755 new mode 100644 diff --git a/findutils/lib/ts_setup b/findutils/lib/ts_setup old mode 100755 new mode 100644 diff --git a/findutils/lib/ts_teardown b/findutils/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/findutils/tsuite b/findutils/tsuite old mode 100755 new mode 100644 diff --git a/gawk/lib/ts_setup b/gawk/lib/ts_setup old mode 100755 new mode 100644 diff --git a/gawk/lib/ts_teardown b/gawk/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/gawk/tsuite b/gawk/tsuite old mode 100755 new mode 100644 diff --git a/git/lib/ts_setup b/git/lib/ts_setup old mode 100755 new mode 100644 diff --git a/git/lib/ts_teardown b/git/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/git/tsuite b/git/tsuite old mode 100755 new mode 100644 diff --git a/grep/lib/ts_setup b/grep/lib/ts_setup old mode 100755 new mode 100644 diff --git a/grep/lib/ts_teardown b/grep/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/grep/tsuite b/grep/tsuite old mode 100755 new mode 100644 diff --git a/gzip/lib/ts_setup b/gzip/lib/ts_setup old mode 100755 new mode 100644 diff --git a/gzip/lib/ts_teardown b/gzip/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/gzip/tsuite b/gzip/tsuite old mode 100755 new mode 100644 diff --git a/iproute/lib/ts_setup b/iproute/lib/ts_setup old mode 100755 new mode 100644 diff --git a/iproute/lib/ts_teardown b/iproute/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/iproute/tsuite b/iproute/tsuite old mode 100755 new mode 100644 diff --git a/iputils/lib/ts_setup b/iputils/lib/ts_setup old mode 100755 new mode 100644 diff --git a/iputils/lib/ts_teardown b/iputils/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/iputils/tsuite b/iputils/tsuite old mode 100755 new mode 100644 diff --git a/make/lib/ts_setup b/make/lib/ts_setup old mode 100755 new mode 100644 diff --git a/make/lib/ts_teardown b/make/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/make/tsuite b/make/tsuite old mode 100755 new mode 100644 diff --git a/net-tools/lib/ts_setup b/net-tools/lib/ts_setup old mode 100755 new mode 100644 diff --git a/net-tools/lib/ts_teardown b/net-tools/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/net-tools/tsuite b/net-tools/tsuite old mode 100755 new mode 100644 diff --git a/nmap/lib/ts_setup b/nmap/lib/ts_setup old mode 100755 new mode 100644 diff --git a/nmap/lib/ts_teardown b/nmap/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/nmap/tsuite b/nmap/tsuite old mode 100755 new mode 100644 diff --git a/openssh/lib/ts_setup b/openssh/lib/ts_setup old mode 100755 new mode 100644 diff --git a/openssh/lib/ts_teardown b/openssh/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/openssh/tsuite b/openssh/tsuite old mode 100755 new mode 100644 diff --git a/openssl/lib/ts_setup b/openssl/lib/ts_setup old mode 100755 new mode 100644 diff --git a/openssl/lib/ts_teardown b/openssl/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/openssl/tsuite b/openssl/tsuite old mode 100755 new mode 100644 diff --git a/perl/lib/ts_setup b/perl/lib/ts_setup old mode 100755 new mode 100644 diff --git a/perl/lib/ts_teardown b/perl/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/perl/tsuite b/perl/tsuite old mode 100755 new mode 100644 diff --git a/procps-ng/lib/ts_setup b/procps-ng/lib/ts_setup old mode 100755 new mode 100644 diff --git a/procps-ng/lib/ts_teardown b/procps-ng/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/procps-ng/tsuite b/procps-ng/tsuite old mode 100755 new mode 100644 diff --git a/python3/lib/ts_setup b/python3/lib/ts_setup old mode 100755 new mode 100644 diff --git a/python3/lib/ts_teardown b/python3/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/python3/tsuite b/python3/tsuite old mode 100755 new mode 100644 diff --git a/rpm/lib/ts_setup b/rpm/lib/ts_setup old mode 100755 new mode 100644 diff --git a/rpm/lib/ts_teardown b/rpm/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/rpm/tsuite b/rpm/tsuite old mode 100755 new mode 100644 diff --git a/sed/lib/ts_setup b/sed/lib/ts_setup old mode 100755 new mode 100644 diff --git a/sed/lib/ts_teardown b/sed/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/sed/tsuite b/sed/tsuite old mode 100755 new mode 100644 diff --git a/systemd/lib/ts_setup b/systemd/lib/ts_setup old mode 100755 new mode 100644 diff --git a/systemd/lib/ts_teardown b/systemd/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/systemd/tsuite b/systemd/tsuite old mode 100755 new mode 100644 diff --git a/tar/lib/ts_setup b/tar/lib/ts_setup old mode 100755 new mode 100644 diff --git a/tar/lib/ts_teardown b/tar/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/tar/tsuite b/tar/tsuite old mode 100755 new mode 100644 diff --git a/tcpdump/lib/ts_setup b/tcpdump/lib/ts_setup old mode 100755 new mode 100644 diff --git a/tcpdump/lib/ts_teardown b/tcpdump/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/tcpdump/tsuite b/tcpdump/tsuite old mode 100755 new mode 100644 diff --git a/util-linux/lib/ts_setup b/util-linux/lib/ts_setup old mode 100755 new mode 100644 diff --git a/util-linux/lib/ts_teardown b/util-linux/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/util-linux/tsuite b/util-linux/tsuite old mode 100755 new mode 100644 diff --git a/wget/lib/ts_setup b/wget/lib/ts_setup old mode 100755 new mode 100644 diff --git a/wget/lib/ts_teardown b/wget/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/wget/tsuite b/wget/tsuite old mode 100755 new mode 100644 diff --git a/xz/lib/ts_setup b/xz/lib/ts_setup old mode 100755 new mode 100644 diff --git a/xz/lib/ts_teardown b/xz/lib/ts_teardown old mode 100755 new mode 100644 diff --git a/xz/tsuite b/xz/tsuite old mode 100755 new mode 100644