http_server_persistence_test.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #!/usr/bin/env python
  2. #
  3. # Copyright 2018 Espressif Systems (Shanghai) PTE LTD
  4. #
  5. # Licensed under the Apache License, Version 2.0 (the "License");
  6. # you may not use this file except in compliance with the License.
  7. # You may obtain a copy of the License at
  8. #
  9. # http://www.apache.org/licenses/LICENSE-2.0
  10. #
  11. # Unless required by applicable law or agreed to in writing, software
  12. # distributed under the License is distributed on an "AS IS" BASIS,
  13. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. # See the License for the specific language governing permissions and
  15. # limitations under the License.
  16. from __future__ import division
  17. from __future__ import print_function
  18. from __future__ import unicode_literals
  19. from builtins import str
  20. from builtins import range
  21. import imp
  22. import re
  23. import os
  24. import sys
  25. import string
  26. import random
  27. import socket
  28. # This environment variable is expected on the host machine
  29. test_fw_path = os.getenv("TEST_FW_PATH")
  30. if test_fw_path and test_fw_path not in sys.path:
  31. sys.path.insert(0, test_fw_path)
  32. # When running on local machine execute the following before running this script
  33. # > make app bootloader
  34. # > make print_flash_cmd | tail -n 1 > build/download.config
  35. # > export TEST_FW_PATH=~/esp/esp-idf/tools/tiny-test-fw
  36. import TinyFW
  37. import IDF
  38. import Utility
  39. # Import client module
  40. expath = os.path.dirname(os.path.realpath(__file__))
  41. client = imp.load_source("client", expath + "/scripts/adder.py")
  42. @IDF.idf_example_test(env_tag="Example_WIFI")
  43. def test_examples_protocol_http_server_persistence(env, extra_data):
  44. # Acquire DUT
  45. dut1 = env.get_dut("http_server", "examples/protocols/http_server/persistent_sockets")
  46. # Get binary file
  47. binary_file = os.path.join(dut1.app.binary_path, "persistent_sockets.bin")
  48. bin_size = os.path.getsize(binary_file)
  49. IDF.log_performance("http_server_bin_size", "{}KB".format(bin_size//1024))
  50. IDF.check_performance("http_server_bin_size", bin_size//1024)
  51. # Upload binary and start testing
  52. Utility.console_log("Starting http_server persistance test app")
  53. dut1.start_app()
  54. # Parse IP address of STA
  55. Utility.console_log("Waiting to connect with AP")
  56. got_ip = dut1.expect(re.compile(r"(?:[\s\S]*)Got IP: '(\d+.\d+.\d+.\d+)'"), timeout=120)[0]
  57. got_port = dut1.expect(re.compile(r"(?:[\s\S]*)Starting server on port: '(\d+)'"), timeout=30)[0]
  58. Utility.console_log("Got IP : " + got_ip)
  59. Utility.console_log("Got Port : " + got_port)
  60. # Expected Logs
  61. dut1.expect("Registering URI handlers", timeout=30)
  62. # Run test script
  63. conn = client.start_session(got_ip, got_port)
  64. visitor = 0
  65. adder = 0
  66. # Test PUT request and initialize session context
  67. num = random.randint(0,100)
  68. client.putreq(conn, "/adder", str(num))
  69. visitor += 1
  70. dut1.expect("/adder visitor count = " + str(visitor), timeout=30)
  71. dut1.expect("/adder PUT handler read " + str(num), timeout=30)
  72. dut1.expect("PUT allocating new session", timeout=30)
  73. # Retest PUT request and change session context value
  74. num = random.randint(0,100)
  75. Utility.console_log("Adding: " + str(num))
  76. client.putreq(conn, "/adder", str(num))
  77. visitor += 1
  78. adder += num
  79. dut1.expect("/adder visitor count = " + str(visitor), timeout=30)
  80. dut1.expect("/adder PUT handler read " + str(num), timeout=30)
  81. try:
  82. # Re allocation shouldn't happen
  83. dut1.expect("PUT allocating new session", timeout=30)
  84. # Not expected
  85. raise RuntimeError
  86. except:
  87. # As expected
  88. pass
  89. # Test POST request and session persistence
  90. random_nums = [random.randint(0,100) for _ in range(100)]
  91. for num in random_nums:
  92. Utility.console_log("Adding: " + str(num))
  93. client.postreq(conn, "/adder", str(num))
  94. visitor += 1
  95. adder += num
  96. dut1.expect("/adder visitor count = " + str(visitor), timeout=30)
  97. dut1.expect("/adder handler read " + str(num), timeout=30)
  98. # Test GET request and session persistence
  99. Utility.console_log("Matching final sum: " + str(adder))
  100. if client.getreq(conn, "/adder").decode() != str(adder):
  101. raise RuntimeError
  102. visitor += 1
  103. dut1.expect("/adder visitor count = " + str(visitor), timeout=30)
  104. dut1.expect("/adder GET handler send " + str(adder), timeout=30)
  105. Utility.console_log("Ending session")
  106. # Close connection and check for invocation of context "Free" function
  107. client.end_session(conn)
  108. dut1.expect("/adder Free Context function called", timeout=30)
  109. Utility.console_log("Validating user context data")
  110. # Start another session to check user context data
  111. conn2 = client.start_session(got_ip, got_port)
  112. num = random.randint(0,100)
  113. client.putreq(conn, "/adder", str(num))
  114. visitor += 1
  115. dut1.expect("/adder visitor count = " + str(visitor), timeout=30)
  116. dut1.expect("/adder PUT handler read " + str(num), timeout=30)
  117. dut1.expect("PUT allocating new session", timeout=30)
  118. client.end_session(conn)
  119. dut1.expect("/adder Free Context function called", timeout=30)
  120. if __name__ == '__main__':
  121. test_examples_protocol_http_server_persistence()