wspeedtest.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. if (!requirelib("appdata")) {
  2. console.log("appdata import failed");
  3. }
  4. /*
  5. WebSocket Test Script
  6. This is a special test script and should not be mixed in with normal
  7. AGI module test scripts. Please test this seperately
  8. Author: tobychui
  9. */
  10. function setup() {
  11. //Require the WebSocket Library
  12. var succ = requirelib("websocket");
  13. if (!succ) {
  14. console.log("WebSocket Open Failed");
  15. return false
  16. }
  17. //Upgrade the current connection to WebSocket, set timeout to 30 seconds
  18. //Timeout value: if after 30 seconds nothing has been send / received, the websocket will be closed
  19. //set this value to 0 to display auto socket closing
  20. succ = websocket.upgrade(30);
  21. if (!succ) {
  22. console.log("WebSocket Upgrade Failed");
  23. return false
  24. }
  25. console.log("WebSocket Opened!")
  26. return true;
  27. }
  28. function waitForStart() {
  29. /*
  30. websocket.send("Send 'start' to start websocket.send test");
  31. var recv = "";
  32. for (var i = 0; i < 10; i++) {
  33. //Read the websocket input from Client (Web UI)
  34. recv = websocket.read();
  35. if (recv == null) {
  36. console.log("Read Failed!")
  37. return
  38. }
  39. if (recv != "start") {
  40. websocket.send(recv + " reveived. Type 'start' to start testing. (Retry count: " + i + "/10)");
  41. } else {
  42. websocket.send("'start' command received. Starting test");
  43. break;
  44. }
  45. }
  46. */
  47. }
  48. function closing() {
  49. //Try to close the WebSocket connection
  50. websocket.close();
  51. }
  52. //Start executing the script
  53. if (setup()) {
  54. websocket.send("DWL/UPL?");
  55. var recv = "";
  56. while (true) {
  57. //Read the websocket input from Client (Web UI)
  58. recv = websocket.read();
  59. if (recv == null) {
  60. console.log("Read Failed!")
  61. break;
  62. }
  63. if (recv == "DWL") {
  64. downloadTest();
  65. break;
  66. } else if (recv == "UPL") {
  67. uploadTest();
  68. break;
  69. } else if (recv == "PING") {
  70. pingTest();
  71. break;
  72. }
  73. }
  74. closing();
  75. } else {
  76. console.log("WebSocket Setup Failed.")
  77. }
  78. function downloadTest() {
  79. var CurrentPow = 0;
  80. var CurrentDif = 0;
  81. randomStr = appdata.readFile("Speedtest/special/random1MB.txt");
  82. var filesize = "DATA:".length + randomStr.length;
  83. waitForStart();
  84. while (CurrentDif < 5) {
  85. var CurrentMB = Math.pow(2, CurrentPow);
  86. var start = new Date();
  87. //websocket.send(start);
  88. for (var i = 0; i < CurrentMB; i++) {
  89. websocket.send("DATA:" + randomStr);
  90. }
  91. var end = new Date();
  92. CurrentDif = (end.getTime() - start.getTime()) / 1000;
  93. //websocket.send(end);
  94. //websocket.send(CurrentDif);
  95. CurrentPow++;
  96. }
  97. websocket.send("TTL_SIZE=" + bytesToSize(CurrentMB * filesize));
  98. websocket.send("TTL_TIME=" + CurrentDif + "s");
  99. websocket.send("TTL_BANDWIDTH=" + bytesToSpeed(CurrentMB * filesize / CurrentDif));
  100. }
  101. function uploadTest() {
  102. websocket.send("UPL");
  103. var recv = "";
  104. while (true) {
  105. //Read the websocket input from Client (Web UI)
  106. recv = websocket.read();
  107. if (recv == null) {
  108. console.log("Read Failed!")
  109. break;
  110. }
  111. if (recv == "stop") {
  112. websocket.send("Stopped.");
  113. break;
  114. }
  115. }
  116. }
  117. function pingTest() {
  118. websocket.send("UPL");
  119. var recv = "";
  120. for (var i = 0; i < 3; i++) {
  121. //Read the websocket input from Client (Web UI)
  122. recv = websocket.read();
  123. if (recv == null) {
  124. console.log("Read Failed!")
  125. break;
  126. } else {
  127. var rcvTime = new Date().getTime();
  128. var sendTime = new Date().getTime();
  129. websocket.send(rcvTime + "," + sendTime);
  130. }
  131. if (recv == "stop") {
  132. websocket.send("Stopped.");
  133. break;
  134. }
  135. }
  136. }
  137. //https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript
  138. function rnd(length) {
  139. var result = '';
  140. var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  141. var charactersLength = characters.length;
  142. for (var i = 0; i < length; i++) {
  143. result += characters.charAt(Math.floor(Math.random() *
  144. charactersLength));
  145. }
  146. return result;
  147. }
  148. //https://stackoverflow.com/questions/15900485/correct-way-to-convert-size-in-bytes-to-kb-mb-gb-in-javascript
  149. function bytesToSize(bytes) {
  150. var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
  151. if (bytes == 0) return '0 Byte';
  152. var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
  153. return Math.round((bytes / Math.pow(1024, i)) * 100, 3) / 100 + ' ' + sizes[i];
  154. }
  155. function bytesToSpeed(bytes) {
  156. bytes = bytes * 8;
  157. var sizes = ['bps', 'Kbps', 'Mbps', 'Gbps', 'Tbps'];
  158. if (bytes == 0) return '0 Byte';
  159. var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1000)));
  160. return Math.round((bytes / Math.pow(1000, i)) * 100, 3) / 100 + ' ' + sizes[i];
  161. }