Skip to content

Commit 1a99af2

Browse files
committed
test fallback
1 parent 550bd57 commit 1a99af2

File tree

3 files changed

+279
-117
lines changed

3 files changed

+279
-117
lines changed

tests/test_provider_callback.py

Lines changed: 95 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -329,35 +329,107 @@ def _assert_callback_result_logged(self, mock_logger, *expected_strings):
329329
)
330330

331331
def test_real_callback_get_method(self):
332-
"""Test real callback using GET method with httpbin.org and verify logger calls"""
333-
id = "http://httpbin.org/get?domain=__DOMAIN__&ip=__IP__&record_type=__RECORDTYPE__"
332+
"""Test real callback using GET method with httpbin/httpbingo and verify logger calls"""
333+
# 尝试多个测试端点以提高可靠性
334+
test_endpoints = [
335+
"http://httpbin.org/get?domain=__DOMAIN__&ip=__IP__&record_type=__RECORDTYPE__",
336+
"http://httpbingo.org/get?domain=__DOMAIN__&ip=__IP__&record_type=__RECORDTYPE__",
337+
]
338+
334339
domain = "test.example.com"
335340
ip = "111.111.111.111"
336-
337-
provider = CallbackProvider(id, "", ssl="auto")
338-
mock_logger = self._setup_provider_with_mock_logger(provider)
339-
340-
self._random_delay() # Add random delay before real request
341-
result = provider.set_record(domain, ip, "A")
342-
self.assertTrue(result)
343-
self._assert_callback_result_logged(mock_logger, domain, ip)
341+
last_exception = None
342+
343+
for endpoint_id in test_endpoints:
344+
try:
345+
provider = CallbackProvider(endpoint_id, "", ssl="auto")
346+
mock_logger = self._setup_provider_with_mock_logger(provider)
347+
348+
self._random_delay() # Add random delay before real request
349+
result = provider.set_record(domain, ip, "A")
350+
351+
if result:
352+
self.assertTrue(result)
353+
self._assert_callback_result_logged(mock_logger, domain, ip)
354+
return # 成功则退出
355+
else:
356+
# 如果结果为False,可能是5xx错误,尝试下一个端点
357+
continue
358+
359+
except Exception as e:
360+
last_exception = e
361+
# 网络问题时继续尝试下一个端点
362+
error_msg = str(e).lower()
363+
network_keywords = [
364+
"timeout",
365+
"connection",
366+
"resolution",
367+
"unreachable",
368+
"network",
369+
"ssl",
370+
"certificate",
371+
]
372+
if any(keyword in error_msg for keyword in network_keywords):
373+
continue # 尝试下一个端点
374+
else:
375+
# 其他异常重新抛出
376+
raise
377+
378+
# 如果所有端点都失败,跳过测试
379+
error_info = " - Last error: {}".format(str(last_exception)) if last_exception else ""
380+
self.skipTest("All network endpoints unavailable for GET callback test{}".format(error_info))
344381

345382
def test_real_callback_post_method_with_json(self):
346383
"""Test real callback using POST method with JSON data and verify logger calls"""
347-
id = "http://httpbingo.org/post"
348-
token = '{"domain": "__DOMAIN__", "ip": "__IP__", "record_type": "__RECORDTYPE__", "ttl": "__TTL__"}'
349-
provider = CallbackProvider(id, token)
384+
# 尝试多个测试端点以提高可靠性
385+
test_endpoints = ["http://httpbingo.org/post", "http://httpbin.org/post"]
350386

351-
# Setup provider with mock logger
352-
mock_logger = self._setup_provider_with_mock_logger(provider)
353-
354-
self._random_delay() # Add random delay before real request
355-
result = provider.set_record("test.example.com", "203.0.113.2", "A", 300)
356-
# httpbin.org returns JSON with our posted data, so it should be truthy
357-
self.assertTrue(result)
358-
359-
# Verify that logger.info was called with response containing domain and IP
360-
self._assert_callback_result_logged(mock_logger, "test.example.com", "203.0.113.2")
387+
token = '{"domain": "__DOMAIN__", "ip": "__IP__", "record_type": "__RECORDTYPE__", "ttl": "__TTL__"}'
388+
domain = "test.example.com"
389+
ip = "203.0.113.2"
390+
last_exception = None
391+
392+
for endpoint_id in test_endpoints:
393+
try:
394+
provider = CallbackProvider(endpoint_id, token)
395+
# Setup provider with mock logger
396+
mock_logger = self._setup_provider_with_mock_logger(provider)
397+
398+
self._random_delay() # Add random delay before real request
399+
result = provider.set_record(domain, ip, "A", 300)
400+
401+
if result:
402+
# httpbin/httpbingo returns JSON with our posted data, so it should be truthy
403+
self.assertTrue(result)
404+
# Verify that logger.info was called with response containing domain and IP
405+
self._assert_callback_result_logged(mock_logger, domain, ip)
406+
return # 成功则退出
407+
else:
408+
# 如果结果为False,可能是5xx错误,尝试下一个端点
409+
continue
410+
411+
except Exception as e:
412+
last_exception = e
413+
# 网络问题时继续尝试下一个端点
414+
error_msg = str(e).lower()
415+
network_keywords = [
416+
"timeout",
417+
"connection",
418+
"resolution",
419+
"unreachable",
420+
"network",
421+
"ssl",
422+
"certificate",
423+
]
424+
if any(keyword in error_msg for keyword in network_keywords):
425+
continue # 尝试下一个端点
426+
else:
427+
# 其他异常重新抛出
428+
raise
429+
430+
# 如果所有端点都失败,跳过测试
431+
error_info = " - Last error: {}".format(str(last_exception)) if last_exception else ""
432+
self.skipTest("All network endpoints unavailable for POST callback test{}".format(error_info))
361433

362434
def test_real_callback_error_handling(self):
363435
"""Test real callback error handling with invalid URL"""

tests/test_util_http.py

Lines changed: 91 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -412,57 +412,108 @@ def test_http_get_redirect(self):
412412
"""测试HTTP GET重定向处理"""
413413
from ddns.util.http import request
414414

415-
try:
416-
# HTTP重定向处理 - GET重定向
417-
redirect_url = "http://httpbin.org/redirect-to?url=http://httpbin.org/get"
418-
response = request("GET", redirect_url, verify=False, retries=3)
415+
# 尝试多个测试端点以提高可靠性
416+
test_endpoints = [
417+
"http://httpbin.org/redirect-to?url=http://httpbin.org/get",
418+
"http://httpbingo.org/redirect-to?url=http://httpbingo.org/get",
419+
]
419420

420-
# 重定向后应该成功
421-
self.assertEqual(response.status, 200)
422-
self.assertIsNotNone(response.body)
421+
last_exception = None
423422

424-
# 验证最终到达了正确的端点
425-
data = json.loads(response.body)
426-
self.assertIn("url", data)
427-
self.assertIn("httpbin.org/get", data["url"])
423+
for redirect_url in test_endpoints:
424+
try:
425+
# HTTP重定向处理 - GET重定向
426+
response = request("GET", redirect_url, verify=False, retries=3)
428427

429-
except Exception as e:
430-
# 网络问题时跳过测试
431-
error_msg = str(e).lower()
432-
network_keywords = ["timeout", "connection", "resolution", "unreachable", "network", "ssl", "certificate"]
433-
if any(keyword in error_msg for keyword in network_keywords):
434-
self.skipTest("Network unavailable for GET redirect test: {}".format(str(e)))
435-
else:
436-
# 其他异常重新抛出
437-
raise
428+
# 重定向后应该成功
429+
if response.status == 200:
430+
self.assertIsNotNone(response.body)
431+
432+
# 验证最终到达了正确的端点
433+
data = json.loads(response.body)
434+
self.assertIn("url", data)
435+
expected_content = "httpbin.org/get" if "httpbin" in redirect_url else "httpbingo.org/get"
436+
self.assertIn(expected_content, data["url"])
437+
return # 成功则退出
438+
elif response.status >= 500:
439+
# 5xx错误,尝试下一个端点
440+
continue
441+
442+
except Exception as e:
443+
last_exception = e
444+
# 网络问题时继续尝试下一个端点
445+
error_msg = str(e).lower()
446+
network_keywords = [
447+
"timeout",
448+
"connection",
449+
"resolution",
450+
"unreachable",
451+
"network",
452+
"ssl",
453+
"certificate",
454+
]
455+
if any(keyword in error_msg for keyword in network_keywords):
456+
continue # 尝试下一个端点
457+
else:
458+
# 其他异常重新抛出
459+
raise
460+
461+
# 如果所有端点都失败,跳过测试
462+
error_info = " - Last error: {}".format(str(last_exception)) if last_exception else ""
463+
self.skipTest("All network endpoints unavailable for GET redirect test{}".format(error_info))
438464

439465
def test_http_post_redirect(self):
440466
"""测试HTTP POST重定向行为(应该转换为GET请求)"""
441467
from ddns.util.http import request
442468

443-
try:
444-
redirect_url = "http://httpbingo.org/redirect-to?url=/get"
445-
post_data = "test=data&method=POST->GET"
446-
response_post = request("POST", redirect_url, data=post_data, verify=False, retries=3)
469+
# 尝试多个测试端点以提高可靠性
470+
test_endpoints = [
471+
"http://httpbingo.org/redirect-to?url=/get",
472+
"http://httpbin.org/redirect-to?url=http://httpbin.org/get",
473+
]
447474

448-
# 重定向后应该成功
449-
self.assertEqual(response_post.status, 200)
450-
self.assertIsNotNone(response_post.body)
475+
last_exception = None
451476

452-
# 验证最终到达了GET端点
453-
data_post = json.loads(response_post.body)
454-
self.assertIn("url", data_post)
455-
self.assertIn(".org/get", data_post["url"])
477+
for redirect_url in test_endpoints:
478+
try:
479+
post_data = "test=data&method=POST->GET"
480+
response_post = request("POST", redirect_url, data=post_data, verify=False, retries=3)
481+
482+
# 重定向后应该成功
483+
if response_post.status == 200:
484+
self.assertIsNotNone(response_post.body)
485+
486+
# 验证最终到达了GET端点
487+
data_post = json.loads(response_post.body)
488+
self.assertIn("url", data_post)
489+
self.assertIn(".org/get", data_post["url"])
490+
return # 成功则退出
491+
elif response_post.status >= 500:
492+
# 5xx错误,尝试下一个端点
493+
continue
494+
495+
except Exception as e:
496+
last_exception = e
497+
# 网络问题时继续尝试下一个端点
498+
error_msg = str(e).lower()
499+
network_keywords = [
500+
"timeout",
501+
"connection",
502+
"resolution",
503+
"unreachable",
504+
"network",
505+
"ssl",
506+
"certificate",
507+
]
508+
if any(keyword in error_msg for keyword in network_keywords):
509+
continue # 尝试下一个端点
510+
else:
511+
# 其他异常重新抛出
512+
raise
456513

457-
except Exception as e:
458-
# 网络问题时跳过测试
459-
error_msg = str(e).lower()
460-
network_keywords = ["timeout", "connection", "resolution", "unreachable", "network", "ssl", "certificate"]
461-
if any(keyword in error_msg for keyword in network_keywords):
462-
self.skipTest("Network unavailable for POST redirect test: {}".format(str(e)))
463-
else:
464-
# 其他异常重新抛出
465-
raise
514+
# 如果所有端点都失败,跳过测试
515+
error_info = " - Last error: {}".format(str(last_exception)) if last_exception else ""
516+
self.skipTest("All network endpoints unavailable for POST redirect test{}".format(error_info))
466517

467518

468519
if __name__ == "__main__":

0 commit comments

Comments
 (0)