From c480ba851efed13167062b0453ab7583df26bc3f Mon Sep 17 00:00:00 2001 From: Harshit Malpani Date: Wed, 10 Nov 2021 13:54:21 +0530 Subject: [PATCH 1/2] Fix 'address already in use' exception in OTA tests We will stop the server instance at the end of each test case. This will solve the "address already in use" exception --- .../ota/advanced_https_ota/example_test.py | 45 ++++++++++++------- .../ota/native_ota_example/example_test.py | 31 ++++++++----- .../ota/simple_ota_example/example_test.py | 30 ++++++++----- 3 files changed, 68 insertions(+), 38 deletions(-) diff --git a/examples/system/ota/advanced_https_ota/example_test.py b/examples/system/ota/advanced_https_ota/example_test.py index 9189ced414..20a18344b0 100644 --- a/examples/system/ota/advanced_https_ota/example_test.py +++ b/examples/system/ota/advanced_https_ota/example_test.py @@ -1,9 +1,11 @@ -import re +import http.server +import multiprocessing import os -import struct +import random +import re import socket -from threading import Thread import ssl +import struct from tiny_test_fw import DUT import ttfw_idf @@ -169,7 +171,7 @@ def test_examples_protocol_advanced_https_ota_example(env, extra_data): # start test host_ip = get_my_ip() if (get_server_status(host_ip, server_port) is False): - thread1 = Thread(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) + thread1 = multiprocessing.Process(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) thread1.daemon = True thread1.start() dut1.start_app() @@ -180,14 +182,15 @@ def test_examples_protocol_advanced_https_ota_example(env, extra_data): print("Connected to AP with IP: {}".format(ip_address)) except DUT.ExpectTimeout: raise ValueError('ENV_TEST_FAILURE: Cannot connect to AP') - thread1.close() - dut1.expect("Starting Advanced OTA example", timeout=30) + thread1.terminate() + dut1.expect('Starting Advanced OTA example', timeout=30) print("writing to device: {}".format("https://" + host_ip + ":" + str(server_port) + "/" + bin_name)) dut1.write("https://" + host_ip + ":" + str(server_port) + "/" + bin_name) dut1.expect("Loaded app from partition at offset", timeout=60) dut1.expect("Starting Advanced OTA example", timeout=30) dut1.reset() + thread1.terminate() @ttfw_idf.idf_example_test(env_tag="Example_WIFI") @@ -224,7 +227,7 @@ def test_examples_protocol_advanced_https_ota_example_truncated_bin(env, extra_d # start test host_ip = get_my_ip() if (get_server_status(host_ip, server_port) is False): - thread1 = Thread(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) + thread1 = multiprocessing.Process(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) thread1.daemon = True thread1.start() dut1.start_app() @@ -234,12 +237,14 @@ def test_examples_protocol_advanced_https_ota_example_truncated_bin(env, extra_d print("Connected to AP with IP: {}".format(ip_address)) except DUT.ExpectTimeout: raise ValueError('ENV_TEST_FAILURE: Cannot connect to AP') - dut1.expect("Starting Advanced OTA example", timeout=30) + thread1.terminate() + dut1.expect('Starting Advanced OTA example', timeout=30) print("writing to device: {}".format("https://" + host_ip + ":" + str(server_port) + "/" + truncated_bin_name)) dut1.write("https://" + host_ip + ":" + str(server_port) + "/" + truncated_bin_name) dut1.expect("Image validation failed, image is corrupted", timeout=30) os.remove(binary_file) + thread1.terminate() @ttfw_idf.idf_example_test(env_tag="Example_WIFI") @@ -275,7 +280,7 @@ def test_examples_protocol_advanced_https_ota_example_truncated_header(env, extr # start test host_ip = get_my_ip() if (get_server_status(host_ip, server_port) is False): - thread1 = Thread(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) + thread1 = multiprocessing.Process(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) thread1.daemon = True thread1.start() dut1.start_app() @@ -285,12 +290,14 @@ def test_examples_protocol_advanced_https_ota_example_truncated_header(env, extr print("Connected to AP with IP: {}".format(ip_address)) except DUT.ExpectTimeout: raise ValueError('ENV_TEST_FAILURE: Cannot connect to AP') - dut1.expect("Starting Advanced OTA example", timeout=30) + thread1.terminate() + dut1.expect('Starting Advanced OTA example', timeout=30) print("writing to device: {}".format("https://" + host_ip + ":" + str(server_port) + "/" + truncated_bin_name)) dut1.write("https://" + host_ip + ":" + str(server_port) + "/" + truncated_bin_name) dut1.expect("advanced_https_ota_example: esp_https_ota_read_img_desc failed", timeout=30) os.remove(binary_file) + thread1.terminate() @ttfw_idf.idf_example_test(env_tag="Example_WIFI") @@ -325,7 +332,7 @@ def test_examples_protocol_advanced_https_ota_example_random(env, extra_data): # start test host_ip = get_my_ip() if (get_server_status(host_ip, server_port) is False): - thread1 = Thread(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) + thread1 = multiprocessing.Process(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) thread1.daemon = True thread1.start() dut1.start_app() @@ -335,12 +342,14 @@ def test_examples_protocol_advanced_https_ota_example_random(env, extra_data): print("Connected to AP with IP: {}".format(ip_address)) except DUT.ExpectTimeout: raise ValueError('ENV_TEST_FAILURE: Cannot connect to AP') - dut1.expect("Starting Advanced OTA example", timeout=30) + thread1.terminate() + dut1.expect('Starting Advanced OTA example', timeout=30) print("writing to device: {}".format("https://" + host_ip + ":" + str(server_port) + "/" + random_bin_name)) dut1.write("https://" + host_ip + ":" + str(server_port) + "/" + random_bin_name) dut1.expect("esp_ota_ops: OTA image has invalid magic byte", timeout=10) os.remove(binary_file) + thread1.terminate() @ttfw_idf.idf_example_test(env_tag="Example_WIFI") @@ -407,10 +416,10 @@ def test_examples_protocol_advanced_https_ota_example_redirect_url(env, extra_da # start test host_ip = get_my_ip() if (get_server_status(host_ip, server_port) is False): - thread1 = Thread(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) + thread1 = multiprocessing.Process(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) thread1.daemon = True thread1.start() - thread2 = Thread(target=start_redirect_server, args=(dut1.app.binary_path, host_ip, redirection_server_port, server_port)) + thread2 = multiprocessing.Process(target=start_redirect_server, args=(dut1.app.binary_path, host_ip, redirection_server_port, server_port)) thread2.daemon = True thread2.start() dut1.start_app() @@ -420,15 +429,17 @@ def test_examples_protocol_advanced_https_ota_example_redirect_url(env, extra_da print("Connected to AP with IP: {}".format(ip_address)) except DUT.ExpectTimeout: raise ValueError('ENV_TEST_FAILURE: Cannot connect to AP') - thread1.close() - thread2.close() - dut1.expect("Starting Advanced OTA example", timeout=30) + thread1.terminate() + thread2.terminate() + dut1.expect('Starting Advanced OTA example', timeout=30) print("writing to device: {}".format("https://" + host_ip + ":" + str(redirection_server_port) + "/" + bin_name)) dut1.write("https://" + host_ip + ":" + str(redirection_server_port) + "/" + bin_name) dut1.expect("Loaded app from partition at offset", timeout=60) dut1.expect("Starting Advanced OTA example", timeout=30) dut1.reset() + thread1.terminate() + thread2.terminate() if __name__ == '__main__': diff --git a/examples/system/ota/native_ota_example/example_test.py b/examples/system/ota/native_ota_example/example_test.py index b01708bb70..8fed06416c 100644 --- a/examples/system/ota/native_ota_example/example_test.py +++ b/examples/system/ota/native_ota_example/example_test.py @@ -1,8 +1,10 @@ -import re +import http.server +import multiprocessing import os +import random +import re import struct import socket -from threading import Thread import ssl from tiny_test_fw import DUT @@ -141,7 +143,7 @@ def test_examples_protocol_native_ota_example(env, extra_data): # start test host_ip = get_my_ip() if (get_server_status(host_ip, server_port) is False): - thread1 = Thread(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) + thread1 = multiprocessing.Process(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) thread1.daemon = True thread1.start() dut1.start_app() @@ -152,14 +154,15 @@ def test_examples_protocol_native_ota_example(env, extra_data): print("Connected to AP with IP: {}".format(ip_address)) except DUT.ExpectTimeout: raise ValueError('ENV_TEST_FAILURE: Cannot connect to AP') - thread1.close() - dut1.expect("Starting OTA example", timeout=30) + thread1.terminate() + dut1.expect('Starting OTA example', timeout=30) print("writing to device: {}".format("https://" + host_ip + ":" + str(server_port) + "/" + bin_name)) dut1.write("https://" + host_ip + ":" + str(server_port) + "/" + bin_name) dut1.expect("Loaded app from partition at offset", timeout=60) dut1.expect("Starting OTA example", timeout=30) dut1.reset() + thread1.terminate() @ttfw_idf.idf_example_test(env_tag="Example_WIFI") @@ -196,7 +199,7 @@ def test_examples_protocol_native_ota_example_truncated_bin(env, extra_data): # start test host_ip = get_my_ip() if (get_server_status(host_ip, server_port) is False): - thread1 = Thread(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) + thread1 = multiprocessing.Process(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) thread1.daemon = True thread1.start() dut1.start_app() @@ -206,12 +209,14 @@ def test_examples_protocol_native_ota_example_truncated_bin(env, extra_data): print("Connected to AP with IP: {}".format(ip_address)) except DUT.ExpectTimeout: raise ValueError('ENV_TEST_FAILURE: Cannot connect to AP') - dut1.expect("Starting OTA example", timeout=30) + thread1.terminate() + dut1.expect('Starting OTA example', timeout=30) print("writing to device: {}".format("https://" + host_ip + ":" + str(server_port) + "/" + truncated_bin_name)) dut1.write("https://" + host_ip + ":" + str(server_port) + "/" + truncated_bin_name) dut1.expect("native_ota_example: Image validation failed, image is corrupted", timeout=20) os.remove(binary_file) + thread1.terminate() @ttfw_idf.idf_example_test(env_tag="Example_WIFI") @@ -247,7 +252,7 @@ def test_examples_protocol_native_ota_example_truncated_header(env, extra_data): # start test host_ip = get_my_ip() if (get_server_status(host_ip, server_port) is False): - thread1 = Thread(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) + thread1 = multiprocessing.Process(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) thread1.daemon = True thread1.start() dut1.start_app() @@ -257,12 +262,14 @@ def test_examples_protocol_native_ota_example_truncated_header(env, extra_data): print("Connected to AP with IP: {}".format(ip_address)) except DUT.ExpectTimeout: raise ValueError('ENV_TEST_FAILURE: Cannot connect to AP') - dut1.expect("Starting OTA example", timeout=30) + thread1.terminate() + dut1.expect('Starting OTA example', timeout=30) print("writing to device: {}".format("https://" + host_ip + ":" + str(server_port) + "/" + truncated_bin_name)) dut1.write("https://" + host_ip + ":" + str(server_port) + "/" + truncated_bin_name) dut1.expect("native_ota_example: received package is not fit len", timeout=20) os.remove(binary_file) + thread1.terminate() @ttfw_idf.idf_example_test(env_tag="Example_WIFI") @@ -297,7 +304,7 @@ def test_examples_protocol_native_ota_example_random(env, extra_data): # start test host_ip = get_my_ip() if (get_server_status(host_ip, server_port) is False): - thread1 = Thread(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) + thread1 = multiprocessing.Process(target=start_https_server, args=(dut1.app.binary_path, host_ip, server_port)) thread1.daemon = True thread1.start() dut1.start_app() @@ -307,12 +314,14 @@ def test_examples_protocol_native_ota_example_random(env, extra_data): print("Connected to AP with IP: {}".format(ip_address)) except DUT.ExpectTimeout: raise ValueError('ENV_TEST_FAILURE: Cannot connect to AP') - dut1.expect("Starting OTA example", timeout=30) + thread1.terminate() + dut1.expect('Starting OTA example', timeout=30) print("writing to device: {}".format("https://" + host_ip + ":" + str(server_port) + "/" + random_bin_name)) dut1.write("https://" + host_ip + ":" + str(server_port) + "/" + random_bin_name) dut1.expect("esp_ota_ops: OTA image has invalid magic byte", timeout=20) os.remove(binary_file) + thread1.terminate() @ttfw_idf.idf_example_test(env_tag="Example_WIFI") diff --git a/examples/system/ota/simple_ota_example/example_test.py b/examples/system/ota/simple_ota_example/example_test.py index c66efae7ac..ec69865bde 100644 --- a/examples/system/ota/simple_ota_example/example_test.py +++ b/examples/system/ota/simple_ota_example/example_test.py @@ -1,8 +1,11 @@ +import http.server +import multiprocessing +import os import re import os import socket -from threading import Thread import ssl +import sys from tiny_test_fw import DUT import ttfw_idf @@ -73,11 +76,16 @@ def get_my_ip(): return my_ip -def start_https_server(ota_image_dir, server_ip, server_port): - # parser = argparse.ArgumentParser() - # parser.add_argument('-p', '--port', dest='port', type= int, - # help= "Server Port", default= 8000) - # args = parser.parse_args() +def get_server_status(host_ip, server_port): + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server_status = sock.connect_ex((host_ip, server_port)) + sock.close() + if server_status == 0: + return True + return False + + +def start_https_server(ota_image_dir, server_ip, server_port, server_file=None, key_file=None): os.chdir(ota_image_dir) server_file = os.path.join(ota_image_dir, "server_cert.pem") @@ -115,9 +123,10 @@ def test_examples_protocol_simple_ota_example(env, extra_data): ttfw_idf.check_performance("simple_ota_bin_size", bin_size // 1024) # start test host_ip = get_my_ip() - thread1 = Thread(target=start_https_server, args=(dut1.app.binary_path, host_ip, 8000)) - thread1.daemon = True - thread1.start() + if (get_server_status(host_ip, 8000) is False): + thread1 = multiprocessing.Process(target=start_https_server, args=(dut1.app.binary_path, host_ip, 8000)) + thread1.daemon = True + thread1.start() dut1.start_app() dut1.expect("Loaded app from partition at offset 0x10000", timeout=30) try: @@ -125,13 +134,14 @@ def test_examples_protocol_simple_ota_example(env, extra_data): print("Connected to AP with IP: {}".format(ip_address)) except DUT.ExpectTimeout: raise ValueError('ENV_TEST_FAILURE: Cannot connect to AP') - thread1.close() + thread1.terminate() dut1.expect("Starting OTA example", timeout=30) print("writing to device: {}".format("https://" + host_ip + ":8000/simple_ota.bin")) dut1.write("https://" + host_ip + ":8000/simple_ota.bin") dut1.expect("Loaded app from partition at offset 0x110000", timeout=60) dut1.expect("Starting OTA example", timeout=30) + thread1.terminate() if __name__ == '__main__': From 773c5ec5b9d1cdf020db990720d4a75f677f4e61 Mon Sep 17 00:00:00 2001 From: Harshit Malpani Date: Wed, 8 Dec 2021 16:23:25 +0530 Subject: [PATCH 2/2] Fix for advanced_ota_redirect_url example failure in CI --- .../ota/advanced_https_ota/example_test.py | 98 +++++-------------- .../test_certs/server_cert.pem | 20 ++++ .../test_certs/server_key.pem | 28 ++++++ .../ota/native_ota_example/example_test.py | 2 - .../ota/simple_ota_example/example_test.py | 3 - 5 files changed, 75 insertions(+), 76 deletions(-) create mode 100644 examples/system/ota/advanced_https_ota/test_certs/server_cert.pem create mode 100644 examples/system/ota/advanced_https_ota/test_certs/server_key.pem diff --git a/examples/system/ota/advanced_https_ota/example_test.py b/examples/system/ota/advanced_https_ota/example_test.py index 20a18344b0..f7f07a9abf 100644 --- a/examples/system/ota/advanced_https_ota/example_test.py +++ b/examples/system/ota/advanced_https_ota/example_test.py @@ -1,7 +1,5 @@ -import http.server import multiprocessing import os -import random import re import socket import ssl @@ -19,55 +17,8 @@ except ImportError: import http.server as BaseHTTPServer from http.server import SimpleHTTPRequestHandler -server_cert = '-----BEGIN CERTIFICATE-----\n' \ - 'MIIDWDCCAkACCQCbF4+gVh/MLjANBgkqhkiG9w0BAQsFADBuMQswCQYDVQQGEwJJ\n'\ - 'TjELMAkGA1UECAwCTUgxDDAKBgNVBAcMA1BVTjEMMAoGA1UECgwDRVNQMQwwCgYD\n'\ - 'VQQLDANFU1AxDDAKBgNVBAMMA0VTUDEaMBgGCSqGSIb3DQEJARYLZXNwQGVzcC5j\n'\ - 'b20wHhcNMjEwNzEyMTIzNjI3WhcNNDEwNzA3MTIzNjI3WjBuMQswCQYDVQQGEwJJ\n'\ - 'TjELMAkGA1UECAwCTUgxDDAKBgNVBAcMA1BVTjEMMAoGA1UECgwDRVNQMQwwCgYD\n'\ - 'VQQLDANFU1AxDDAKBgNVBAMMA0VTUDEaMBgGCSqGSIb3DQEJARYLZXNwQGVzcC5j\n'\ - 'b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDhxF/y7bygndxPwiWL\n'\ - 'SwS9LY3uBMaJgup0ufNKVhx+FhGQOu44SghuJAaH3KkPUnt6SOM8jC97/yQuc32W\n'\ - 'ukI7eBZoA12kargSnzdv5m5rZZpd+NznSSpoDArOAONKVlzr25A1+aZbix2mKRbQ\n'\ - 'S5w9o1N2BriQuSzd8gL0Y0zEk3VkOWXEL+0yFUT144HnErnD+xnJtHe11yPO2fEz\n'\ - 'YaGiilh0ddL26PXTugXMZN/8fRVHP50P2OG0SvFpC7vghlLp4VFM1/r3UJnvL6Oz\n'\ - '3ALc6dhxZEKQucqlpj8l1UegszQToopemtIj0qXTHw2+uUnkUyWIPjPC+wdOAoap\n'\ - 'rFTRAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAItw24y565k3C/zENZlxyzto44ud\n'\ - 'IYPQXN8Fa2pBlLe1zlSIyuaA/rWQ+i1daS8nPotkCbWZyf5N8DYaTE4B0OfvoUPk\n'\ - 'B5uGDmbuk6akvlB5BGiYLfQjWHRsK9/4xjtIqN1H58yf3QNROuKsPAeywWS3Fn32\n'\ - '3//OpbWaClQePx6udRYMqAitKR+QxL7/BKZQsX+UyShuq8hjphvXvk0BW8ONzuw9\n'\ - 'RcoORxM0FzySYjeQvm4LhzC/P3ZBhEq0xs55aL2a76SJhq5hJy7T/Xz6NFByvlrN\n'\ - 'lFJJey33KFrAf5vnV9qcyWFIo7PYy2VsaaEjFeefr7q3sTFSMlJeadexW2Y=\n'\ - '-----END CERTIFICATE-----\n' - -server_key = '-----BEGIN PRIVATE KEY-----\n'\ - 'MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDhxF/y7bygndxP\n'\ - 'wiWLSwS9LY3uBMaJgup0ufNKVhx+FhGQOu44SghuJAaH3KkPUnt6SOM8jC97/yQu\n'\ - 'c32WukI7eBZoA12kargSnzdv5m5rZZpd+NznSSpoDArOAONKVlzr25A1+aZbix2m\n'\ - 'KRbQS5w9o1N2BriQuSzd8gL0Y0zEk3VkOWXEL+0yFUT144HnErnD+xnJtHe11yPO\n'\ - '2fEzYaGiilh0ddL26PXTugXMZN/8fRVHP50P2OG0SvFpC7vghlLp4VFM1/r3UJnv\n'\ - 'L6Oz3ALc6dhxZEKQucqlpj8l1UegszQToopemtIj0qXTHw2+uUnkUyWIPjPC+wdO\n'\ - 'AoaprFTRAgMBAAECggEAE0HCxV/N1Q1h+1OeDDGL5+74yjKSFKyb/vTVcaPCrmaH\n'\ - 'fPvp0ddOvMZJ4FDMAsiQS6/n4gQ7EKKEnYmwTqj4eUYW8yxGUn3f0YbPHbZT+Mkj\n'\ - 'z5woi3nMKi/MxCGDQZX4Ow3xUQlITUqibsfWcFHis8c4mTqdh4qj7xJzehD2PVYF\n'\ - 'gNHZsvVj6MltjBDAVwV1IlGoHjuElm6vuzkfX7phxcA1B4ZqdYY17yCXUnvui46z\n'\ - 'Xn2kUTOOUCEgfgvGa9E+l4OtdXi5IxjaSraU+dlg2KsE4TpCuN2MEVkeR5Ms3Y7Q\n'\ - 'jgJl8vlNFJDQpbFukLcYwG7rO5N5dQ6WWfVia/5XgQKBgQD74at/bXAPrh9NxPmz\n'\ - 'i1oqCHMDoM9sz8xIMZLF9YVu3Jf8ux4xVpRSnNy5RU1gl7ZXbpdgeIQ4v04zy5aw\n'\ - '8T4tu9K3XnR3UXOy25AK0q+cnnxZg3kFQm+PhtOCKEFjPHrgo2MUfnj+EDddod7N\n'\ - 'JQr9q5rEFbqHupFPpWlqCa3QmQKBgQDldWUGokNaEpmgHDMnHxiibXV5LQhzf8Rq\n'\ - 'gJIQXb7R9EsTSXEvsDyqTBb7PHp2Ko7rZ5YQfyf8OogGGjGElnPoU/a+Jij1gVFv\n'\ - 'kZ064uXAAISBkwHdcuobqc5EbG3ceyH46F+FBFhqM8KcbxJxx08objmh58+83InN\n'\ - 'P9Qr25Xw+QKBgEGXMHuMWgQbSZeM1aFFhoMvlBO7yogBTKb4Ecpu9wI5e3Kan3Al\n'\ - 'pZYltuyf+VhP6XG3IMBEYdoNJyYhu+nzyEdMg8CwXg+8LC7FMis/Ve+o7aS5scgG\n'\ - '1to/N9DK/swCsdTRdzmc/ZDbVC+TuVsebFBGYZTyO5KgqLpezqaIQrTxAoGALFCU\n'\ - '10glO9MVyl9H3clap5v+MQ3qcOv/EhaMnw6L2N6WVT481tnxjW4ujgzrFcE4YuxZ\n'\ - 'hgwYu9TOCmeqopGwBvGYWLbj+C4mfSahOAs0FfXDoYazuIIGBpuv03UhbpB1Si4O\n'\ - 'rJDfRnuCnVWyOTkl54gKJ2OusinhjztBjcrV1XkCgYEA3qNi4uBsPdyz9BZGb/3G\n'\ - 'rOMSw0CaT4pEMTLZqURmDP/0hxvTk1polP7O/FYwxVuJnBb6mzDa0xpLFPTpIAnJ\n'\ - 'YXB8xpXU69QVh+EBbemdJWOd+zp5UCfXvb2shAeG3Tn/Dz4cBBMEUutbzP+or0nG\n'\ - 'vSXnRLaxQhooWm+IuX9SuBQ=\n'\ - '-----END PRIVATE KEY-----\n' +server_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_certs/server_cert.pem') +key_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_certs/server_key.pem') def get_my_ip(): @@ -87,25 +38,33 @@ def get_server_status(host_ip, port): return False -def create_file(server_file, file_data): - with open(server_file, "w+") as file: - file.write(file_data) +def https_request_handler(): + """ + Returns a request handler class that handles broken pipe exception + """ + class RequestHandler(SimpleHTTPRequestHandler): + def finish(self): + try: + if not self.wfile.closed: + self.wfile.flush() + self.wfile.close() + except socket.error: + pass + self.rfile.close() + def handle(self): + try: + BaseHTTPServer.BaseHTTPRequestHandler.handle(self) + except socket.error: + pass -def get_ca_cert(ota_image_dir): - os.chdir(ota_image_dir) - server_file = os.path.join(ota_image_dir, "server_cert.pem") - create_file(server_file, server_cert) - - key_file = os.path.join(ota_image_dir, "server_key.pem") - create_file(key_file, server_key) - return server_file, key_file + return RequestHandler def start_https_server(ota_image_dir, server_ip, server_port): - server_file, key_file = get_ca_cert(ota_image_dir) - httpd = BaseHTTPServer.HTTPServer((server_ip, server_port), - SimpleHTTPRequestHandler) + os.chdir(ota_image_dir) + requestHandler = https_request_handler() + httpd = BaseHTTPServer.HTTPServer((server_ip, server_port), requestHandler) httpd.socket = ssl.wrap_socket(httpd.socket, keyfile=key_file, @@ -114,8 +73,8 @@ def start_https_server(ota_image_dir, server_ip, server_port): def start_chunked_server(ota_image_dir, server_port): - server_file, key_file = get_ca_cert(ota_image_dir) - chunked_server = subprocess.Popen(["openssl", "s_server", "-WWW", "-key", key_file, "-cert", server_file, "-port", str(server_port)]) + os.chdir(ota_image_dir) + chunked_server = subprocess.Popen(['openssl', 's_server', '-WWW', '-key', key_file, '-cert', server_file, '-port', str(server_port)]) return chunked_server @@ -135,8 +94,7 @@ def redirect_handler_factory(url): def start_redirect_server(ota_image_dir, server_ip, server_port, redirection_port): os.chdir(ota_image_dir) - server_file, key_file = get_ca_cert(ota_image_dir) - redirectHandler = redirect_handler_factory("https://" + server_ip + ":" + str(redirection_port) + "/advanced_https_ota.bin") + redirectHandler = redirect_handler_factory('https://' + server_ip + ':' + str(redirection_port) + '/advanced_https_ota.bin') httpd = BaseHTTPServer.HTTPServer((server_ip, server_port), redirectHandler) @@ -387,8 +345,6 @@ def test_examples_protocol_advanced_https_ota_example_chunked(env, extra_data): dut1.expect("Loaded app from partition at offset", timeout=60) dut1.expect("Starting Advanced OTA example", timeout=30) chunked_server.kill() - os.remove(os.path.join(dut1.app.binary_path, "server_cert.pem")) - os.remove(os.path.join(dut1.app.binary_path, "server_key.pem")) @ttfw_idf.idf_example_test(env_tag="Example_WIFI") diff --git a/examples/system/ota/advanced_https_ota/test_certs/server_cert.pem b/examples/system/ota/advanced_https_ota/test_certs/server_cert.pem new file mode 100644 index 0000000000..b29ba7ab1f --- /dev/null +++ b/examples/system/ota/advanced_https_ota/test_certs/server_cert.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDWDCCAkACCQCbF4+gVh/MLjANBgkqhkiG9w0BAQsFADBuMQswCQYDVQQGEwJJ +TjELMAkGA1UECAwCTUgxDDAKBgNVBAcMA1BVTjEMMAoGA1UECgwDRVNQMQwwCgYD +VQQLDANFU1AxDDAKBgNVBAMMA0VTUDEaMBgGCSqGSIb3DQEJARYLZXNwQGVzcC5j +b20wHhcNMjEwNzEyMTIzNjI3WhcNNDEwNzA3MTIzNjI3WjBuMQswCQYDVQQGEwJJ +TjELMAkGA1UECAwCTUgxDDAKBgNVBAcMA1BVTjEMMAoGA1UECgwDRVNQMQwwCgYD +VQQLDANFU1AxDDAKBgNVBAMMA0VTUDEaMBgGCSqGSIb3DQEJARYLZXNwQGVzcC5j +b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDhxF/y7bygndxPwiWL +SwS9LY3uBMaJgup0ufNKVhx+FhGQOu44SghuJAaH3KkPUnt6SOM8jC97/yQuc32W +ukI7eBZoA12kargSnzdv5m5rZZpd+NznSSpoDArOAONKVlzr25A1+aZbix2mKRbQ +S5w9o1N2BriQuSzd8gL0Y0zEk3VkOWXEL+0yFUT144HnErnD+xnJtHe11yPO2fEz +YaGiilh0ddL26PXTugXMZN/8fRVHP50P2OG0SvFpC7vghlLp4VFM1/r3UJnvL6Oz +3ALc6dhxZEKQucqlpj8l1UegszQToopemtIj0qXTHw2+uUnkUyWIPjPC+wdOAoap +rFTRAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAItw24y565k3C/zENZlxyzto44ud +IYPQXN8Fa2pBlLe1zlSIyuaA/rWQ+i1daS8nPotkCbWZyf5N8DYaTE4B0OfvoUPk +B5uGDmbuk6akvlB5BGiYLfQjWHRsK9/4xjtIqN1H58yf3QNROuKsPAeywWS3Fn32 +3//OpbWaClQePx6udRYMqAitKR+QxL7/BKZQsX+UyShuq8hjphvXvk0BW8ONzuw9 +RcoORxM0FzySYjeQvm4LhzC/P3ZBhEq0xs55aL2a76SJhq5hJy7T/Xz6NFByvlrN +lFJJey33KFrAf5vnV9qcyWFIo7PYy2VsaaEjFeefr7q3sTFSMlJeadexW2Y= +-----END CERTIFICATE----- diff --git a/examples/system/ota/advanced_https_ota/test_certs/server_key.pem b/examples/system/ota/advanced_https_ota/test_certs/server_key.pem new file mode 100644 index 0000000000..20a4bdb624 --- /dev/null +++ b/examples/system/ota/advanced_https_ota/test_certs/server_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDhxF/y7bygndxP +wiWLSwS9LY3uBMaJgup0ufNKVhx+FhGQOu44SghuJAaH3KkPUnt6SOM8jC97/yQu +c32WukI7eBZoA12kargSnzdv5m5rZZpd+NznSSpoDArOAONKVlzr25A1+aZbix2m +KRbQS5w9o1N2BriQuSzd8gL0Y0zEk3VkOWXEL+0yFUT144HnErnD+xnJtHe11yPO +2fEzYaGiilh0ddL26PXTugXMZN/8fRVHP50P2OG0SvFpC7vghlLp4VFM1/r3UJnv +L6Oz3ALc6dhxZEKQucqlpj8l1UegszQToopemtIj0qXTHw2+uUnkUyWIPjPC+wdO +AoaprFTRAgMBAAECggEAE0HCxV/N1Q1h+1OeDDGL5+74yjKSFKyb/vTVcaPCrmaH +fPvp0ddOvMZJ4FDMAsiQS6/n4gQ7EKKEnYmwTqj4eUYW8yxGUn3f0YbPHbZT+Mkj +z5woi3nMKi/MxCGDQZX4Ow3xUQlITUqibsfWcFHis8c4mTqdh4qj7xJzehD2PVYF +gNHZsvVj6MltjBDAVwV1IlGoHjuElm6vuzkfX7phxcA1B4ZqdYY17yCXUnvui46z +Xn2kUTOOUCEgfgvGa9E+l4OtdXi5IxjaSraU+dlg2KsE4TpCuN2MEVkeR5Ms3Y7Q +jgJl8vlNFJDQpbFukLcYwG7rO5N5dQ6WWfVia/5XgQKBgQD74at/bXAPrh9NxPmz +i1oqCHMDoM9sz8xIMZLF9YVu3Jf8ux4xVpRSnNy5RU1gl7ZXbpdgeIQ4v04zy5aw +8T4tu9K3XnR3UXOy25AK0q+cnnxZg3kFQm+PhtOCKEFjPHrgo2MUfnj+EDddod7N +JQr9q5rEFbqHupFPpWlqCa3QmQKBgQDldWUGokNaEpmgHDMnHxiibXV5LQhzf8Rq +gJIQXb7R9EsTSXEvsDyqTBb7PHp2Ko7rZ5YQfyf8OogGGjGElnPoU/a+Jij1gVFv +kZ064uXAAISBkwHdcuobqc5EbG3ceyH46F+FBFhqM8KcbxJxx08objmh58+83InN +P9Qr25Xw+QKBgEGXMHuMWgQbSZeM1aFFhoMvlBO7yogBTKb4Ecpu9wI5e3Kan3Al +pZYltuyf+VhP6XG3IMBEYdoNJyYhu+nzyEdMg8CwXg+8LC7FMis/Ve+o7aS5scgG +1to/N9DK/swCsdTRdzmc/ZDbVC+TuVsebFBGYZTyO5KgqLpezqaIQrTxAoGALFCU +10glO9MVyl9H3clap5v+MQ3qcOv/EhaMnw6L2N6WVT481tnxjW4ujgzrFcE4YuxZ +hgwYu9TOCmeqopGwBvGYWLbj+C4mfSahOAs0FfXDoYazuIIGBpuv03UhbpB1Si4O +rJDfRnuCnVWyOTkl54gKJ2OusinhjztBjcrV1XkCgYEA3qNi4uBsPdyz9BZGb/3G +rOMSw0CaT4pEMTLZqURmDP/0hxvTk1polP7O/FYwxVuJnBb6mzDa0xpLFPTpIAnJ +YXB8xpXU69QVh+EBbemdJWOd+zp5UCfXvb2shAeG3Tn/Dz4cBBMEUutbzP+or0nG +vSXnRLaxQhooWm+IuX9SuBQ= +-----END PRIVATE KEY----- diff --git a/examples/system/ota/native_ota_example/example_test.py b/examples/system/ota/native_ota_example/example_test.py index 8fed06416c..900ed785c5 100644 --- a/examples/system/ota/native_ota_example/example_test.py +++ b/examples/system/ota/native_ota_example/example_test.py @@ -1,7 +1,5 @@ -import http.server import multiprocessing import os -import random import re import struct import socket diff --git a/examples/system/ota/simple_ota_example/example_test.py b/examples/system/ota/simple_ota_example/example_test.py index ec69865bde..756e5c210f 100644 --- a/examples/system/ota/simple_ota_example/example_test.py +++ b/examples/system/ota/simple_ota_example/example_test.py @@ -1,11 +1,8 @@ -import http.server import multiprocessing import os import re -import os import socket import ssl -import sys from tiny_test_fw import DUT import ttfw_idf