wget/testenv/Test-no_proxy-env.py

162 lines
4.9 KiB
Python
Executable File

#!/usr/bin/env python3
import socket
from sys import exit
from test.http_test import HTTPTest
from test.base_test import SKIP_TEST
from test.base_test import HTTP
from misc.wget_file import WgetFile
"""
This test ensures, that domains with and without leftmost dot defined in
no_proxy environment variable are accepted by wget. The idea is to use
non-existing proxy server address and detect whether files are downloaded
when proxy settings are omitted based on no_proxy environment variable
value.
current wget's behavior:
- "no_proxy=.mit.edu"
- will match the domain and subdomains e.g. "www.mit.edu" or "www.subdomain.mit.edu" (Case #4)
- will NOT match the host "mit.edu" (Case #3)
- "no_proxy=mit.edu"
- will match the domain and subdomains e.g. "www.mit.edu" or "www.subdomain.mit.edu" (Case #2)
- will match the host "mit.edu" (Case #1)
- downside: cannot match only the host
"""
# Check whether the system supports translating localhost subdomains
# to localhost address and if not, skip it.
hostnames_to_check = [
"working1.localhost",
"working2.localhost",
"www.working1.localhost",
"www.working2.localhost",
]
for hostname in hostnames_to_check:
try:
ip = socket.gethostbyname(hostname)
except socket.gaierror as _:
# resolution of the name fails
# return value 77 -> SKIP
exit(SKIP_TEST)
# File Definitions
File1 = "Would you like some Tea?"
File2 = "With lemon or cream?"
A_File = WgetFile ("File1", File1)
B_File = WgetFile ("File2", File2)
WGET_URLS = [["File1", "File2"]]
WGET_ENVS = {
"http_proxy": "nonexisting.localhost:8080",
"no_proxy": "working1.localhost,.working2.localhost"
}
Servers = [HTTP]
Files = [[A_File, B_File]]
ExpectedReturnCodeWorking = 0
ExpectedReturnCodeNotWorking = 4 # network error (non-existing proxy address)
ExpectedDownloadedFilesWorking = [A_File, B_File]
# Pre and Post Test Hooks
test_options = {
"Urls" : WGET_URLS,
"EnvironmentVariables": WGET_ENVS
}
post_test_working = {
"ExpectedFiles" : ExpectedDownloadedFilesWorking,
"ExpectedRetcode" : ExpectedReturnCodeWorking
}
post_test_not_working = {
"ExpectedRetcode" : ExpectedReturnCodeNotWorking
}
# Case #1:
# - Requested domain matches exactly the domain definition in no_proxy.
# - Domain definition in no_proxy is NOT dot-prefixed
# Expected result: proxy settings don't apply and files are downloaded.
pre_case_1 = {
"ServerFiles" : Files,
"Domains" : ["working1.localhost"]
}
err_case_1 = HTTPTest (
pre_hook=pre_case_1,
test_params=test_options,
post_hook=post_test_working,
protocols=Servers
).begin ()
# Case #2:
# - Requested domain is sub-domain of a domain definition in no_proxy.
# - Domain definition in no_proxy is NOT dot-prefixed
# Expected result: proxy settings don't apply and files are downloaded.
pre_case_2 = {
"ServerFiles" : Files,
"Domains" : ["www.working1.localhost"]
}
err_case_2 = HTTPTest (
pre_hook=pre_case_2,
test_params=test_options,
post_hook=post_test_working,
protocols=Servers
).begin ()
# Case #3:
# - Requested domain matches exactly the domain definition in no_proxy,
# except for the leftmost dot (".") in no_proxy domain definition.
# - Domain definition in no_proxy IS dot-prefixed
# Expected result: proxy settings apply and files are downloaded. This is
# due to the mismatch in leftmost dot.
# NOTE: This is inconsistent with curl's behavior, but has less drawbacks.
pre_case_3 = {
"ServerFiles" : Files,
"Domains" : ["working2.localhost"]
}
err_case_3 = HTTPTest (
pre_hook=pre_case_3,
test_params=test_options,
post_hook=post_test_not_working,
protocols=Servers
).begin ()
# Case #4:
# - Requested domain is sub-domain of a domain definition in no_proxy.
# - Domain definition in no_proxy IS dot-prefixed
# Expected result: proxy settings don't apply and files are downloaded.
pre_case_4 = {
"ServerFiles" : Files,
"Domains" : ["www.working2.localhost"]
}
err_case_4 = HTTPTest (
pre_hook=pre_case_4,
test_params=test_options,
post_hook=post_test_working,
protocols=Servers
).begin ()
# Case #5
# - Requested domain does not match a domain definition in no_proxy.
# - Requested domain is NOT sub-domain of a domain definition in no_proxy.
# Expected result: proxy settings apply and files are NOT downloaded due to
# network error when using proxy with non-existing URL.
pre_case_5 = {
"ServerFiles" : Files,
"Domains" : ["www.example.localhost"]
}
err_case_5 = HTTPTest (
pre_hook=pre_case_5,
test_params=test_options,
post_hook=post_test_not_working,
protocols=Servers
).begin ()
# Combine error codes from all test cases
exit (max(err_case_1, err_case_2, err_case_3, err_case_4, err_case_5))