Split BATS test suite across files for parallel execution
Some checks are pending
CodeQL / Analyze (pull_request) Waiting to run
Test Supported Distributions / smoke-tests (pull_request) Waiting to run
Test Supported Distributions / distro-test (alpine_3_21) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (alpine_3_22) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (alpine_3_23) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (centos_10) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (centos_9) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (debian_11) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (debian_12) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (debian_13) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (fedora_40) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (fedora_41) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (fedora_42) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (fedora_43) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (ubuntu_20) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (ubuntu_22) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (ubuntu_24) (pull_request) Blocked by required conditions
Some checks are pending
CodeQL / Analyze (pull_request) Waiting to run
Test Supported Distributions / smoke-tests (pull_request) Waiting to run
Test Supported Distributions / distro-test (alpine_3_21) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (alpine_3_22) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (alpine_3_23) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (centos_10) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (centos_9) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (debian_11) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (debian_12) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (debian_13) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (fedora_40) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (fedora_41) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (fedora_42) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (fedora_43) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (ubuntu_20) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (ubuntu_22) (pull_request) Blocked by required conditions
Test Supported Distributions / distro-test (ubuntu_24) (pull_request) Blocked by required conditions
test_automated_install.bats was a single 372-line file running 18 tests serially, which doubled wall-clock CI time compared to the old pytest suite (which used pytest-xdist -n auto for parallelism). Split into three focused files: - test_automated_install.bats — core installer: package manager detection, SELinux config check, fresh install, package cache update (success/failure), dependency installation, meta-package uninstall (7 tests) - test_ftl.bats — FTL architecture detection for all supported arches plus binary installation and version check (9 tests) - test_network.bats — IPv6 address detection (link-local/ULA/GUA precedence) and IP address validation (6 tests) Update run.sh to include the new files and to pass --jobs $(nproc) to BATS when GNU parallel is available, running all files concurrently. This restores the degree of parallelism previously provided by pytest-xdist and brings CI duration back in line with the old suite. Signed-off-by: Adam Warner <me@adamwarner.co.uk>
This commit is contained in:
11
test/run.sh
11
test/run.sh
@@ -75,10 +75,17 @@ BATS="${BATS:-libs/bats/bin/bats}"
|
||||
|
||||
export IMAGE_TAG DISTRO DISTRO_FAMILY
|
||||
|
||||
TEST_FILES=(test_automated_install.bats test_utils.bats)
|
||||
TEST_FILES=(
|
||||
test_automated_install.bats
|
||||
test_ftl.bats
|
||||
test_network.bats
|
||||
test_utils.bats
|
||||
)
|
||||
[[ "$DISTRO_FAMILY" == "rhel" ]] && TEST_FILES+=(test_selinux.bats)
|
||||
|
||||
# Use pretty output only when stdout is a real terminal; fall back to TAP in CI
|
||||
# Use pretty output only when stdout is a real terminal; fall back to TAP in CI.
|
||||
# Parallelise across files with --jobs when GNU parallel is available.
|
||||
BATS_FLAGS=()
|
||||
[[ -t 1 ]] && BATS_FLAGS+=("-p")
|
||||
command -v parallel > /dev/null 2>&1 && BATS_FLAGS+=("--jobs" "$(nproc)")
|
||||
"$BATS" "${BATS_FLAGS[@]}" "${TEST_FILES[@]}"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env bats
|
||||
# Tests for basic-install.sh — translated from test_any_automated_install.py
|
||||
# Core installer tests — package manager, cache, fresh install, dependencies
|
||||
|
||||
load 'libs/bats-support/load'
|
||||
load 'libs/bats-assert/load'
|
||||
@@ -156,189 +156,6 @@ teardown() {
|
||||
assert_output --partial "Error: Unable to update package cache."
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# FTL architecture detection — one @test per arch (replaces parametrize)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
_test_ftl_arch() {
|
||||
local arch="$1" detected_string="$2" supported="$3"
|
||||
|
||||
mock_command "$CID" uname "-m" "$arch" "0"
|
||||
mock_command_2 "$CID" readelf \
|
||||
"-A /bin/sh" "Tag_CPU_arch: ${arch}" "0" \
|
||||
"-A /usr/bin/sh" "Tag_CPU_arch: ${arch}" "0" \
|
||||
"-A /usr/sbin/sh" "Tag_CPU_arch: ${arch}" "0"
|
||||
docker exec "$CID" bash -c "echo '${FTL_BRANCH}' > /etc/pihole/ftlbranch"
|
||||
|
||||
run docker exec "$CID" bash -c "
|
||||
source /opt/pihole/basic-install.sh
|
||||
create_pihole_user
|
||||
funcOutput=\$(get_binary_name)
|
||||
binary=\"pihole-FTL\${funcOutput##*pihole-FTL}\"
|
||||
theRest=\"\${funcOutput%pihole-FTL*}\"
|
||||
FTLdetect \"\${binary}\" \"\${theRest}\"
|
||||
"
|
||||
|
||||
if [[ "$supported" == "true" ]]; then
|
||||
assert_output --partial "${INFO} FTL Checks..."
|
||||
assert_output --partial "${TICK} Detected ${detected_string} architecture"
|
||||
assert_output --partial "${TICK} Downloading and Installing FTL"
|
||||
else
|
||||
assert_output --partial "Not able to detect architecture (unknown: ${detected_string})"
|
||||
fi
|
||||
}
|
||||
|
||||
@test "FTL detects aarch64 architecture" {
|
||||
_test_ftl_arch "aarch64" "AArch64 (64 Bit ARM)" "true"
|
||||
}
|
||||
|
||||
@test "FTL detects ARMv6 architecture" {
|
||||
_test_ftl_arch "armv6" "ARMv6" "true"
|
||||
}
|
||||
|
||||
@test "FTL detects ARMv7l architecture" {
|
||||
_test_ftl_arch "armv7l" "ARMv7 (or newer)" "true"
|
||||
}
|
||||
|
||||
@test "FTL detects ARMv7 architecture" {
|
||||
_test_ftl_arch "armv7" "ARMv7 (or newer)" "true"
|
||||
}
|
||||
|
||||
@test "FTL detects ARMv8a architecture" {
|
||||
_test_ftl_arch "armv8a" "ARMv7 (or newer)" "true"
|
||||
}
|
||||
|
||||
@test "FTL detects x86_64 architecture" {
|
||||
_test_ftl_arch "x86_64" "x86_64" "true"
|
||||
}
|
||||
|
||||
@test "FTL detects riscv64 architecture" {
|
||||
_test_ftl_arch "riscv64" "riscv64" "true"
|
||||
}
|
||||
|
||||
@test "FTL reports unsupported architecture" {
|
||||
_test_ftl_arch "mips" "mips" "false"
|
||||
}
|
||||
|
||||
@test "FTL development binary is installed and responsive" {
|
||||
docker exec "$CID" bash -c "echo '${FTL_BRANCH}' > /etc/pihole/ftlbranch"
|
||||
docker exec "$CID" bash -c "
|
||||
source /opt/pihole/basic-install.sh
|
||||
create_pihole_user
|
||||
funcOutput=\$(get_binary_name)
|
||||
binary=\"pihole-FTL\${funcOutput##*pihole-FTL}\"
|
||||
theRest=\"\${funcOutput%pihole-FTL*}\"
|
||||
FTLdetect \"\${binary}\" \"\${theRest}\"
|
||||
"
|
||||
run docker exec "$CID" bash -c '
|
||||
VERSION=$(pihole-FTL version)
|
||||
echo "${VERSION:0:1}"
|
||||
'
|
||||
assert_output --partial "v"
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# IPv6 detection
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@test "IPv6 link-local only: blocking disabled" {
|
||||
mock_command_2 "$CID" ip \
|
||||
"-6 address" "inet6 fe80::d210:52fa:fe00:7ad7/64 scope link" "0"
|
||||
run docker exec "$CID" bash -c "
|
||||
source /opt/pihole/basic-install.sh
|
||||
find_IPv6_information
|
||||
"
|
||||
assert_output --partial "Unable to find IPv6 ULA/GUA address"
|
||||
}
|
||||
|
||||
@test "IPv6 ULA only: blocking enabled" {
|
||||
mock_command_2 "$CID" ip \
|
||||
"-6 address" "inet6 fda2:2001:5555:0:d210:52fa:fe00:7ad7/64 scope global" "0"
|
||||
run docker exec "$CID" bash -c "
|
||||
source /opt/pihole/basic-install.sh
|
||||
find_IPv6_information
|
||||
"
|
||||
assert_output --partial "Found IPv6 ULA address"
|
||||
}
|
||||
|
||||
@test "IPv6 GUA only: blocking enabled" {
|
||||
mock_command_2 "$CID" ip \
|
||||
"-6 address" "inet6 2003:12:1e43:301:d210:52fa:fe00:7ad7/64 scope global" "0"
|
||||
run docker exec "$CID" bash -c "
|
||||
source /opt/pihole/basic-install.sh
|
||||
find_IPv6_information
|
||||
"
|
||||
assert_output --partial "Found IPv6 GUA address"
|
||||
}
|
||||
|
||||
@test "IPv6 GUA + ULA: ULA takes precedence" {
|
||||
mock_command_2 "$CID" ip \
|
||||
"-6 address" "inet6 2003:12:1e43:301:d210:52fa:fe00:7ad7/64 scope global
|
||||
inet6 fda2:2001:5555:0:d210:52fa:fe00:7ad7/64 scope global" "0"
|
||||
run docker exec "$CID" bash -c "
|
||||
source /opt/pihole/basic-install.sh
|
||||
find_IPv6_information
|
||||
"
|
||||
assert_output --partial "Found IPv6 ULA address"
|
||||
}
|
||||
|
||||
@test "IPv6 ULA + GUA: ULA takes precedence" {
|
||||
mock_command_2 "$CID" ip \
|
||||
"-6 address" "inet6 fda2:2001:5555:0:d210:52fa:fe00:7ad7/64 scope global
|
||||
inet6 2003:12:1e43:301:d210:52fa:fe00:7ad7/64 scope global" "0"
|
||||
run docker exec "$CID" bash -c "
|
||||
source /opt/pihole/basic-install.sh
|
||||
find_IPv6_information
|
||||
"
|
||||
assert_output --partial "Found IPv6 ULA address"
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# IP address validation
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@test "valid_ip accepts and rejects addresses correctly" {
|
||||
_valid() {
|
||||
run docker exec "$CID" bash -c "source /opt/pihole/basic-install.sh; valid_ip '${1}'"
|
||||
assert_success
|
||||
}
|
||||
_invalid() {
|
||||
run docker exec "$CID" bash -c "source /opt/pihole/basic-install.sh; valid_ip '${1}'"
|
||||
assert_failure
|
||||
}
|
||||
|
||||
_valid "192.168.1.1"
|
||||
_valid "127.0.0.1"
|
||||
_valid "255.255.255.255"
|
||||
_invalid "255.255.255.256"
|
||||
_invalid "255.255.256.255"
|
||||
_invalid "255.256.255.255"
|
||||
_invalid "256.255.255.255"
|
||||
_invalid "1092.168.1.1"
|
||||
_invalid "not an IP"
|
||||
_invalid "8.8.8.8#"
|
||||
_valid "8.8.8.8#0"
|
||||
_valid "8.8.8.8#1"
|
||||
_valid "8.8.8.8#42"
|
||||
_valid "8.8.8.8#888"
|
||||
_valid "8.8.8.8#1337"
|
||||
_valid "8.8.8.8#65535"
|
||||
_invalid "8.8.8.8#65536"
|
||||
_invalid "8.8.8.8#-1"
|
||||
_invalid "00.0.0.0"
|
||||
_invalid "010.0.0.0"
|
||||
_invalid "001.0.0.0"
|
||||
_invalid "0.0.0.0#00"
|
||||
_invalid "0.0.0.0#01"
|
||||
_invalid "0.0.0.0#001"
|
||||
_invalid "0.0.0.0#0001"
|
||||
_invalid "0.0.0.0#00001"
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Package dependency installation
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@test "OS can install required Pi-hole dependency packages" {
|
||||
mock_command "$CID" dialog "*" "" "0"
|
||||
run docker exec "$CID" bash -c "
|
||||
|
||||
104
test/test_ftl.bats
Executable file
104
test/test_ftl.bats
Executable file
@@ -0,0 +1,104 @@
|
||||
#!/usr/bin/env bats
|
||||
# FTL architecture detection and binary installation tests
|
||||
|
||||
load 'libs/bats-support/load'
|
||||
load 'libs/bats-assert/load'
|
||||
load 'helpers/mocks'
|
||||
|
||||
TICK="[✓]"
|
||||
INFO="[i]"
|
||||
|
||||
FTL_BRANCH="development"
|
||||
|
||||
CID=""
|
||||
|
||||
setup() {
|
||||
CID=$(docker run -d -t --cap-add=ALL "$IMAGE_TAG")
|
||||
}
|
||||
|
||||
teardown() {
|
||||
if [[ -n "$CID" ]]; then
|
||||
docker rm -f "$CID" > /dev/null 2>&1 || true
|
||||
fi
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# FTL architecture detection — one @test per arch (replaces parametrize)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
_test_ftl_arch() {
|
||||
local arch="$1" detected_string="$2" supported="$3"
|
||||
|
||||
mock_command "$CID" uname "-m" "$arch" "0"
|
||||
mock_command_2 "$CID" readelf \
|
||||
"-A /bin/sh" "Tag_CPU_arch: ${arch}" "0" \
|
||||
"-A /usr/bin/sh" "Tag_CPU_arch: ${arch}" "0" \
|
||||
"-A /usr/sbin/sh" "Tag_CPU_arch: ${arch}" "0"
|
||||
docker exec "$CID" bash -c "echo '${FTL_BRANCH}' > /etc/pihole/ftlbranch"
|
||||
|
||||
run docker exec "$CID" bash -c "
|
||||
source /opt/pihole/basic-install.sh
|
||||
create_pihole_user
|
||||
funcOutput=\$(get_binary_name)
|
||||
binary=\"pihole-FTL\${funcOutput##*pihole-FTL}\"
|
||||
theRest=\"\${funcOutput%pihole-FTL*}\"
|
||||
FTLdetect \"\${binary}\" \"\${theRest}\"
|
||||
"
|
||||
|
||||
if [[ "$supported" == "true" ]]; then
|
||||
assert_output --partial "${INFO} FTL Checks..."
|
||||
assert_output --partial "${TICK} Detected ${detected_string} architecture"
|
||||
assert_output --partial "${TICK} Downloading and Installing FTL"
|
||||
else
|
||||
assert_output --partial "Not able to detect architecture (unknown: ${detected_string})"
|
||||
fi
|
||||
}
|
||||
|
||||
@test "FTL detects aarch64 architecture" {
|
||||
_test_ftl_arch "aarch64" "AArch64 (64 Bit ARM)" "true"
|
||||
}
|
||||
|
||||
@test "FTL detects ARMv6 architecture" {
|
||||
_test_ftl_arch "armv6" "ARMv6" "true"
|
||||
}
|
||||
|
||||
@test "FTL detects ARMv7l architecture" {
|
||||
_test_ftl_arch "armv7l" "ARMv7 (or newer)" "true"
|
||||
}
|
||||
|
||||
@test "FTL detects ARMv7 architecture" {
|
||||
_test_ftl_arch "armv7" "ARMv7 (or newer)" "true"
|
||||
}
|
||||
|
||||
@test "FTL detects ARMv8a architecture" {
|
||||
_test_ftl_arch "armv8a" "ARMv7 (or newer)" "true"
|
||||
}
|
||||
|
||||
@test "FTL detects x86_64 architecture" {
|
||||
_test_ftl_arch "x86_64" "x86_64" "true"
|
||||
}
|
||||
|
||||
@test "FTL detects riscv64 architecture" {
|
||||
_test_ftl_arch "riscv64" "riscv64" "true"
|
||||
}
|
||||
|
||||
@test "FTL reports unsupported architecture" {
|
||||
_test_ftl_arch "mips" "mips" "false"
|
||||
}
|
||||
|
||||
@test "FTL development binary is installed and responsive" {
|
||||
docker exec "$CID" bash -c "echo '${FTL_BRANCH}' > /etc/pihole/ftlbranch"
|
||||
docker exec "$CID" bash -c "
|
||||
source /opt/pihole/basic-install.sh
|
||||
create_pihole_user
|
||||
funcOutput=\$(get_binary_name)
|
||||
binary=\"pihole-FTL\${funcOutput##*pihole-FTL}\"
|
||||
theRest=\"\${funcOutput%pihole-FTL*}\"
|
||||
FTLdetect \"\${binary}\" \"\${theRest}\"
|
||||
"
|
||||
run docker exec "$CID" bash -c '
|
||||
VERSION=$(pihole-FTL version)
|
||||
echo "${VERSION:0:1}"
|
||||
'
|
||||
assert_output --partial "v"
|
||||
}
|
||||
116
test/test_network.bats
Executable file
116
test/test_network.bats
Executable file
@@ -0,0 +1,116 @@
|
||||
#!/usr/bin/env bats
|
||||
# Network detection tests — IPv6 address detection and IP validation
|
||||
|
||||
load 'libs/bats-support/load'
|
||||
load 'libs/bats-assert/load'
|
||||
load 'helpers/mocks'
|
||||
|
||||
CID=""
|
||||
|
||||
setup() {
|
||||
CID=$(docker run -d -t --cap-add=ALL "$IMAGE_TAG")
|
||||
}
|
||||
|
||||
teardown() {
|
||||
if [[ -n "$CID" ]]; then
|
||||
docker rm -f "$CID" > /dev/null 2>&1 || true
|
||||
fi
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# IPv6 detection
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@test "IPv6 link-local only: blocking disabled" {
|
||||
mock_command_2 "$CID" ip \
|
||||
"-6 address" "inet6 fe80::d210:52fa:fe00:7ad7/64 scope link" "0"
|
||||
run docker exec "$CID" bash -c "
|
||||
source /opt/pihole/basic-install.sh
|
||||
find_IPv6_information
|
||||
"
|
||||
assert_output --partial "Unable to find IPv6 ULA/GUA address"
|
||||
}
|
||||
|
||||
@test "IPv6 ULA only: blocking enabled" {
|
||||
mock_command_2 "$CID" ip \
|
||||
"-6 address" "inet6 fda2:2001:5555:0:d210:52fa:fe00:7ad7/64 scope global" "0"
|
||||
run docker exec "$CID" bash -c "
|
||||
source /opt/pihole/basic-install.sh
|
||||
find_IPv6_information
|
||||
"
|
||||
assert_output --partial "Found IPv6 ULA address"
|
||||
}
|
||||
|
||||
@test "IPv6 GUA only: blocking enabled" {
|
||||
mock_command_2 "$CID" ip \
|
||||
"-6 address" "inet6 2003:12:1e43:301:d210:52fa:fe00:7ad7/64 scope global" "0"
|
||||
run docker exec "$CID" bash -c "
|
||||
source /opt/pihole/basic-install.sh
|
||||
find_IPv6_information
|
||||
"
|
||||
assert_output --partial "Found IPv6 GUA address"
|
||||
}
|
||||
|
||||
@test "IPv6 GUA + ULA: ULA takes precedence" {
|
||||
mock_command_2 "$CID" ip \
|
||||
"-6 address" "inet6 2003:12:1e43:301:d210:52fa:fe00:7ad7/64 scope global
|
||||
inet6 fda2:2001:5555:0:d210:52fa:fe00:7ad7/64 scope global" "0"
|
||||
run docker exec "$CID" bash -c "
|
||||
source /opt/pihole/basic-install.sh
|
||||
find_IPv6_information
|
||||
"
|
||||
assert_output --partial "Found IPv6 ULA address"
|
||||
}
|
||||
|
||||
@test "IPv6 ULA + GUA: ULA takes precedence" {
|
||||
mock_command_2 "$CID" ip \
|
||||
"-6 address" "inet6 fda2:2001:5555:0:d210:52fa:fe00:7ad7/64 scope global
|
||||
inet6 2003:12:1e43:301:d210:52fa:fe00:7ad7/64 scope global" "0"
|
||||
run docker exec "$CID" bash -c "
|
||||
source /opt/pihole/basic-install.sh
|
||||
find_IPv6_information
|
||||
"
|
||||
assert_output --partial "Found IPv6 ULA address"
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# IP address validation
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@test "valid_ip accepts and rejects addresses correctly" {
|
||||
_valid() {
|
||||
run docker exec "$CID" bash -c "source /opt/pihole/basic-install.sh; valid_ip '${1}'"
|
||||
assert_success
|
||||
}
|
||||
_invalid() {
|
||||
run docker exec "$CID" bash -c "source /opt/pihole/basic-install.sh; valid_ip '${1}'"
|
||||
assert_failure
|
||||
}
|
||||
|
||||
_valid "192.168.1.1"
|
||||
_valid "127.0.0.1"
|
||||
_valid "255.255.255.255"
|
||||
_invalid "255.255.255.256"
|
||||
_invalid "255.255.256.255"
|
||||
_invalid "255.256.255.255"
|
||||
_invalid "256.255.255.255"
|
||||
_invalid "1092.168.1.1"
|
||||
_invalid "not an IP"
|
||||
_invalid "8.8.8.8#"
|
||||
_valid "8.8.8.8#0"
|
||||
_valid "8.8.8.8#1"
|
||||
_valid "8.8.8.8#42"
|
||||
_valid "8.8.8.8#888"
|
||||
_valid "8.8.8.8#1337"
|
||||
_valid "8.8.8.8#65535"
|
||||
_invalid "8.8.8.8#65536"
|
||||
_invalid "8.8.8.8#-1"
|
||||
_invalid "00.0.0.0"
|
||||
_invalid "010.0.0.0"
|
||||
_invalid "001.0.0.0"
|
||||
_invalid "0.0.0.0#00"
|
||||
_invalid "0.0.0.0#01"
|
||||
_invalid "0.0.0.0#001"
|
||||
_invalid "0.0.0.0#0001"
|
||||
_invalid "0.0.0.0#00001"
|
||||
}
|
||||
Reference in New Issue
Block a user