getpkg/getpkg/test.sh
Your Name ab9a5292aa
Some checks failed
Build-Test-Publish / build (push) Failing after 23s
'Generic Commit'
2025-06-17 20:59:06 +12:00

326 lines
12 KiB
Bash
Executable File

#!/bin/bash
# Don't use set -e because we want to continue even if tests fail
set -uo pipefail
PROJECT="getpkg"
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
GETPKG="${SCRIPT_DIR}/output/${PROJECT}"
TEST_DIR="${SCRIPT_DIR}/test_temp"
TEST_TOOL_NAME="test-tool-$RANDOM"
TEST_ARCH=$(uname -m | sed 's/x86_64/x86_64/;s/arm64/aarch64/;s/aarch64/aarch64/')
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Test counters
TESTS_PASSED=0
TESTS_FAILED=0
# Function to print test results
print_test_result() {
local test_name="$1"
local result="$2"
if [ "$result" -eq 0 ]; then
echo -e "${GREEN}${NC} $test_name"
((TESTS_PASSED++))
else
echo -e "${RED}${NC} $test_name"
((TESTS_FAILED++))
fi
}
# Function to cleanup test artifacts
cleanup() {
echo -e "\n${YELLOW}Cleaning up test artifacts...${NC}"
# Remove local test directories
rm -rf "$TEST_DIR"
rm -rf ~/.config/getpkg/"${TEST_TOOL_NAME}.json" 2>/dev/null || true
rm -rf ~/.local/bin/getpkg/"${TEST_TOOL_NAME}" 2>/dev/null || true
# Remove test tool from bashrc_getpkg if it exists
if [ -f ~/.bashrc_getpkg ]; then
sed -i "/${TEST_TOOL_NAME}/d" ~/.bashrc_getpkg 2>/dev/null || true
fi
# Clean up from getpkg.xyz if we have write access
if [ -n "${SOS_WRITE_TOKEN:-}" ]; then
echo "Attempting to clean up test objects from getpkg.xyz..."
# Get the hash of our test tool if it exists
HASH=$(curl -s "https://getpkg.xyz/hash/${TEST_TOOL_NAME}:${TEST_ARCH}" 2>/dev/null || echo "")
if [ -n "$HASH" ] && [ "$HASH" != "null" ] && [ "$HASH" != "Not found" ]; then
echo "Found test tool hash: $HASH"
# Delete the object
curl -s -H "Authorization: Bearer ${SOS_WRITE_TOKEN}" \
"https://getpkg.xyz/deleteobject?hash=${HASH}" >/dev/null 2>&1 || true
echo "Cleaned up test tool from getpkg.xyz"
fi
else
echo "Note: SOS_WRITE_TOKEN not set, cannot clean up remote test objects"
fi
}
# Set up trap to ensure cleanup runs
trap cleanup EXIT
# Create test directory
mkdir -p "$TEST_DIR"
echo -e "${YELLOW}Running getpkg tests...${NC}\n"
# Check if getpkg binary exists
if [ ! -f "$GETPKG" ]; then
echo -e "${RED}Error: getpkg binary not found at $GETPKG${NC}"
echo "Please run ./build.sh first to build getpkg"
exit 1
fi
if [ ! -x "$GETPKG" ]; then
echo -e "${RED}Error: getpkg binary is not executable${NC}"
exit 1
fi
echo "Using getpkg binary: $GETPKG"
# Test 1: Version command
echo "Test 1: Version command"
VERSION=$(timeout 3 "$GETPKG" version 2>&1) || VERSION=""
if [[ "$VERSION" =~ ^[0-9]{4}\.[0-9]{4}\.[0-9]{4}$ ]]; then
print_test_result "Version format (YYYY.MMDD.HHMM)" 0
else
print_test_result "Version format (YYYY.MMDD.HHMM)" 1
fi
# Test 2: Help command
echo -e "\nTest 2: Help command"
HELP_OUTPUT=$(timeout 3 "$GETPKG" help 2>&1) || HELP_OUTPUT=""
if [[ "$HELP_OUTPUT" =~ "Usage: getpkg" ]]; then
print_test_result "Help command output" 0
else
print_test_result "Help command output" 1
fi
# Test 3: Autocomplete command
echo -e "\nTest 3: Autocomplete command"
AUTOCOMPLETE_OUTPUT=$(timeout 3 "$GETPKG" autocomplete 2>&1) || AUTOCOMPLETE_OUTPUT=""
if [[ "$AUTOCOMPLETE_OUTPUT" =~ "install" ]] && [[ "$AUTOCOMPLETE_OUTPUT" =~ "publish" ]]; then
print_test_result "Autocomplete command output" 0
else
print_test_result "Autocomplete command output" 1
fi
# Test 4: Create command
echo -e "\nTest 4: Create command"
CREATE_DIR="${TEST_DIR}/${TEST_TOOL_NAME}"
timeout 3 "$GETPKG" create "$TEST_TOOL_NAME" "$CREATE_DIR" >/dev/null 2>&1 || true
if [ -d "$CREATE_DIR" ] && [ -f "$CREATE_DIR/setup_script.sh" ]; then
print_test_result "Create tool directory" 0
else
print_test_result "Create tool directory" 1
fi
# Test 5: Create test tool binary
echo -e "\nTest 5: Create test tool"
cat > "$CREATE_DIR/${TEST_TOOL_NAME}" << 'EOF'
#!/bin/bash
case "$1" in
version)
echo "1.0.0"
;;
autocomplete)
echo "subcommand1"
echo "subcommand2"
;;
*)
echo "Test tool - $1"
;;
esac
EOF
chmod +x "$CREATE_DIR/${TEST_TOOL_NAME}"
if [ -x "$CREATE_DIR/${TEST_TOOL_NAME}" ]; then
print_test_result "Create test tool binary" 0
else
print_test_result "Create test tool binary" 1
fi
# Test 5b: Test basic publish functionality
echo -e "\nTest 5b: Testing basic publish command"
# Test with a dummy token to see error message
DUMMY_OUTPUT=$(timeout 3 "$GETPKG" publish "dummy:x86_64" "$CREATE_DIR" 2>&1 <<< "") || true
echo "Dummy publish output: $DUMMY_OUTPUT"
# Test 6: Publish command (requires SOS_WRITE_TOKEN)
if [ -n "${SOS_WRITE_TOKEN:-}" ]; then
echo -e "\nTest 6: Publish command with ARCH"
echo "SOS_WRITE_TOKEN is set: ${#SOS_WRITE_TOKEN} characters"
echo "Publishing ${TEST_TOOL_NAME}:${TEST_ARCH} from $CREATE_DIR"
echo "Directory contents:"
ls -la "$CREATE_DIR"
echo "Running: $GETPKG publish ${TEST_TOOL_NAME}:${TEST_ARCH} $CREATE_DIR"
# Make sure the token is exported for the subprocess
export SOS_WRITE_TOKEN
# Run publish command and capture both stdout and stderr
PUBLISH_OUTPUT=$(timeout 3 "$GETPKG" publish "${TEST_TOOL_NAME}:${TEST_ARCH}" "$CREATE_DIR" 2>&1)
PUBLISH_EXIT_CODE=$?
echo "Publish exit code: $PUBLISH_EXIT_CODE"
echo "Publish output: $PUBLISH_OUTPUT"
# Check if the output indicates a crash or missing dependencies
if [ -z "$PUBLISH_OUTPUT" ] && [ $PUBLISH_EXIT_CODE -ne 0 ]; then
echo "Publish command failed with no output. Checking for missing dependencies..."
ldd "$GETPKG" 2>&1 | grep "not found" || echo "All dependencies found"
fi
if [[ "$PUBLISH_OUTPUT" =~ "Published!" ]] && [[ "$PUBLISH_OUTPUT" =~ "URL:" ]] && [[ "$PUBLISH_OUTPUT" =~ "Hash:" ]]; then
print_test_result "Publish tool with ARCH to getpkg.xyz" 0
# Extract hash for later cleanup
PUBLISHED_HASH=$(echo "$PUBLISH_OUTPUT" | grep "Hash:" | cut -d' ' -f2)
# Test 7: Check if published tool exists
echo -e "\nTest 7: Check published tool exists"
EXISTS_CHECK=$(curl -s "https://getpkg.xyz/exists/${TEST_TOOL_NAME}:${TEST_ARCH}" 2>/dev/null || echo "error")
if [[ "$EXISTS_CHECK" != "error" ]] && [[ "$EXISTS_CHECK" != "false" ]]; then
print_test_result "Published tool exists on server" 0
else
print_test_result "Published tool exists on server" 1
fi
# Test 8: Install command
echo -e "\nTest 8: Install command"
INSTALL_OUTPUT=$(timeout 3 "$GETPKG" install "$TEST_TOOL_NAME" 2>&1) || INSTALL_OUTPUT=""
if [[ "$INSTALL_OUTPUT" =~ "Installed ${TEST_TOOL_NAME} successfully" ]] || [[ "$INSTALL_OUTPUT" =~ "${TEST_TOOL_NAME} is already up to date" ]]; then
print_test_result "Install tool from getpkg.xyz" 0
# Test 9: Check installed files
echo -e "\nTest 9: Check installed files"
if [ -f ~/.config/getpkg/"${TEST_TOOL_NAME}.json" ] && [ -d ~/.local/bin/getpkg/"${TEST_TOOL_NAME}" ]; then
print_test_result "Tool files installed correctly" 0
else
print_test_result "Tool files installed correctly" 1
fi
# Test 10: Check bashrc_getpkg modifications
echo -e "\nTest 10: Check bashrc modifications"
if [ -f ~/.bashrc_getpkg ] && grep -q "${TEST_TOOL_NAME}" ~/.bashrc_getpkg; then
print_test_result "Bashrc modifications for PATH and autocomplete" 0
else
print_test_result "Bashrc modifications for PATH and autocomplete" 1
fi
# Test 11: Direct tool name install (shortcut syntax)
echo -e "\nTest 11: Direct tool install syntax"
# First remove the tool
rm -rf ~/.local/bin/getpkg/"${TEST_TOOL_NAME}"
rm -f ~/.config/getpkg/"${TEST_TOOL_NAME}.json"
DIRECT_INSTALL_OUTPUT=$(timeout 3 "$GETPKG" "$TEST_TOOL_NAME" 2>&1) || DIRECT_INSTALL_OUTPUT=""
if [[ "$DIRECT_INSTALL_OUTPUT" =~ "Installed ${TEST_TOOL_NAME} successfully" ]] || [[ "$DIRECT_INSTALL_OUTPUT" =~ "${TEST_TOOL_NAME} is already up to date" ]]; then
print_test_result "Direct tool name install syntax" 0
else
print_test_result "Direct tool name install syntax" 1
fi
# Test 12: Update already installed tool (should say up to date)
echo -e "\nTest 12: Update check for installed tool"
UPDATE_OUTPUT=$(timeout 3 "$GETPKG" install "$TEST_TOOL_NAME" 2>&1) || UPDATE_OUTPUT=""
if [[ "$UPDATE_OUTPUT" =~ "${TEST_TOOL_NAME} is already up to date" ]]; then
print_test_result "Update check recognizes up-to-date tool" 0
else
print_test_result "Update check recognizes up-to-date tool" 1
fi
else
print_test_result "Install tool from getpkg.xyz" 1
# Skip dependent tests
print_test_result "Tool files installed correctly" 1
print_test_result "Bashrc modifications for PATH and autocomplete" 1
print_test_result "Direct tool name install syntax" 1
print_test_result "Update check recognizes up-to-date tool" 1
fi
else
print_test_result "Publish tool with ARCH to getpkg.xyz" 1
# Skip dependent tests
print_test_result "Published tool exists on server" 1
print_test_result "Install tool from getpkg.xyz" 1
print_test_result "Tool files installed correctly" 1
print_test_result "Bashrc modifications for PATH and autocomplete" 1
print_test_result "Direct tool name install syntax" 1
print_test_result "Update check recognizes up-to-date tool" 1
fi
# Test 12b: Publish without ARCH (for cross-platform tools)
echo -e "\nTest 12b: Publish without ARCH"
TEST_TOOL_NOARCH="${TEST_TOOL_NAME}-noarch"
mkdir -p "${TEST_DIR}/${TEST_TOOL_NOARCH}"
cat > "${TEST_DIR}/${TEST_TOOL_NOARCH}/${TEST_TOOL_NOARCH}" << 'EOF'
#!/bin/bash
case "$1" in
version)
echo "1.0.0"
;;
*)
echo "Cross-platform test tool"
;;
esac
EOF
chmod +x "${TEST_DIR}/${TEST_TOOL_NOARCH}/${TEST_TOOL_NOARCH}"
PUBLISH_NOARCH_OUTPUT=$(timeout 3 "$GETPKG" publish "${TEST_TOOL_NOARCH}" "${TEST_DIR}/${TEST_TOOL_NOARCH}" 2>&1) || PUBLISH_NOARCH_OUTPUT=""
if [[ "$PUBLISH_NOARCH_OUTPUT" =~ "Published!" ]] && [[ "$PUBLISH_NOARCH_OUTPUT" =~ "URL:" ]] && [[ "$PUBLISH_NOARCH_OUTPUT" =~ "Hash:" ]]; then
print_test_result "Publish tool without ARCH" 0
# Clean up the noarch tool
NOARCH_HASH=$(curl -s "https://getpkg.xyz/hash/${TEST_TOOL_NOARCH}" 2>/dev/null || echo "")
if [ -n "$NOARCH_HASH" ] && [ "$NOARCH_HASH" != "null" ] && [ "$NOARCH_HASH" != "Not found" ]; then
curl -s -H "Authorization: Bearer ${SOS_WRITE_TOKEN}" \
"https://getpkg.xyz/deleteobject?hash=${NOARCH_HASH}" >/dev/null 2>&1 || true
fi
else
print_test_result "Publish tool without ARCH" 1
fi
else
echo -e "\n${YELLOW}Skipping publish/install tests (SOS_WRITE_TOKEN not set)${NC}"
echo "To run full tests, set SOS_WRITE_TOKEN environment variable"
fi
# Test 13: Invalid tool name validation
echo -e "\nTest 13: Invalid tool name validation"
INVALID_OUTPUT=$(timeout 3 "$GETPKG" install "../evil-tool" 2>&1) || INVALID_OUTPUT=""
if [[ "$INVALID_OUTPUT" =~ "Invalid tool name" ]]; then
print_test_result "Invalid tool name rejection" 0
else
print_test_result "Invalid tool name rejection" 1
fi
# Test 14: Update command (if we have tools installed)
if [ -d ~/.config/getpkg ] && [ "$(ls -A ~/.config/getpkg/*.json 2>/dev/null | wc -l)" -gt 0 ]; then
echo -e "\nTest 14: Update command"
UPDATE_ALL_OUTPUT=$(timeout 3 "$GETPKG" update 2>&1) || UPDATE_ALL_OUTPUT=""
if [[ "$UPDATE_ALL_OUTPUT" =~ "Update complete" ]]; then
print_test_result "Update all tools command" 0
else
print_test_result "Update all tools command" 1
fi
else
echo -e "\n${YELLOW}Skipping update all test (no tools installed)${NC}"
fi
# Print summary
echo -e "\n${YELLOW}Test Summary:${NC}"
echo -e "Tests passed: ${GREEN}${TESTS_PASSED}${NC}"
echo -e "Tests failed: ${RED}${TESTS_FAILED}${NC}"
if [ "$TESTS_FAILED" -eq 0 ]; then
echo -e "\n${GREEN}All tests passed!${NC}"
exit 0
else
echo -e "\n${RED}Some tests failed!${NC}"
exit 1
fi