framework_gem 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (872) hide show
  1. checksums.yaml +7 -0
  2. data/lib/EXECUTION_ENGINE.md +282 -0
  3. data/lib/Gemfile +12 -0
  4. data/lib/README.md +138 -0
  5. data/lib/User_Lib/helpers/helpers.rb +13 -0
  6. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_black_rois.rb +7 -0
  7. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_color_rois.rb +9 -0
  8. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_image_rois.rb +7 -0
  9. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_rois.rb +23 -0
  10. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_text_rois.rb +48 -0
  11. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_video_rois.rb +11 -0
  12. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_black_rois.rb +7 -0
  13. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_color_rois.rb +7 -0
  14. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_image_rois.rb +7 -0
  15. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_rois.rb +23 -0
  16. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_text_rois.rb +7 -0
  17. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_video_rois.rb +11 -0
  18. data/lib/User_Lib/rois/apple_tv/apple_tv_black_rois.rb +7 -0
  19. data/lib/User_Lib/rois/apple_tv/apple_tv_color_rois.rb +7 -0
  20. data/lib/User_Lib/rois/apple_tv/apple_tv_image_rois.rb +7 -0
  21. data/lib/User_Lib/rois/apple_tv/apple_tv_rois.rb +23 -0
  22. data/lib/User_Lib/rois/apple_tv/apple_tv_text_rois.rb +7 -0
  23. data/lib/User_Lib/rois/apple_tv/apple_tv_video_rois.rb +7 -0
  24. data/lib/User_Lib/rois/black_rois.rb +33 -0
  25. data/lib/User_Lib/rois/color_rois.rb +38 -0
  26. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_black_rois.rb +8 -0
  27. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_color_rois.rb +8 -0
  28. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_image_rois.rb +8 -0
  29. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_rois.rb +26 -0
  30. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_text_rois.rb +8 -0
  31. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_video_rois.rb +8 -0
  32. data/lib/User_Lib/rois/dta/dta_720/dta_720_black_rois.rb +8 -0
  33. data/lib/User_Lib/rois/dta/dta_720/dta_720_color_rois.rb +8 -0
  34. data/lib/User_Lib/rois/dta/dta_720/dta_720_image_rois.rb +8 -0
  35. data/lib/User_Lib/rois/dta/dta_720/dta_720_rois.rb +26 -0
  36. data/lib/User_Lib/rois/dta/dta_720/dta_720_text_rois.rb +8 -0
  37. data/lib/User_Lib/rois/dta/dta_720/dta_720_video_rois.rb +8 -0
  38. data/lib/User_Lib/rois/dta/dta_black_rois.rb +9 -0
  39. data/lib/User_Lib/rois/dta/dta_color_rois.rb +9 -0
  40. data/lib/User_Lib/rois/dta/dta_image_rois.rb +9 -0
  41. data/lib/User_Lib/rois/dta/dta_rois.rb +26 -0
  42. data/lib/User_Lib/rois/dta/dta_text_rois.rb +9 -0
  43. data/lib/User_Lib/rois/dta/dta_video_rois.rb +9 -0
  44. data/lib/User_Lib/rois/image_rois.rb +38 -0
  45. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_black_rois.rb +8 -0
  46. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_color_rois.rb +8 -0
  47. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_image_rois.rb +8 -0
  48. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_rois.rb +26 -0
  49. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_text_rois.rb +8 -0
  50. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_video_rois.rb +8 -0
  51. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_black_rois.rb +8 -0
  52. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_color_rois.rb +8 -0
  53. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_image_rois.rb +8 -0
  54. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_rois.rb +26 -0
  55. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_text_rois.rb +8 -0
  56. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_video_rois.rb +8 -0
  57. data/lib/User_Lib/rois/mdn/mdn_black_rois.rb +9 -0
  58. data/lib/User_Lib/rois/mdn/mdn_color_rois.rb +9 -0
  59. data/lib/User_Lib/rois/mdn/mdn_image_rois.rb +9 -0
  60. data/lib/User_Lib/rois/mdn/mdn_rois.rb +26 -0
  61. data/lib/User_Lib/rois/mdn/mdn_text_rois.rb +13 -0
  62. data/lib/User_Lib/rois/mdn/mdn_video_rois.rb +9 -0
  63. data/lib/User_Lib/rois/mobile/android/android_black_rois.rb +8 -0
  64. data/lib/User_Lib/rois/mobile/android/android_color_rois.rb +8 -0
  65. data/lib/User_Lib/rois/mobile/android/android_image_rois.rb +8 -0
  66. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_black_rois.rb +8 -0
  67. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_color_rois.rb +8 -0
  68. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_image_rois.rb +43 -0
  69. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_rois.rb +22 -0
  70. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_text_rois.rb +8 -0
  71. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_video_rois.rb +8 -0
  72. data/lib/User_Lib/rois/mobile/android/android_rois.rb +22 -0
  73. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_black_rois.rb +8 -0
  74. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_color_rois.rb +8 -0
  75. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_image_rois.rb +54 -0
  76. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_rois.rb +22 -0
  77. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_text_rois.rb +8 -0
  78. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_video_rois.rb +8 -0
  79. data/lib/User_Lib/rois/mobile/android/android_text_rois.rb +8 -0
  80. data/lib/User_Lib/rois/mobile/android/android_video_rois.rb +8 -0
  81. data/lib/User_Lib/rois/mobile/ios/ios_black_rois.rb +8 -0
  82. data/lib/User_Lib/rois/mobile/ios/ios_color_rois.rb +8 -0
  83. data/lib/User_Lib/rois/mobile/ios/ios_image_rois.rb +8 -0
  84. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_black_rois.rb +8 -0
  85. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_color_rois.rb +8 -0
  86. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_image_rois.rb +8 -0
  87. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_rois.rb +22 -0
  88. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_text_rois.rb +8 -0
  89. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_video_rois.rb +8 -0
  90. data/lib/User_Lib/rois/mobile/ios/ios_rois.rb +22 -0
  91. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_black_rois.rb +8 -0
  92. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_color_rois.rb +8 -0
  93. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_image_rois.rb +8 -0
  94. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_rois.rb +22 -0
  95. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_text_rois.rb +8 -0
  96. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_video_rois.rb +8 -0
  97. data/lib/User_Lib/rois/mobile/ios/ios_text_rois.rb +8 -0
  98. data/lib/User_Lib/rois/mobile/ios/ios_video_rois.rb +8 -0
  99. data/lib/User_Lib/rois/mobile/mobile_black_rois.rb +8 -0
  100. data/lib/User_Lib/rois/mobile/mobile_color_rois.rb +12 -0
  101. data/lib/User_Lib/rois/mobile/mobile_image_rois.rb +38 -0
  102. data/lib/User_Lib/rois/mobile/mobile_rois.rb +22 -0
  103. data/lib/User_Lib/rois/mobile/mobile_text_rois.rb +8 -0
  104. data/lib/User_Lib/rois/mobile/mobile_video_rois.rb +8 -0
  105. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_black_rois.rb +7 -0
  106. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_color_rois.rb +9 -0
  107. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_image_rois.rb +7 -0
  108. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_rois.rb +23 -0
  109. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_text_rois.rb +8 -0
  110. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_video_rois.rb +8 -0
  111. data/lib/User_Lib/rois/passport/passport_720/passport_720_black_rois.rb +7 -0
  112. data/lib/User_Lib/rois/passport/passport_720/passport_720_color_rois.rb +7 -0
  113. data/lib/User_Lib/rois/passport/passport_720/passport_720_image_rois.rb +7 -0
  114. data/lib/User_Lib/rois/passport/passport_720/passport_720_rois.rb +23 -0
  115. data/lib/User_Lib/rois/passport/passport_720/passport_720_text_rois.rb +7 -0
  116. data/lib/User_Lib/rois/passport/passport_720/passport_720_video_rois.rb +7 -0
  117. data/lib/User_Lib/rois/passport/passport_black_rois.rb +7 -0
  118. data/lib/User_Lib/rois/passport/passport_color_rois.rb +7 -0
  119. data/lib/User_Lib/rois/passport/passport_image_rois.rb +7 -0
  120. data/lib/User_Lib/rois/passport/passport_rois.rb +23 -0
  121. data/lib/User_Lib/rois/passport/passport_text_rois.rb +7 -0
  122. data/lib/User_Lib/rois/passport/passport_video_rois.rb +7 -0
  123. data/lib/User_Lib/rois/rois.rb +22 -0
  124. data/lib/User_Lib/rois/roku/roku_720/roku_720_black_rois.rb +37 -0
  125. data/lib/User_Lib/rois/roku/roku_720/roku_720_color_rois.rb +336 -0
  126. data/lib/User_Lib/rois/roku/roku_720/roku_720_image_rois.rb +235 -0
  127. data/lib/User_Lib/rois/roku/roku_720/roku_720_rois.rb +23 -0
  128. data/lib/User_Lib/rois/roku/roku_720/roku_720_text_rois.rb +1523 -0
  129. data/lib/User_Lib/rois/roku/roku_720/roku_720_video_rois.rb +32 -0
  130. data/lib/User_Lib/rois/roku/roku_black_rois.rb +14 -0
  131. data/lib/User_Lib/rois/roku/roku_color_rois.rb +9 -0
  132. data/lib/User_Lib/rois/roku/roku_image_rois.rb +13 -0
  133. data/lib/User_Lib/rois/roku/roku_rois.rb +23 -0
  134. data/lib/User_Lib/rois/roku/roku_text_rois.rb +9 -0
  135. data/lib/User_Lib/rois/roku/roku_video_rois.rb +9 -0
  136. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_black_rois.rb +12 -0
  137. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_color_rois.rb +11 -0
  138. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_image_rois.rb +12 -0
  139. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_rois.rb +23 -0
  140. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_text_rois.rb +12 -0
  141. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_video_rois.rb +12 -0
  142. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_black_rois.rb +12 -0
  143. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_color_rois.rb +12 -0
  144. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_image_rois.rb +12 -0
  145. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_rois.rb +23 -0
  146. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_text_rois.rb +12 -0
  147. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_video_rois.rb +12 -0
  148. data/lib/User_Lib/rois/roku_tv/roku_tv_black_rois.rb +12 -0
  149. data/lib/User_Lib/rois/roku_tv/roku_tv_color_rois.rb +12 -0
  150. data/lib/User_Lib/rois/roku_tv/roku_tv_image_rois.rb +12 -0
  151. data/lib/User_Lib/rois/roku_tv/roku_tv_rois.rb +23 -0
  152. data/lib/User_Lib/rois/roku_tv/roku_tv_text_rois.rb +12 -0
  153. data/lib/User_Lib/rois/roku_tv/roku_tv_video_rois.rb +12 -0
  154. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_black_rois.rb +13 -0
  155. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_color_rois.rb +29 -0
  156. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_image_rois.rb +9 -0
  157. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_rois.rb +23 -0
  158. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_text_rois.rb +92 -0
  159. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_video_rois.rb +11 -0
  160. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_black_rois.rb +9 -0
  161. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_color_rois.rb +9 -0
  162. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_image_rois.rb +9 -0
  163. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_rois.rb +23 -0
  164. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_text_rois.rb +12 -0
  165. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_video_rois.rb +11 -0
  166. data/lib/User_Lib/rois/samsung_tv/samsung_tv_black_rois.rb +9 -0
  167. data/lib/User_Lib/rois/samsung_tv/samsung_tv_color_rois.rb +9 -0
  168. data/lib/User_Lib/rois/samsung_tv/samsung_tv_image_rois.rb +9 -0
  169. data/lib/User_Lib/rois/samsung_tv/samsung_tv_rois.rb +23 -0
  170. data/lib/User_Lib/rois/samsung_tv/samsung_tv_text_rois.rb +12 -0
  171. data/lib/User_Lib/rois/samsung_tv/samsung_tv_video_rois.rb +9 -0
  172. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_black_rois.rb +8 -0
  173. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_color_rois.rb +8 -0
  174. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_image_rois.rb +8 -0
  175. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_rois.rb +26 -0
  176. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_text_rois.rb +8 -0
  177. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_video_rois.rb +8 -0
  178. data/lib/User_Lib/rois/sara/sara_720/sara_720_black_rois.rb +8 -0
  179. data/lib/User_Lib/rois/sara/sara_720/sara_720_color_rois.rb +8 -0
  180. data/lib/User_Lib/rois/sara/sara_720/sara_720_image_rois.rb +8 -0
  181. data/lib/User_Lib/rois/sara/sara_720/sara_720_rois.rb +26 -0
  182. data/lib/User_Lib/rois/sara/sara_720/sara_720_text_rois.rb +8 -0
  183. data/lib/User_Lib/rois/sara/sara_720/sara_720_video_rois.rb +8 -0
  184. data/lib/User_Lib/rois/sara/sara_black_rois.rb +9 -0
  185. data/lib/User_Lib/rois/sara/sara_color_rois.rb +9 -0
  186. data/lib/User_Lib/rois/sara/sara_image_rois.rb +9 -0
  187. data/lib/User_Lib/rois/sara/sara_rois.rb +26 -0
  188. data/lib/User_Lib/rois/sara/sara_text_rois.rb +9 -0
  189. data/lib/User_Lib/rois/sara/sara_video_rois.rb +9 -0
  190. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_black_rois.rb +9 -0
  191. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_color_rois.rb +17 -0
  192. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_image_rois.rb +19 -0
  193. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_rois.rb +23 -0
  194. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_text_rois.rb +47 -0
  195. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_video_rois.rb +23 -0
  196. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_black_rois.rb +9 -0
  197. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_color_rois.rb +9 -0
  198. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_image_rois.rb +9 -0
  199. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_rois.rb +23 -0
  200. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_text_rois.rb +17 -0
  201. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_video_rois.rb +11 -0
  202. data/lib/User_Lib/rois/stb/iguide/iguide_black_rois.rb +9 -0
  203. data/lib/User_Lib/rois/stb/iguide/iguide_color_rois.rb +9 -0
  204. data/lib/User_Lib/rois/stb/iguide/iguide_image_rois.rb +9 -0
  205. data/lib/User_Lib/rois/stb/iguide/iguide_rois.rb +23 -0
  206. data/lib/User_Lib/rois/stb/iguide/iguide_text_rois.rb +9 -0
  207. data/lib/User_Lib/rois/stb/iguide/iguide_video_rois.rb +9 -0
  208. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_black_rois.rb +8 -0
  209. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_color_rois.rb +8 -0
  210. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_image_rois.rb +12 -0
  211. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_rois.rb +23 -0
  212. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_text_rois.rb +23 -0
  213. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_video_rois.rb +11 -0
  214. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_black_rois.rb +46 -0
  215. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_color_rois.rb +142 -0
  216. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_image_rois.rb +103 -0
  217. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_black_rois.rb +6 -0
  218. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_color_rois.rb +6 -0
  219. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_image_rois.rb +6 -0
  220. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_rois.rb +23 -0
  221. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_text_rois.rb +7 -0
  222. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_video_rois.rb +7 -0
  223. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_rois.rb +23 -0
  224. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_black_rois.rb +6 -0
  225. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_color_rois.rb +6 -0
  226. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_image_rois.rb +6 -0
  227. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_rois.rb +23 -0
  228. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_text_rois.rb +7 -0
  229. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_video_rois.rb +7 -0
  230. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_black_rois.rb +6 -0
  231. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_color_rois.rb +77 -0
  232. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_image_rois.rb +67 -0
  233. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_rois.rb +23 -0
  234. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_text_rois.rb +159 -0
  235. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_video_rois.rb +17 -0
  236. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_text_rois.rb +221 -0
  237. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_video_rois.rb +26 -0
  238. data/lib/User_Lib/rois/stb/odn/odn_black_rois.rb +10 -0
  239. data/lib/User_Lib/rois/stb/odn/odn_color_rois.rb +10 -0
  240. data/lib/User_Lib/rois/stb/odn/odn_image_rois.rb +58 -0
  241. data/lib/User_Lib/rois/stb/odn/odn_rois.rb +23 -0
  242. data/lib/User_Lib/rois/stb/odn/odn_text_rois.rb +70 -0
  243. data/lib/User_Lib/rois/stb/odn/odn_video_rois.rb +19 -0
  244. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_black_rois.rb +16 -0
  245. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_color_rois.rb +373 -0
  246. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_black_rois.rb +7 -0
  247. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_color_rois.rb +7 -0
  248. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_image_rois.rb +7 -0
  249. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_rois.rb +23 -0
  250. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_text_rois.rb +7 -0
  251. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_video_rois.rb +7 -0
  252. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_black_rois.rb +8 -0
  253. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_color_rois.rb +8 -0
  254. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_image_rois.rb +8 -0
  255. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_rois.rb +26 -0
  256. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_text_rois.rb +8 -0
  257. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_video_rois.rb +8 -0
  258. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_black_rois.rb +8 -0
  259. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_color_rois.rb +8 -0
  260. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_image_rois.rb +8 -0
  261. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_rois.rb +26 -0
  262. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_text_rois.rb +8 -0
  263. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_video_rois.rb +8 -0
  264. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_black_rois.rb +8 -0
  265. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_color_rois.rb +8 -0
  266. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_image_rois.rb +8 -0
  267. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_rois.rb +26 -0
  268. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_text_rois.rb +8 -0
  269. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_video_rois.rb +8 -0
  270. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_image_rois.rb +1592 -0
  271. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_black_rois.rb +7 -0
  272. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_color_rois.rb +7 -0
  273. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_image_rois.rb +7 -0
  274. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_rois.rb +23 -0
  275. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_text_rois.rb +7 -0
  276. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_video_rois.rb +7 -0
  277. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_rois.rb +23 -0
  278. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_text_rois.rb +2489 -0
  279. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_video_rois.rb +64 -0
  280. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_black_rois.rb +7 -0
  281. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_color_rois.rb +63 -0
  282. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_black_rois.rb +8 -0
  283. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_color_rois.rb +8 -0
  284. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_image_rois.rb +8 -0
  285. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_rois.rb +26 -0
  286. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_text_rois.rb +8 -0
  287. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_video_rois.rb +8 -0
  288. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_black_rois.rb +8 -0
  289. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_color_rois.rb +8 -0
  290. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_image_rois.rb +8 -0
  291. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_rois.rb +26 -0
  292. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_text_rois.rb +8 -0
  293. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_video_rois.rb +8 -0
  294. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_black_rois.rb +8 -0
  295. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_color_rois.rb +8 -0
  296. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_image_rois.rb +8 -0
  297. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_rois.rb +26 -0
  298. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_text_rois.rb +8 -0
  299. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_video_rois.rb +8 -0
  300. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_image_rois.rb +117 -0
  301. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_rois.rb +23 -0
  302. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_text_rois.rb +84 -0
  303. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_video_rois.rb +35 -0
  304. data/lib/User_Lib/rois/stb/spectrum/spectrum_black_rois.rb +9 -0
  305. data/lib/User_Lib/rois/stb/spectrum/spectrum_color_rois.rb +17 -0
  306. data/lib/User_Lib/rois/stb/spectrum/spectrum_image_rois.rb +49 -0
  307. data/lib/User_Lib/rois/stb/spectrum/spectrum_rois.rb +23 -0
  308. data/lib/User_Lib/rois/stb/spectrum/spectrum_text_rois.rb +51 -0
  309. data/lib/User_Lib/rois/stb/spectrum/spectrum_video_rois.rb +9 -0
  310. data/lib/User_Lib/rois/stb/stb_black_rois.rb +9 -0
  311. data/lib/User_Lib/rois/stb/stb_color_rois.rb +9 -0
  312. data/lib/User_Lib/rois/stb/stb_image_rois.rb +9 -0
  313. data/lib/User_Lib/rois/stb/stb_rois.rb +23 -0
  314. data/lib/User_Lib/rois/stb/stb_text_rois.rb +9 -0
  315. data/lib/User_Lib/rois/stb/stb_video_rois.rb +9 -0
  316. data/lib/User_Lib/rois/template.txt +23 -0
  317. data/lib/User_Lib/rois/text_rois.rb +36 -0
  318. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_black_rois.rb +7 -0
  319. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_color_rois.rb +9 -0
  320. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_image_rois.rb +7 -0
  321. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_rois.rb +23 -0
  322. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_text_rois.rb +9 -0
  323. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_video_rois.rb +7 -0
  324. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_black_rois.rb +7 -0
  325. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_color_rois.rb +7 -0
  326. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_image_rois.rb +7 -0
  327. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_rois.rb +23 -0
  328. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_text_rois.rb +7 -0
  329. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_video_rois.rb +7 -0
  330. data/lib/User_Lib/rois/tivo/tivo_black_rois.rb +7 -0
  331. data/lib/User_Lib/rois/tivo/tivo_color_rois.rb +7 -0
  332. data/lib/User_Lib/rois/tivo/tivo_image_rois.rb +7 -0
  333. data/lib/User_Lib/rois/tivo/tivo_rois.rb +23 -0
  334. data/lib/User_Lib/rois/tivo/tivo_text_rois.rb +7 -0
  335. data/lib/User_Lib/rois/tivo/tivo_video_rois.rb +7 -0
  336. data/lib/User_Lib/rois/video_rois.rb +33 -0
  337. data/lib/User_Lib/screen/apple_tv/apple_tv_dvr.rb +25 -0
  338. data/lib/User_Lib/screen/apple_tv/apple_tv_guide.rb +25 -0
  339. data/lib/User_Lib/screen/apple_tv/apple_tv_library.rb +25 -0
  340. data/lib/User_Lib/screen/apple_tv/apple_tv_live_tv.rb +17 -0
  341. data/lib/User_Lib/screen/apple_tv/apple_tv_login.rb +24 -0
  342. data/lib/User_Lib/screen/apple_tv/apple_tv_main_menu.rb +25 -0
  343. data/lib/User_Lib/screen/apple_tv/apple_tv_mini_guide.rb +25 -0
  344. data/lib/User_Lib/screen/apple_tv/apple_tv_movies.rb +25 -0
  345. data/lib/User_Lib/screen/apple_tv/apple_tv_on_demand.rb +25 -0
  346. data/lib/User_Lib/screen/apple_tv/apple_tv_parental_controls.rb +25 -0
  347. data/lib/User_Lib/screen/apple_tv/apple_tv_product_page.rb +25 -0
  348. data/lib/User_Lib/screen/apple_tv/apple_tv_screen.rb +23 -0
  349. data/lib/User_Lib/screen/apple_tv/apple_tv_search.rb +31 -0
  350. data/lib/User_Lib/screen/apple_tv/apple_tv_settings.rb +25 -0
  351. data/lib/User_Lib/screen/apple_tv/apple_tv_tv_shows.rb +25 -0
  352. data/lib/User_Lib/screen/apple_tv/apple_tv_video_store.rb +25 -0
  353. data/lib/User_Lib/screen/dta/dta_dvr.rb +26 -0
  354. data/lib/User_Lib/screen/dta/dta_guide.rb +26 -0
  355. data/lib/User_Lib/screen/dta/dta_library.rb +26 -0
  356. data/lib/User_Lib/screen/dta/dta_live_tv.rb +26 -0
  357. data/lib/User_Lib/screen/dta/dta_log_in.rb +26 -0
  358. data/lib/User_Lib/screen/dta/dta_main_menu.rb +26 -0
  359. data/lib/User_Lib/screen/dta/dta_mini_guide.rb +26 -0
  360. data/lib/User_Lib/screen/dta/dta_movies.rb +26 -0
  361. data/lib/User_Lib/screen/dta/dta_on_demand.rb +26 -0
  362. data/lib/User_Lib/screen/dta/dta_parental_controls.rb +26 -0
  363. data/lib/User_Lib/screen/dta/dta_product_page.rb +26 -0
  364. data/lib/User_Lib/screen/dta/dta_screen.rb +24 -0
  365. data/lib/User_Lib/screen/dta/dta_search.rb +26 -0
  366. data/lib/User_Lib/screen/dta/dta_settings.rb +26 -0
  367. data/lib/User_Lib/screen/dta/dta_tv_shows.rb +26 -0
  368. data/lib/User_Lib/screen/dta/dta_video_store.rb +26 -0
  369. data/lib/User_Lib/screen/mdn/mdn_dvr.rb +26 -0
  370. data/lib/User_Lib/screen/mdn/mdn_guide.rb +26 -0
  371. data/lib/User_Lib/screen/mdn/mdn_library.rb +26 -0
  372. data/lib/User_Lib/screen/mdn/mdn_live_tv.rb +26 -0
  373. data/lib/User_Lib/screen/mdn/mdn_log_in.rb +26 -0
  374. data/lib/User_Lib/screen/mdn/mdn_main_menu.rb +26 -0
  375. data/lib/User_Lib/screen/mdn/mdn_mini_guide.rb +26 -0
  376. data/lib/User_Lib/screen/mdn/mdn_movies.rb +26 -0
  377. data/lib/User_Lib/screen/mdn/mdn_on_demand.rb +26 -0
  378. data/lib/User_Lib/screen/mdn/mdn_parental_controls.rb +26 -0
  379. data/lib/User_Lib/screen/mdn/mdn_product_page.rb +26 -0
  380. data/lib/User_Lib/screen/mdn/mdn_screen.rb +24 -0
  381. data/lib/User_Lib/screen/mdn/mdn_search.rb +26 -0
  382. data/lib/User_Lib/screen/mdn/mdn_settings.rb +26 -0
  383. data/lib/User_Lib/screen/mdn/mdn_tv_shows.rb +26 -0
  384. data/lib/User_Lib/screen/mdn/mdn_video_store.rb +26 -0
  385. data/lib/User_Lib/screen/mobile/android/android_devices.rb +35 -0
  386. data/lib/User_Lib/screen/mobile/android/android_dvr.rb +337 -0
  387. data/lib/User_Lib/screen/mobile/android/android_favorites.rb +164 -0
  388. data/lib/User_Lib/screen/mobile/android/android_guide.rb +256 -0
  389. data/lib/User_Lib/screen/mobile/android/android_live_tv.rb +372 -0
  390. data/lib/User_Lib/screen/mobile/android/android_login.rb +111 -0
  391. data/lib/User_Lib/screen/mobile/android/android_main_menu.rb +53 -0
  392. data/lib/User_Lib/screen/mobile/android/android_on_demand.rb +402 -0
  393. data/lib/User_Lib/screen/mobile/android/android_parental_controls.rb +73 -0
  394. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_dvr.rb +31 -0
  395. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_guide.rb +39 -0
  396. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_live_tv.rb +104 -0
  397. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_main_menu.rb +27 -0
  398. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_on_demand.rb +35 -0
  399. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_product_page.rb +7 -0
  400. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_search.rb +26 -0
  401. data/lib/User_Lib/screen/mobile/android/android_privacy_legal.rb +54 -0
  402. data/lib/User_Lib/screen/mobile/android/android_product_page.rb +484 -0
  403. data/lib/User_Lib/screen/mobile/android/android_screen.rb +56 -0
  404. data/lib/User_Lib/screen/mobile/android/android_search.rb +39 -0
  405. data/lib/User_Lib/screen/mobile/android/android_settings.rb +90 -0
  406. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_dvr.rb +58 -0
  407. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_guide.rb +24 -0
  408. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_live_tv.rb +24 -0
  409. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_main_menu.rb +19 -0
  410. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_on_demand.rb +16 -0
  411. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_product_page.rb +45 -0
  412. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_search.rb +14 -0
  413. data/lib/User_Lib/screen/mobile/devices_mobile.rb +53 -0
  414. data/lib/User_Lib/screen/mobile/dvr_mobile.rb +5 -0
  415. data/lib/User_Lib/screen/mobile/favorites_mobile.rb +5 -0
  416. data/lib/User_Lib/screen/mobile/guide_mobile.rb +5 -0
  417. data/lib/User_Lib/screen/mobile/ios/ios_devices.rb +43 -0
  418. data/lib/User_Lib/screen/mobile/ios/ios_dvr.rb +231 -0
  419. data/lib/User_Lib/screen/mobile/ios/ios_favorites.rb +79 -0
  420. data/lib/User_Lib/screen/mobile/ios/ios_guide.rb +53 -0
  421. data/lib/User_Lib/screen/mobile/ios/ios_live_tv.rb +413 -0
  422. data/lib/User_Lib/screen/mobile/ios/ios_login.rb +76 -0
  423. data/lib/User_Lib/screen/mobile/ios/ios_main_menu.rb +38 -0
  424. data/lib/User_Lib/screen/mobile/ios/ios_on_demand.rb +371 -0
  425. data/lib/User_Lib/screen/mobile/ios/ios_parental_controls.rb +104 -0
  426. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_dvr.rb +14 -0
  427. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_live_tv.rb +36 -0
  428. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_main_menu.rb +7 -0
  429. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_on_demand.rb +7 -0
  430. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_search.rb +13 -0
  431. data/lib/User_Lib/screen/mobile/ios/ios_privacy_legal.rb +56 -0
  432. data/lib/User_Lib/screen/mobile/ios/ios_product_page.rb +441 -0
  433. data/lib/User_Lib/screen/mobile/ios/ios_screen.rb +60 -0
  434. data/lib/User_Lib/screen/mobile/ios/ios_search.rb +145 -0
  435. data/lib/User_Lib/screen/mobile/ios/ios_settings.rb +34 -0
  436. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_live_tv.rb +34 -0
  437. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_main_menu.rb +7 -0
  438. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_on_demand.rb +7 -0
  439. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_search.rb +13 -0
  440. data/lib/User_Lib/screen/mobile/live_tv_mobile.rb +73 -0
  441. data/lib/User_Lib/screen/mobile/login_mobile.rb +5 -0
  442. data/lib/User_Lib/screen/mobile/main_menu_mobile.rb +83 -0
  443. data/lib/User_Lib/screen/mobile/mobile_screen.rb +232 -0
  444. data/lib/User_Lib/screen/mobile/on_demand_mobile.rb +70 -0
  445. data/lib/User_Lib/screen/mobile/parental_controls_mobile.rb +5 -0
  446. data/lib/User_Lib/screen/mobile/privacy_legal_mobile.rb +5 -0
  447. data/lib/User_Lib/screen/mobile/product_page_mobile.rb +5 -0
  448. data/lib/User_Lib/screen/mobile/search_mobile.rb +5 -0
  449. data/lib/User_Lib/screen/mobile/settings_mobile.rb +33 -0
  450. data/lib/User_Lib/screen/passport/passport_dvr.rb +25 -0
  451. data/lib/User_Lib/screen/passport/passport_guide.rb +37 -0
  452. data/lib/User_Lib/screen/passport/passport_library.rb +25 -0
  453. data/lib/User_Lib/screen/passport/passport_live_tv.rb +17 -0
  454. data/lib/User_Lib/screen/passport/passport_main_menu.rb +25 -0
  455. data/lib/User_Lib/screen/passport/passport_mini_guide.rb +25 -0
  456. data/lib/User_Lib/screen/passport/passport_movies.rb +25 -0
  457. data/lib/User_Lib/screen/passport/passport_on_demand.rb +25 -0
  458. data/lib/User_Lib/screen/passport/passport_parental_controls.rb +25 -0
  459. data/lib/User_Lib/screen/passport/passport_product_page.rb +25 -0
  460. data/lib/User_Lib/screen/passport/passport_screen.rb +23 -0
  461. data/lib/User_Lib/screen/passport/passport_search.rb +25 -0
  462. data/lib/User_Lib/screen/passport/passport_settings.rb +25 -0
  463. data/lib/User_Lib/screen/passport/passport_tv_shows.rb +25 -0
  464. data/lib/User_Lib/screen/passport/passport_video_store.rb +25 -0
  465. data/lib/User_Lib/screen/roku/brs/roku_guide_brs.rb +12 -0
  466. data/lib/User_Lib/screen/roku/brs/roku_home_brs.rb +12 -0
  467. data/lib/User_Lib/screen/roku/brs/roku_live_tv_brs.rb +12 -0
  468. data/lib/User_Lib/screen/roku/brs/roku_login_brs.rb +103 -0
  469. data/lib/User_Lib/screen/roku/brs/roku_main_menu_brs.rb +46 -0
  470. data/lib/User_Lib/screen/roku/brs/roku_on_demand_brs.rb +12 -0
  471. data/lib/User_Lib/screen/roku/brs/roku_product_page_brs.rb +12 -0
  472. data/lib/User_Lib/screen/roku/brs/roku_screen_brs.rb +9 -0
  473. data/lib/User_Lib/screen/roku/brs/roku_search_brs.rb +12 -0
  474. data/lib/User_Lib/screen/roku/brs/roku_settings_brs.rb +42 -0
  475. data/lib/User_Lib/screen/roku/brs/roku_watch_later_brs.rb +12 -0
  476. data/lib/User_Lib/screen/roku/brs/roku_welcome_brs.rb +12 -0
  477. data/lib/User_Lib/screen/roku/roku_dvr.rb +7 -0
  478. data/lib/User_Lib/screen/roku/roku_guide.rb +590 -0
  479. data/lib/User_Lib/screen/roku/roku_home.rb +346 -0
  480. data/lib/User_Lib/screen/roku/roku_library.rb +26 -0
  481. data/lib/User_Lib/screen/roku/roku_live_tv.rb +210 -0
  482. data/lib/User_Lib/screen/roku/roku_login.rb +795 -0
  483. data/lib/User_Lib/screen/roku/roku_main_menu.rb +425 -0
  484. data/lib/User_Lib/screen/roku/roku_mini_guide.rb +7 -0
  485. data/lib/User_Lib/screen/roku/roku_on_demand.rb +479 -0
  486. data/lib/User_Lib/screen/roku/roku_product_page.rb +483 -0
  487. data/lib/User_Lib/screen/roku/roku_screen.rb +85 -0
  488. data/lib/User_Lib/screen/roku/roku_search.rb +229 -0
  489. data/lib/User_Lib/screen/roku/roku_settings.rb +304 -0
  490. data/lib/User_Lib/screen/roku/roku_watch_later.rb +51 -0
  491. data/lib/User_Lib/screen/roku/roku_welcome.rb +10 -0
  492. data/lib/User_Lib/screen/roku_tv/roku_tv_dvr.rb +14 -0
  493. data/lib/User_Lib/screen/roku_tv/roku_tv_guide.rb +14 -0
  494. data/lib/User_Lib/screen/roku_tv/roku_tv_home.rb +14 -0
  495. data/lib/User_Lib/screen/roku_tv/roku_tv_library.rb +14 -0
  496. data/lib/User_Lib/screen/roku_tv/roku_tv_live_tv.rb +14 -0
  497. data/lib/User_Lib/screen/roku_tv/roku_tv_login.rb +14 -0
  498. data/lib/User_Lib/screen/roku_tv/roku_tv_main_menu.rb +14 -0
  499. data/lib/User_Lib/screen/roku_tv/roku_tv_mini_guide.rb +14 -0
  500. data/lib/User_Lib/screen/roku_tv/roku_tv_on_demand.rb +26 -0
  501. data/lib/User_Lib/screen/roku_tv/roku_tv_product_page.rb +14 -0
  502. data/lib/User_Lib/screen/roku_tv/roku_tv_screen.rb +7 -0
  503. data/lib/User_Lib/screen/roku_tv/roku_tv_search.rb +14 -0
  504. data/lib/User_Lib/screen/roku_tv/roku_tv_settings.rb +14 -0
  505. data/lib/User_Lib/screen/roku_tv/roku_tv_watch_later.rb +14 -0
  506. data/lib/User_Lib/screen/roku_tv/roku_tv_welcome.rb +14 -0
  507. data/lib/User_Lib/screen/samsung_tv/samsung_tv_dvr.rb +24 -0
  508. data/lib/User_Lib/screen/samsung_tv/samsung_tv_guide.rb +24 -0
  509. data/lib/User_Lib/screen/samsung_tv/samsung_tv_library.rb +24 -0
  510. data/lib/User_Lib/screen/samsung_tv/samsung_tv_live_tv.rb +21 -0
  511. data/lib/User_Lib/screen/samsung_tv/samsung_tv_login.rb +13 -0
  512. data/lib/User_Lib/screen/samsung_tv/samsung_tv_main_menu.rb +64 -0
  513. data/lib/User_Lib/screen/samsung_tv/samsung_tv_mini_guide.rb +24 -0
  514. data/lib/User_Lib/screen/samsung_tv/samsung_tv_movies.rb +140 -0
  515. data/lib/User_Lib/screen/samsung_tv/samsung_tv_on_demand.rb +76 -0
  516. data/lib/User_Lib/screen/samsung_tv/samsung_tv_parental_controls.rb +24 -0
  517. data/lib/User_Lib/screen/samsung_tv/samsung_tv_product_page.rb +24 -0
  518. data/lib/User_Lib/screen/samsung_tv/samsung_tv_screen.rb +74 -0
  519. data/lib/User_Lib/screen/samsung_tv/samsung_tv_search.rb +29 -0
  520. data/lib/User_Lib/screen/samsung_tv/samsung_tv_settings.rb +189 -0
  521. data/lib/User_Lib/screen/samsung_tv/samsung_tv_tv_shows.rb +24 -0
  522. data/lib/User_Lib/screen/samsung_tv/samsung_tv_video_store.rb +24 -0
  523. data/lib/User_Lib/screen/sara/sara_dvr.rb +26 -0
  524. data/lib/User_Lib/screen/sara/sara_guide.rb +43 -0
  525. data/lib/User_Lib/screen/sara/sara_library.rb +26 -0
  526. data/lib/User_Lib/screen/sara/sara_live_tv.rb +26 -0
  527. data/lib/User_Lib/screen/sara/sara_log_in.rb +26 -0
  528. data/lib/User_Lib/screen/sara/sara_main_menu.rb +26 -0
  529. data/lib/User_Lib/screen/sara/sara_mini_guide.rb +26 -0
  530. data/lib/User_Lib/screen/sara/sara_movies.rb +26 -0
  531. data/lib/User_Lib/screen/sara/sara_on_demand.rb +26 -0
  532. data/lib/User_Lib/screen/sara/sara_parental_controls.rb +26 -0
  533. data/lib/User_Lib/screen/sara/sara_product_page.rb +26 -0
  534. data/lib/User_Lib/screen/sara/sara_screen.rb +24 -0
  535. data/lib/User_Lib/screen/sara/sara_search.rb +26 -0
  536. data/lib/User_Lib/screen/sara/sara_settings.rb +26 -0
  537. data/lib/User_Lib/screen/sara/sara_tv_shows.rb +26 -0
  538. data/lib/User_Lib/screen/sara/sara_video_store.rb +26 -0
  539. data/lib/User_Lib/screen/stb/iguide/iguide_devices.rb +10 -0
  540. data/lib/User_Lib/screen/stb/iguide/iguide_dvr.rb +10 -0
  541. data/lib/User_Lib/screen/stb/iguide/iguide_favorites.rb +10 -0
  542. data/lib/User_Lib/screen/stb/iguide/iguide_guide.rb +39 -0
  543. data/lib/User_Lib/screen/stb/iguide/iguide_home.rb +10 -0
  544. data/lib/User_Lib/screen/stb/iguide/iguide_library.rb +10 -0
  545. data/lib/User_Lib/screen/stb/iguide/iguide_live_tv.rb +59 -0
  546. data/lib/User_Lib/screen/stb/iguide/iguide_login.rb +10 -0
  547. data/lib/User_Lib/screen/stb/iguide/iguide_main_menu.rb +10 -0
  548. data/lib/User_Lib/screen/stb/iguide/iguide_mini_guide.rb +10 -0
  549. data/lib/User_Lib/screen/stb/iguide/iguide_movies.rb +10 -0
  550. data/lib/User_Lib/screen/stb/iguide/iguide_on_demand.rb +531 -0
  551. data/lib/User_Lib/screen/stb/iguide/iguide_parental_controls.rb +10 -0
  552. data/lib/User_Lib/screen/stb/iguide/iguide_privacy_legal.rb +10 -0
  553. data/lib/User_Lib/screen/stb/iguide/iguide_product_page.rb +10 -0
  554. data/lib/User_Lib/screen/stb/iguide/iguide_quick_menu.rb +7 -0
  555. data/lib/User_Lib/screen/stb/iguide/iguide_screen.rb +21 -0
  556. data/lib/User_Lib/screen/stb/iguide/iguide_search.rb +10 -0
  557. data/lib/User_Lib/screen/stb/iguide/iguide_settings.rb +10 -0
  558. data/lib/User_Lib/screen/stb/iguide/iguide_tv_shows.rb +10 -0
  559. data/lib/User_Lib/screen/stb/iguide/iguide_video_store.rb +10 -0
  560. data/lib/User_Lib/screen/stb/login_stb.rb +5 -0
  561. data/lib/User_Lib/screen/stb/odn/odn_dvr.rb +59 -0
  562. data/lib/User_Lib/screen/stb/odn/odn_favorites.rb +8 -0
  563. data/lib/User_Lib/screen/stb/odn/odn_guide.rb +177 -0
  564. data/lib/User_Lib/screen/stb/odn/odn_live_tv.rb +115 -0
  565. data/lib/User_Lib/screen/stb/odn/odn_login.rb +8 -0
  566. data/lib/User_Lib/screen/stb/odn/odn_main_menu.rb +175 -0
  567. data/lib/User_Lib/screen/stb/odn/odn_on_demand.rb +1170 -0
  568. data/lib/User_Lib/screen/stb/odn/odn_on_demand_kids.rb +23 -0
  569. data/lib/User_Lib/screen/stb/odn/odn_on_demand_left_menu.rb +180 -0
  570. data/lib/User_Lib/screen/stb/odn/odn_parental_controls.rb +9 -0
  571. data/lib/User_Lib/screen/stb/odn/odn_product_page.rb +8 -0
  572. data/lib/User_Lib/screen/stb/odn/odn_screen.rb +111 -0
  573. data/lib/User_Lib/screen/stb/odn/odn_search.rb +167 -0
  574. data/lib/User_Lib/screen/stb/odn/odn_settings.rb +142 -0
  575. data/lib/User_Lib/screen/stb/spectrum/spectrum_diagnostics.rb +27 -0
  576. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/screen_spectrum_docsis.rb +12 -0
  577. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_guide.rb +10 -0
  578. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_main_menu.rb +10 -0
  579. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_settings.rb +10 -0
  580. data/lib/User_Lib/screen/stb/spectrum/spectrum_dvr.rb +1781 -0
  581. data/lib/User_Lib/screen/stb/spectrum/spectrum_guide.rb +841 -0
  582. data/lib/User_Lib/screen/stb/spectrum/spectrum_library.rb +384 -0
  583. data/lib/User_Lib/screen/stb/spectrum/spectrum_live_tv.rb +259 -0
  584. data/lib/User_Lib/screen/stb/spectrum/spectrum_main_menu.rb +223 -0
  585. data/lib/User_Lib/screen/stb/spectrum/spectrum_mini_guide.rb +404 -0
  586. data/lib/User_Lib/screen/stb/spectrum/spectrum_movies.rb +420 -0
  587. data/lib/User_Lib/screen/stb/spectrum/spectrum_netflix.rb +37 -0
  588. data/lib/User_Lib/screen/stb/spectrum/spectrum_on_demand.rb +2137 -0
  589. data/lib/User_Lib/screen/stb/spectrum/spectrum_parental_controls.rb +528 -0
  590. data/lib/User_Lib/screen/stb/spectrum/spectrum_pay_per_view.rb +26 -0
  591. data/lib/User_Lib/screen/stb/spectrum/spectrum_product_page.rb +58 -0
  592. data/lib/User_Lib/screen/stb/spectrum/spectrum_screen.rb +48 -0
  593. data/lib/User_Lib/screen/stb/spectrum/spectrum_search.rb +92 -0
  594. data/lib/User_Lib/screen/stb/spectrum/spectrum_settings.rb +1657 -0
  595. data/lib/User_Lib/screen/stb/spectrum/spectrum_tv_shows.rb +1532 -0
  596. data/lib/User_Lib/screen/stb/spectrum/spectrum_video_store.rb +1598 -0
  597. data/lib/User_Lib/screen/stb/stb_screen.rb +7 -0
  598. data/lib/User_Lib/screen/tivo/tivo_dvr.rb +25 -0
  599. data/lib/User_Lib/screen/tivo/tivo_guide.rb +25 -0
  600. data/lib/User_Lib/screen/tivo/tivo_library.rb +25 -0
  601. data/lib/User_Lib/screen/tivo/tivo_live_tv.rb +17 -0
  602. data/lib/User_Lib/screen/tivo/tivo_login.rb +25 -0
  603. data/lib/User_Lib/screen/tivo/tivo_main_menu.rb +25 -0
  604. data/lib/User_Lib/screen/tivo/tivo_mini_guide.rb +25 -0
  605. data/lib/User_Lib/screen/tivo/tivo_movies.rb +25 -0
  606. data/lib/User_Lib/screen/tivo/tivo_on_demand.rb +25 -0
  607. data/lib/User_Lib/screen/tivo/tivo_parental_controls.rb +25 -0
  608. data/lib/User_Lib/screen/tivo/tivo_product_page.rb +25 -0
  609. data/lib/User_Lib/screen/tivo/tivo_screen.rb +20 -0
  610. data/lib/User_Lib/screen/tivo/tivo_search.rb +31 -0
  611. data/lib/User_Lib/screen/tivo/tivo_settings.rb +25 -0
  612. data/lib/User_Lib/screen/tivo/tivo_tv_shows.rb +25 -0
  613. data/lib/User_Lib/screen/tivo/tivo_video_store.rb +25 -0
  614. data/lib/config/ConfigParams.xml +96 -0
  615. data/lib/config/ImageROI.xml +45 -0
  616. data/lib/config/ROI.xml +150 -0
  617. data/lib/config/Userlog4j.xml +62 -0
  618. data/lib/config/schema-docs/mode.xsd +12 -0
  619. data/lib/config/schema-docs/processTestJobs.xsd +63 -0
  620. data/lib/config/schema-docs/rackip.xsd +24 -0
  621. data/lib/copy_ref_images.rb +199 -0
  622. data/lib/copy_repo.rb +136 -0
  623. data/lib/diagnostics/conductor/conductor_checkup.tmc +24 -0
  624. data/lib/diagnostics/db/mad_db_check.tmc +56 -0
  625. data/lib/diagnostics/db/mas_db_checkup.tmc +24 -0
  626. data/lib/diagnostics/db/mas_db_checkup_gem.tmc +20 -0
  627. data/lib/diagnostics/db/mas_db_checkup_jar.tmc +50 -0
  628. data/lib/diagnostics/iguide/iguide_nvram_reset.tmc +23 -0
  629. data/lib/diagnostics/iguide/iguide_prepare_stb.tmc +33 -0
  630. data/lib/diagnostics/iguide/iguide_prepare_stb_and_health_check.tmc +63 -0
  631. data/lib/diagnostics/iguide/iguide_stb_health_check.tmc +54 -0
  632. data/lib/diagnostics/prepare_stb.tmc +30 -0
  633. data/lib/diagnostics/prepare_stb_and_health_check.tmc +56 -0
  634. data/lib/diagnostics/script_options/options_checkup.tmc +145 -0
  635. data/lib/diagnostics/server_components_check.tmc +62 -0
  636. data/lib/diagnostics/ssh/dncs_checkup.tmc +24 -0
  637. data/lib/diagnostics/ssh/mas_checkup.tmc +24 -0
  638. data/lib/diagnostics/stb_health_check.tmc +46 -0
  639. data/lib/diagnostics/stb_ip_check.tmc +120 -0
  640. data/lib/diagnostics/webservices/mas_rest_services_checkup.tmc +24 -0
  641. data/lib/diagnostics/webservices/mas_soap_services_checkup.tmc +24 -0
  642. data/lib/dsllib/common/dncs/dncs_utils.rb +449 -0
  643. data/lib/dsllib/common/mas_db/mas_conductor.rb +1328 -0
  644. data/lib/dsllib/common/mas_db/mas_db.rb +154 -0
  645. data/lib/dsllib/common/mas_db/mas_publish.rb +2349 -0
  646. data/lib/dsllib/common/mas_db/mas_rest_services.rb +75 -0
  647. data/lib/dsllib/common/mas_db/mas_soap_services.rb +540 -0
  648. data/lib/dsllib/common/mas_db/mas_utils.rb +422 -0
  649. data/lib/dsllib/common/remote_diagnostics/mdn_remote_diagnostics.rb +1335 -0
  650. data/lib/dsllib/common/remote_diagnostics/odn_web_server.rb +269 -0
  651. data/lib/dsllib/common/utils/excel_export.rb +273 -0
  652. data/lib/dsllib/common/utils/excel_module.rb +890 -0
  653. data/lib/dsllib/common/utils/server_components_utils.rb +130 -0
  654. data/lib/dsllib/common/utils/stb_health_check_utils.rb +92 -0
  655. data/lib/dsllib/common/utils/sword_utils.rb +393 -0
  656. data/lib/dsllib/common/utils/tmc_utils.rb +2944 -0
  657. data/lib/dsllib/common/utils/virtual_keyboard_navigator.rb +208 -0
  658. data/lib/dsllib/common/utils/virtual_keyboard_vp_navigator.rb +195 -0
  659. data/lib/dsllib/performance/DTA/roi.rb +214 -0
  660. data/lib/dsllib/performance/DTA/utils.rb +96 -0
  661. data/lib/dsllib/performance/iguide_concurrent_test/ROI.rb +236 -0
  662. data/lib/dsllib/performance/iguide_concurrent_test/utils.rb +533 -0
  663. data/lib/dsllib/performance/measure_tune.rb +438 -0
  664. data/lib/dsllib/performance/perf_lib.rb +660 -0
  665. data/lib/end_iteration.rb +4 -0
  666. data/lib/lib/data_services/channel.rb +39 -0
  667. data/lib/lib/data_services/data_services.rb +14 -0
  668. data/lib/lib/data_services/guide.rb +104 -0
  669. data/lib/lib/data_services/lineup.rb +114 -0
  670. data/lib/lib/data_services/program.rb +48 -0
  671. data/lib/lib/data_services/schedule.rb +18 -0
  672. data/lib/lib/data_services/splunk_connector.rb +135 -0
  673. data/lib/lib/data_services/splunk_data_reader.rb +77 -0
  674. data/lib/lib/element/element.rb +79 -0
  675. data/lib/lib/extensions/array_extensions.rb +32 -0
  676. data/lib/lib/extensions/datetime_extensions.rb +8 -0
  677. data/lib/lib/extensions/extensions.rb +51 -0
  678. data/lib/lib/extensions/file_extensions.rb +32 -0
  679. data/lib/lib/extensions/float_extensions.rb +32 -0
  680. data/lib/lib/extensions/integer_extensions.rb +39 -0
  681. data/lib/lib/extensions/nethttp_extensions.rb +11 -0
  682. data/lib/lib/extensions/object_extensions.rb +7 -0
  683. data/lib/lib/extensions/string_extensions.rb +35 -0
  684. data/lib/lib/helpers/tmc_helpers/csv_helper/csv_helper.rb +85 -0
  685. data/lib/lib/helpers/tmc_helpers/email_helper/email_helper.rb +71 -0
  686. data/lib/lib/helpers/tmc_helpers/http_helper/http_helper.rb +133 -0
  687. data/lib/lib/helpers/tmc_helpers/roi_helper/roi_helper.rb +17 -0
  688. data/lib/lib/helpers/tmc_helpers/snmp_helper/snmp_helper.rb +71 -0
  689. data/lib/lib/helpers/tmc_helpers/ssh_helper/ssh_helper.rb +337 -0
  690. data/lib/lib/helpers/tmc_helpers/tmc_helpers.rb +1260 -0
  691. data/lib/lib/keyboard/apple_tv/apple_tv_password_keyboard.rb +102 -0
  692. data/lib/lib/keyboard/apple_tv/apple_tv_search_keyboard.rb +103 -0
  693. data/lib/lib/keyboard/apple_tv/apple_tv_username_keyboard.rb +105 -0
  694. data/lib/lib/keyboard/keyboard.rb +504 -0
  695. data/lib/lib/keyboard/keyboard_layout.rb +51 -0
  696. data/lib/lib/keyboard/roku/roku_reset_pin_keyboard.rb +12 -0
  697. data/lib/lib/keyboard/roku/roku_rsg_search_keyboard.rb +67 -0
  698. data/lib/lib/keyboard/roku/roku_rsg_signin_keyboard.rb +106 -0
  699. data/lib/lib/keyboard/roku/roku_search_keyboard.rb +10 -0
  700. data/lib/lib/keyboard/roku/roku_signin_keyboard.rb +42 -0
  701. data/lib/lib/keyboard/samsung_tv/samsung_tv_search_keyboard.rb +50 -0
  702. data/lib/lib/keyboard/samsung_tv/samsung_tv_signin_keyboard.rb +52 -0
  703. data/lib/lib/keyboard/stb/odn/odn_on_demand_search_keyboard.rb +10 -0
  704. data/lib/lib/keyboard/stb/odn/odn_search_keyboard.rb +10 -0
  705. data/lib/lib/keyboard/stb/spectrum/spectrum_netflix_email_keyboard.rb +50 -0
  706. data/lib/lib/keyboard/stb/spectrum/spectrum_netflix_keyboard.rb +43 -0
  707. data/lib/lib/keyboard/stb/spectrum/spectrum_netflix_name_keyboard.rb +16 -0
  708. data/lib/lib/keyboard/stb/spectrum/spectrum_search_keyboard.rb +32 -0
  709. data/lib/lib/keyboard/tivo/tivo_password_keyboard.rb +0 -0
  710. data/lib/lib/keyboard/tivo/tivo_search_keyboard.rb +0 -0
  711. data/lib/lib/keyboard/tivo/tivo_username_keyboard.rb +0 -0
  712. data/lib/lib/keys/apple_tv/apple_tv_keys.rb +26 -0
  713. data/lib/lib/keys/base_keys.rb +14 -0
  714. data/lib/lib/keys/dta/dta_keys.rb +60 -0
  715. data/lib/lib/keys/mdn/mdn_keys.rb +60 -0
  716. data/lib/lib/keys/passport/passport_keys.rb +59 -0
  717. data/lib/lib/keys/roku/roku_keys.rb +31 -0
  718. data/lib/lib/keys/roku_tv/roku_tv_keys.rb +32 -0
  719. data/lib/lib/keys/samsung_tv/samsung_tv_keys.rb +58 -0
  720. data/lib/lib/keys/sara/sara_keys.rb +60 -0
  721. data/lib/lib/keys/stb/iguide/iguide_keys.rb +56 -0
  722. data/lib/lib/keys/stb/odn/odn_keys.rb +63 -0
  723. data/lib/lib/keys/stb/spectrum/spectrum_keys.rb +59 -0
  724. data/lib/lib/keys/stb/stb_keys.rb +13 -0
  725. data/lib/lib/keys/tivo/tivo_keys.rb +26 -0
  726. data/lib/lib/logger/multi_io.rb +14 -0
  727. data/lib/lib/logger/tmc_dut_logger.rb +251 -0
  728. data/lib/lib/logger/tmc_logger.rb +30 -0
  729. data/lib/lib/mixins/assignable.rb +19 -0
  730. data/lib/lib/mixins/can_have_special_methods.rb +50 -0
  731. data/lib/lib/mixins/enumish.rb +16 -0
  732. data/lib/lib/new_platform.rb +302 -0
  733. data/lib/lib/new_sub_platform.rb +90 -0
  734. data/lib/lib/platform/apple_tv/apple_tv.rb +33 -0
  735. data/lib/lib/platform/apple_tv/apple_tv_1080/apple_tv_1080.rb +54 -0
  736. data/lib/lib/platform/apple_tv/apple_tv_720/apple_tv_720.rb +14 -0
  737. data/lib/lib/platform/dta/dta.rb +35 -0
  738. data/lib/lib/platform/dta/dta_1080/dta_1080.rb +15 -0
  739. data/lib/lib/platform/dta/dta_720/dta_720.rb +15 -0
  740. data/lib/lib/platform/mdn/mdn.rb +35 -0
  741. data/lib/lib/platform/mdn/mdn_1080/mdn_1080.rb +15 -0
  742. data/lib/lib/platform/mdn/mdn_720/mdn_720.rb +15 -0
  743. data/lib/lib/platform/mobile/android/android.rb +23 -0
  744. data/lib/lib/platform/mobile/android/android_phone/android_phone.rb +23 -0
  745. data/lib/lib/platform/mobile/android/android_tablet/android_tablet.rb +23 -0
  746. data/lib/lib/platform/mobile/ios/ios.rb +23 -0
  747. data/lib/lib/platform/mobile/ios/ios_phone/ios_phone.rb +23 -0
  748. data/lib/lib/platform/mobile/ios/ios_tablet/ios_tablet.rb +23 -0
  749. data/lib/lib/platform/mobile/mobile.rb +102 -0
  750. data/lib/lib/platform/passport/passport.rb +41 -0
  751. data/lib/lib/platform/passport/passport1080/passport_1080.rb +15 -0
  752. data/lib/lib/platform/passport/passport_720/passport_720.rb +14 -0
  753. data/lib/lib/platform/platform.rb +884 -0
  754. data/lib/lib/platform/roku/roku.rb +96 -0
  755. data/lib/lib/platform/roku/roku_720/roku_720.rb +16 -0
  756. data/lib/lib/platform/roku_tv/roku_tv.rb +33 -0
  757. data/lib/lib/platform/roku_tv/roku_tv_1080/roku_tv_1080.rb +14 -0
  758. data/lib/lib/platform/roku_tv/roku_tv_720/roku_tv_720.rb +14 -0
  759. data/lib/lib/platform/samsung_tv/samsung_tv.rb +31 -0
  760. data/lib/lib/platform/samsung_tv/samsung_tv_1080/samsung_tv_1080.rb +14 -0
  761. data/lib/lib/platform/samsung_tv/samsung_tv_720/samsung_tv_720.rb +14 -0
  762. data/lib/lib/platform/sara/sara.rb +42 -0
  763. data/lib/lib/platform/sara/sara_1080/sara_1080.rb +15 -0
  764. data/lib/lib/platform/sara/sara_720/sara_720.rb +15 -0
  765. data/lib/lib/platform/stb/iguide/iguide.rb +18 -0
  766. data/lib/lib/platform/stb/iguide/iguide_1080/iguide_1080.rb +14 -0
  767. data/lib/lib/platform/stb/iguide/iguide_720/iguide_720.rb +14 -0
  768. data/lib/lib/platform/stb/odn/odn.rb +480 -0
  769. data/lib/lib/platform/stb/odn/odn_1080/odn_1080.rb +14 -0
  770. data/lib/lib/platform/stb/odn/odn_720/odn_720.rb +14 -0
  771. data/lib/lib/platform/stb/odn/odn_720/odn_720_moto/odn_720_moto.rb +14 -0
  772. data/lib/lib/platform/stb/odn/odn_720/odn_720_sa/odn_720_sa.rb +14 -0
  773. data/lib/lib/platform/stb/odn/odn_720/odn_720_samsung/odn_720_samsung.rb +14 -0
  774. data/lib/lib/platform/stb/spectrum/spectrum.rb +48 -0
  775. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080.rb +14 -0
  776. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis.rb +16 -0
  777. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris.rb +15 -0
  778. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax.rb +15 -0
  779. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch.rb +15 -0
  780. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace.rb +14 -0
  781. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720.rb +14 -0
  782. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris.rb +15 -0
  783. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax.rb +15 -0
  784. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch.rb +15 -0
  785. data/lib/lib/platform/stb/stb.rb +93 -0
  786. data/lib/lib/platform/template.txt +16 -0
  787. data/lib/lib/platform/tivo/tivo.rb +28 -0
  788. data/lib/lib/platform/tivo/tivo_1080/tivo_1080.rb +15 -0
  789. data/lib/lib/platform/tivo/tivo_720/tivo_720.rb +14 -0
  790. data/lib/lib/platform/web/web.rb +51 -0
  791. data/lib/lib/platform_libs/roku/roku_controller.rb +254 -0
  792. data/lib/lib/prereqs/prereqs.rb +17 -0
  793. data/lib/lib/prereqs/prereqs_for_dut.rb +14 -0
  794. data/lib/lib/prereqs/prereqs_for_test.rb +14 -0
  795. data/lib/lib/remotes/remotes.rb +8 -0
  796. data/lib/lib/remotes/stb/spectrum/spectrum_remotes.rb +22 -0
  797. data/lib/lib/roi/black/black_roi.rb +125 -0
  798. data/lib/lib/roi/color/color_roi.rb +138 -0
  799. data/lib/lib/roi/image/image_roi.rb +187 -0
  800. data/lib/lib/roi/roi.rb +1064 -0
  801. data/lib/lib/roi/template_roi.txt +9 -0
  802. data/lib/lib/roi/text/text_roi.rb +187 -0
  803. data/lib/lib/roi/video/video_roi.rb +98 -0
  804. data/lib/lib/screen/screen.rb +183 -0
  805. data/lib/lib/screen/template.txt +7 -0
  806. data/lib/lib/screen/template_screen.txt +10 -0
  807. data/lib/lib/screens/apple_tv/apple_tv_screens.rb +44 -0
  808. data/lib/lib/screens/dta/dta_screens.rb +49 -0
  809. data/lib/lib/screens/mdn/mdn_screens.rb +49 -0
  810. data/lib/lib/screens/mobile/android/android_phone/android_phone_screens.rb +28 -0
  811. data/lib/lib/screens/mobile/android/android_screens.rb +40 -0
  812. data/lib/lib/screens/mobile/android/android_tablet/android_tablet_screens.rb +29 -0
  813. data/lib/lib/screens/mobile/ios/ios_phone/ios_phone_screens.rb +22 -0
  814. data/lib/lib/screens/mobile/ios/ios_screens.rb +39 -0
  815. data/lib/lib/screens/mobile/ios/ios_tablet/ios_tablet_screens.rb +20 -0
  816. data/lib/lib/screens/mobile/mobile_screens.rb +18 -0
  817. data/lib/lib/screens/passport/passport_screens.rb +42 -0
  818. data/lib/lib/screens/roku/roku_screens.rb +72 -0
  819. data/lib/lib/screens/roku_tv/roku_tv_screens.rb +43 -0
  820. data/lib/lib/screens/samsung_tv/samsung_tv_screens.rb +44 -0
  821. data/lib/lib/screens/sara/sara_screens.rb +49 -0
  822. data/lib/lib/screens/screens.rb +23 -0
  823. data/lib/lib/screens/stb/iguide/iguide_1080/iguide_1080_screens.rb +56 -0
  824. data/lib/lib/screens/stb/iguide/iguide_720/iguide_720_screens.rb +56 -0
  825. data/lib/lib/screens/stb/iguide/iguide_screens.rb +54 -0
  826. data/lib/lib/screens/stb/odn/odn_screens.rb +40 -0
  827. data/lib/lib/screens/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_screens.rb +18 -0
  828. data/lib/lib/screens/stb/spectrum/spectrum_screens.rb +48 -0
  829. data/lib/lib/screens/stb/stb_screens.rb +13 -0
  830. data/lib/lib/screens/template.txt +52 -0
  831. data/lib/lib/screens/tivo/tivo_screens.rb +44 -0
  832. data/lib/lib/selenium/appium/appium.rb +388 -0
  833. data/lib/lib/selenium/selenium.rb +466 -0
  834. data/lib/lib/selenium/webdriver/webdriver.rb +254 -0
  835. data/lib/lib/test_case/boilerplate/functional.rb +7 -0
  836. data/lib/lib/test_case/boilerplate/performance.rb +7 -0
  837. data/lib/lib/test_case/ci_test.rb +47 -0
  838. data/lib/lib/test_case/functional_test_case.rb +27 -0
  839. data/lib/lib/test_case/make_boilerplate.rb +32 -0
  840. data/lib/lib/test_case/monitoring/apple_monitor.rb +104 -0
  841. data/lib/lib/test_case/monitoring/base_monitor.rb +140 -0
  842. data/lib/lib/test_case/monitoring/dta_monitor.rb +53 -0
  843. data/lib/lib/test_case/monitoring/iguide_monitor.rb +72 -0
  844. data/lib/lib/test_case/monitoring/mdn_monitor.rb +28 -0
  845. data/lib/lib/test_case/monitoring/monitoring_test.rb +111 -0
  846. data/lib/lib/test_case/monitoring/odn_monitor.rb +137 -0
  847. data/lib/lib/test_case/monitoring/passport_monitor.rb +50 -0
  848. data/lib/lib/test_case/monitoring/report_monitor.rb +178 -0
  849. data/lib/lib/test_case/monitoring/roku_monitor.rb +102 -0
  850. data/lib/lib/test_case/monitoring/sara_monitor.rb +33 -0
  851. data/lib/lib/test_case/monitoring/spec_monitor.rb +154 -0
  852. data/lib/lib/test_case/performance_test_case.rb +29 -0
  853. data/lib/lib/test_case/test_case.rb +1055 -0
  854. data/lib/lib/test_case/test_error.rb +29 -0
  855. data/lib/lib/test_case/test_exception.rb +9 -0
  856. data/lib/lib/test_case/test_status.rb +39 -0
  857. data/lib/lib/test_case/test_step.rb +156 -0
  858. data/lib/lib/test_case/test_trace.rb +80 -0
  859. data/lib/lib/test_data.rb +222 -0
  860. data/lib/lib/test_wrapper.rb +146 -0
  861. data/lib/misc/get_latest_android.sh +14 -0
  862. data/lib/misc/get_latest_ios.sh +14 -0
  863. data/lib/package-lock.json +3 -0
  864. data/lib/run_test.rb +4 -0
  865. data/lib/script_validator.rb +48 -0
  866. data/lib/syntax_eval.rb +151 -0
  867. data/lib/tools/convert_old_scripts.rb +100 -0
  868. data/lib/tools/find_duplicate_rois.rb +27 -0
  869. data/lib/tools/roku/inspector.rb +130 -0
  870. data/lib/tools/syntax_checker.rb +83 -0
  871. data/lib/upload_ref_images.rb +255 -0
  872. metadata +912 -0
@@ -0,0 +1,29 @@
1
+ require './lib/test_case/test_case'
2
+
3
+ # PerformanceTestCase manages test flow for performance tests
4
+
5
+ class PerformanceTestCase < TestCase
6
+
7
+ # Public: Initializes a performance test case. NOT FOR USE IN TESTS.
8
+ #
9
+ # Returns nothing.
10
+ def initialize(*args)
11
+ super
12
+ @sword_report_error = false
13
+ end
14
+
15
+ private
16
+
17
+ # Public: Defines test case flow for performance tests.
18
+ #
19
+ # Returns nothing.
20
+ def perform
21
+ begin
22
+ super
23
+ rescue Exception => e
24
+ # swallow all exceptions, we have already logged/reported them at this point
25
+ end
26
+ end
27
+
28
+ end
29
+
@@ -0,0 +1,1055 @@
1
+ require './lib/test_data'
2
+ require './lib/logger/tmc_logger'
3
+ require './lib/logger/tmc_dut_logger'
4
+ require './lib/helpers/helpers'
5
+ require './lib/helpers/tmc_helpers/tmc_helpers'
6
+ require './lib/prereqs/prereqs_for_test'
7
+ require './lib/prereqs/prereqs_for_dut'
8
+ require './lib/test_case/test_error'
9
+ require './lib/test_case/test_exception'
10
+ require './lib/test_case/test_step'
11
+ require './lib/test_case/test_status'
12
+ require './dsllib/performance/perf_lib'
13
+ require './dsllib/common/utils/tmc_utils'
14
+ require './lib/test_case/ci_test'
15
+ require './lib/test_case/monitoring/monitoring_test'
16
+ require 'minitest/test'
17
+ begin
18
+ require './lib/data_services/data_services'
19
+ rescue LoadError # TODO: remove rescue once data_services code is stabilized
20
+ end
21
+
22
+ # The TestCase class manages test flow
23
+
24
+ class TestCase < MiniTest::Test
25
+ include Helpers
26
+ include TmcHelpers
27
+ include TmcUtils
28
+ include PerfLib
29
+ include LegacyLogging
30
+ alias :orig_backticks :'`'
31
+ private :orig_backticks
32
+
33
+ @@not_valid_for = {}
34
+ @@valid_for = []
35
+ @@prereqs_for_test = []
36
+ @@prereqs_for_dut = []
37
+
38
+ # Public: Assigns device types for which the test case is not valid.
39
+ #
40
+ # device_types - Splat Array of device types for which the test case is not valid.
41
+ #
42
+ # Returns nothing.
43
+ def self.not_valid_for(*device_types)
44
+ if device_types.empty?
45
+ nil
46
+ elsif device_types.first.is_a?(Hash)
47
+ @@not_valid_for.update(device_types.first)
48
+ else
49
+ device_types.each { |d| @@not_valid_for[d] = nil }
50
+ end
51
+ end
52
+
53
+ # Public: Assigns device types for which the test case is valid.
54
+ #
55
+ # device_types - Splat Array of device types for which the test case is valid.
56
+ #
57
+ # Returns nothing.
58
+ def self.valid_for(*device_types)
59
+ @@valid_for += device_types
60
+ end
61
+
62
+ # Public: Assigns prerequisites for the test.
63
+ #
64
+ # prereqs_for_test - Splat Array of Symbol prereqs required for the test.
65
+ #
66
+ # Returns nothing.
67
+ def self.prereqs_for_test(*prereqs_for_test)
68
+ @@prereqs_for_test = prereqs_for_test
69
+ end
70
+
71
+ # Public: Assigns prerequisites for the DUT.
72
+ #
73
+ # prereqs_for_dut - Splat Array of Symbol prereqs required for the DUT.
74
+ #
75
+ # Returns nothing.
76
+ def self.prereqs_for_dut(*prereqs_for_dut)
77
+ @@prereqs_for_dut = prereqs_for_dut
78
+ end
79
+
80
+ attr_reader(:id, :job, :iteration, :start_time, :stop_time, :logger, :host, :identity, :ssh)
81
+ attr_writer(:device_ids, :reported_result)
82
+
83
+ # Public: Initializes a new TestCase. NOT FOR USE IN TESTS.
84
+ #
85
+ # Returns nothing.
86
+ def initialize(id, device_ids, iteration, host, job, log_file, log_level, data: nil, auth: nil, workspace: nil)
87
+ super(nil)
88
+ @status = TestStatus.new(self, nil)
89
+ # Set attributes from parameters
90
+ @id = id
91
+ @device_ids = device_ids || [] # needed for syntax eval
92
+ @primary_device_id = @device_ids.empty? ? nil : @device_ids.first
93
+ @identity = job
94
+ @iteration = iteration
95
+ @host = host
96
+ @job = job
97
+ @workspace = workspace
98
+ # Set remaining attributes
99
+ @type = nil
100
+ @start_time = nil
101
+ @stop_time = nil
102
+ @teardowns = []
103
+ @steps = []
104
+ @errors = []
105
+ @current_step = nil
106
+ @data = nil
107
+ @duts = {}
108
+ @loaded_libs = false
109
+ @recording_video_id = nil
110
+ @video_recording_ids = {}
111
+ @audio_recording_ids = {}
112
+ @locked_resources = {}
113
+ @reported_results = false
114
+ @test_steps_ignore_errors = false
115
+ @ignore_errors = false
116
+ @no_log_trace = false
117
+ # Set these attributes last as they may depend on others
118
+ # Create base logger
119
+ base_logger = TmcLogger.new(log_file, log_level)
120
+ @loggers = {}
121
+ if device?
122
+ # Create DUT logger for each device
123
+ @device_ids.each_with_index do |d, i|
124
+ @loggers[d] = TmcDutLogger.new(i + 1, base_logger, self)
125
+ end
126
+ else
127
+ # Create a non-device logger
128
+ @loggers[0] = TmcDutLogger.new(nil, base_logger, self)
129
+ end
130
+ @logger = @loggers.values.first
131
+ @test_data = TestData.new(self, job: @job, data: data)
132
+ @ssh = TmcSsh.new(self)
133
+ # Anything that logs should go here
134
+ unless auth.nil?
135
+ # Log in using base-64 auth
136
+ resp = tmc_post('/api/login', json: { value: auth })
137
+ @identity = resp['guid']
138
+ end
139
+ @ignore_interrupt = false
140
+ @canceled = false
141
+ trap_signals
142
+ end
143
+
144
+ # Public: Gets test status.
145
+ #
146
+ # Returns String status.
147
+ def status
148
+ @status.status
149
+ end
150
+
151
+ # Public: Block probes.
152
+ def `(_)
153
+ probe_fail('`')
154
+ end
155
+
156
+ # Public: Block probes.
157
+ def exec(*_c)
158
+ probe_fail('exec')
159
+ end
160
+
161
+ # Public: Block probes.
162
+ def system(*_c)
163
+ probe_fail('system')
164
+ end
165
+
166
+ # Public: Get test name.
167
+ def name
168
+ if @name.nil?
169
+ resp = tmc_get("/api/jobs/#{@job}/tests/#{@id}") || {}
170
+ @name = test_info['name'] || self.class.name.split('::').last.gsub(/(?<!^)([A-Z]|[0-9]+)/, ' \0')
171
+ end
172
+ @name
173
+ end
174
+
175
+ # Public: Gets test step errors behavior.
176
+ #
177
+ # Returns a Boolean indicating test steps ignore errors.
178
+ def test_steps_ignore_errors?
179
+ @test_steps_ignore_errors
180
+ end
181
+
182
+ # Public: Sets test step errors behavior.
183
+ #
184
+ # val - A Boolean indicating whether test steps should ignore errors.
185
+ #
186
+ # Returns nothing.
187
+ def test_steps_ignore_errors(val)
188
+ @test_steps_ignore_errors = val
189
+ @steps.each {|s| s.instance_variable_set(:@raising, !val)}
190
+ end
191
+
192
+ # Public: Gets test case errors behavior.
193
+ #
194
+ # Returns a Boolean indicating the test case ignores errors in determining the result,
195
+ # when test steps are also configured to ignore errors.
196
+ def ignore_errors?
197
+ @ignore_errors
198
+ end
199
+
200
+ # Public: Sets test case errors behavior.
201
+ #
202
+ # val - A Boolean indicating whether the test case should ignore errors in determining the result,
203
+ # when test steps are also configured to ignore errors.
204
+ #
205
+ # Returns nothing.
206
+ def ignore_errors(val)
207
+ @ignore_errors = val
208
+ end
209
+
210
+ # Public: Gets test errors.
211
+ #
212
+ # Returns an Array of errors in format:
213
+ # [{:message => 'oh no!', :file => 'foo.rb', :line => 22, :method => 'foo', :line_in_method => 3, :step_id => 1, :step_name => 'Baz'}]
214
+ def errors
215
+ @errors.map {|e| e.to_h}
216
+ end
217
+
218
+ # Public: Locks the specified resource(s) to perform an action.
219
+ #
220
+ # resource - String or Array of String resources to lock.
221
+ # timeout - Integer lock activity timeout in milliseconds.
222
+ # block - Block to perform.
223
+ # device - Integer device to lock (default: nil).
224
+ # concurrent - Integer concurrent locks allowed (default: 1).
225
+ # acquire_timeout - Integer lock acquisition timeout in milliseconds (default: nil).
226
+ # If nil, 16 * the lock activity timeout will be used.
227
+ #
228
+ # Returns the result of the specified block.
229
+ def lock(resource, timeout, device: nil, concurrent: 1, acquire_timeout: nil)
230
+ ret = nil
231
+ locked_resources = []
232
+ uri = '/api/lock'
233
+ uri += "/#{device}" unless device.nil?
234
+ acquire_timeout ||= (timeout * 16)
235
+ resource = [resource] unless resource.is_a?(Array)
236
+ begin
237
+ resource.each do |res|
238
+ # only lock if not already locked
239
+ next if @locked_resources.key?(res)
240
+
241
+ logger.debug("Attempting to lock TMC resource [#{res}] at #{timestamp}")
242
+ resp = tmc_post(uri, json: { resource: res, timeout: timeout, concurrent: concurrent }, timeout: acquire_timeout)
243
+ id = resp['id']
244
+ locked_resources << id
245
+ @locked_resources[res] = id
246
+ add_teardown(nil, device, id) do |dev, lid|
247
+ release_lock(dev, lid) if @locked_resources.value?(lid)
248
+ end
249
+ end
250
+ begin
251
+ Timeout.timeout(timeout.to_f / 1.sec) do
252
+ ret = yield
253
+ end
254
+ rescue Timeout::Error
255
+ raise "Lock activity timed out after #{timeout} ms!"
256
+ end
257
+ ensure
258
+ locked_resources.each do |id|
259
+ release_lock(device, id)
260
+ logger.debug("TMC resource [#{id}] unlocked at #{timestamp}")
261
+ end
262
+ end
263
+ ret
264
+ end
265
+
266
+ # Public: Gets an ISO 8601-formatted timestamp.
267
+ #
268
+ # at - DateTime or Time object (default: nil).
269
+ #
270
+ # Returns the String timestamp.
271
+ def timestamp(at: nil)
272
+ at ||= DateTime.now
273
+ at.strftime(TmcLogger::DATETIME_FORMAT)
274
+ end
275
+
276
+ # Public: Gets an ISO 8601-formatted timestamp safe for use in a filename.
277
+ #
278
+ # at - DateTime or Time object (default: nil).
279
+ #
280
+ # Returns the String timestamp.
281
+ def safe_timestamp(at: nil)
282
+ at ||= DateTime.now
283
+ at.strftime(TmcLogger::DATETIME_FORMAT).delete(':')
284
+ end
285
+
286
+ # Public: Sleeps. TODO: We really should not be clobbering built-ins like this.
287
+ #
288
+ # delay - Integer or Range of milliseconds to sleep.
289
+ # If a Range, will sleep a random number of milliseconds within the Range.
290
+ #
291
+ # Returns nothing.
292
+ alias builtin_sleep sleep # preserve the built-in sleep method so we can use it
293
+ def sleep(delay)
294
+ if delay.is_a?(Range)
295
+ min = delay.first
296
+ range = delay.last - min
297
+ delay = min + rand(range + 1)
298
+ end
299
+ logger.debug("Sleep for: [#{delay.to_i}] ms")
300
+ builtin_sleep(delay.to_i / 1000.0)
301
+ end
302
+
303
+ # Public: Gets test data.
304
+ #
305
+ # Examples:
306
+ #
307
+ # test_data[:foo] = 'bar'
308
+ # #=> 'bar'
309
+ #
310
+ # test_data.refresh
311
+ # #=> nil
312
+ #
313
+ # val = test_data[:foo]
314
+ # #=> 'bar'
315
+ #
316
+ # val = test_data.fetch(:foo)
317
+ # #=> 'bar'
318
+ #
319
+ # val = test_data.update(nums: {int: 1, float: 3.5})
320
+ # #=> {:foo => 'bar', :nums => {:int => 1, :float => 3.5}}
321
+ #
322
+ # val = test_data.dig(:nums, :float)
323
+ # #=> 3.5
324
+ #
325
+ # val = test_data.dig(:nums, :decimal)
326
+ # #=> nil
327
+ #
328
+ # Returns test data hash.
329
+ def test_data
330
+ @test_data.refresh if !@test_data.promiscuous? && @test_data.empty?
331
+ @test_data
332
+ end
333
+ alias options test_data
334
+
335
+ # Public: Pings the given host.
336
+ #
337
+ # host - String host name or IP to ping.
338
+ #
339
+ # Returns true if the host could be pinged, otherwise false.
340
+ def ping?(host)
341
+ failed = orig_backticks("ping -n 1 #{host}").match(/(?i)Received\s*=\s*1/).nil?
342
+ !failed
343
+ end
344
+
345
+ # Public: Gets delta between the specified times.
346
+ #
347
+ # t1 - Time, DateTime, Integer, Float, or String T1 time value.
348
+ # t2 - Time, DateTime, Integer, Float, or String T2 time value.
349
+ #
350
+ # Returns the Float delta in milliseconds.
351
+ def get_time_delta(t1, t2)
352
+ (to_time(t2) - to_time(t1)) * 1000.0 # convert to ms
353
+ end
354
+ alias time_diff_milli get_time_delta
355
+
356
+ # Public: Performs a test step.
357
+ #
358
+ # id - Integer test step id.
359
+ # name - String name of the test step (default: nil).
360
+ # block - Block that performs the test step.
361
+ #
362
+ # Returns nothing.
363
+ def test_step(id, name: nil, &block)
364
+ if id.nil?
365
+ id = @steps.empty? ? 1 : @steps.last.id + 1
366
+ end
367
+ # Look up the step
368
+ update = false
369
+ step = @steps.find { |step| step.id == id && step.device == @primary_device_id }
370
+ if step.nil?
371
+ # Create the step if it does not exist
372
+ step = TestStep.new(self, id, name, @primary_device_id, @iteration)
373
+ @steps << step
374
+ update = true
375
+ elsif !name.nil? && name != step.name
376
+ step.instance_variable_set(:@name, name)
377
+ update = true
378
+ end
379
+ @current_step = step
380
+ step.perform(update: update, &block)
381
+ @current_step = nil
382
+ end
383
+
384
+ # Public: Indicates whether the test has a device.
385
+ #
386
+ # Returns a Boolean indicating if the test has a device.
387
+ def device?
388
+ !@device_ids.empty?
389
+ end
390
+
391
+ # Public: Reports a measurement to the designated system.
392
+ #
393
+ # return_value - Integer or Float return value (default: nil).
394
+ # If default, return value will be calculated from start and stop time.
395
+ # start_time - Time measurement started (default: start_time).
396
+ # stop_time - Time measurement stopped (default: stop_time).
397
+ # message - String details about measurement (default: nil).
398
+ # If default, a generic message will be used.
399
+ # execution_metric - Execution metric for which to report (default: nil).
400
+ # If default, will not report for a specific execution metric.
401
+ # return_title - Return title to report (default: nil).
402
+ # If default, will not report for a specific return title.
403
+ # result - Symbol result to report (default: nil).
404
+ # Should be :passed, :failed, :error, or :done. If default, current test status will be used.
405
+ #
406
+ # Returns nothing.
407
+ def report_result(args = {})
408
+ start = args.fetch(:start_time, start_time || Time.now)
409
+ stop = args.fetch(:stop_time, stop_time || Time.now)
410
+ args[:tcr_auto_detail_text] = args.delete(:message)
411
+ result = args.delete(:result)
412
+ logger.info("Reporting #{args[:message] || args[:execution_metric] || args[:return_title] || 'result'}: " \
413
+ "#{result.nil? ? '' : "#{result.to_s.capitalize} in "}#{args[:return_value] || (stop - start)} s")
414
+ report_to_sword(result, start, stop, args) if is_sword?
415
+ @reported_results = true
416
+ end
417
+
418
+ # Public: Gets the data service.
419
+ #
420
+ # Returns the <data> instance.
421
+ def data
422
+ @data = DataServices.new(@logger) if @data.nil?
423
+ @data
424
+ end
425
+
426
+ # Public: Fails the test or step.
427
+ #
428
+ # reason - String message describing the reason for failure.
429
+ #
430
+ # Returns nothing.
431
+ def fail(reason = 'Unknown failure')
432
+ sword_attach_screenshot reason
433
+ backtrace = caller
434
+ if @current_step.nil?
435
+ @status = TestStatus.new(self, TestStatus::FAILED, reason: reason, backtrace: backtrace)
436
+ raise TestException.new
437
+ else
438
+ @current_step.fail(reason, backtrace: backtrace)
439
+ end
440
+ end
441
+
442
+ # Public: Passes the test or step.
443
+ #
444
+ # reason - String message describing the reason for passing.
445
+ #
446
+ # Returns nothing.
447
+ def pass(reason = nil)
448
+ is_perf = is_a?(PerformanceTestCase)
449
+ if @current_step.nil?
450
+ @status = TestStatus.new(self, is_perf ? TestStatus::DONE : TestStatus::PASSED, reason: reason)
451
+ else
452
+ @current_step.pass(reason)
453
+ end
454
+ end
455
+
456
+ # Public: Quits the test.
457
+ #
458
+ # reason - String message describing the reason for error.
459
+ #
460
+ # Returns nothing.
461
+ def error(reason = 'Unknown error')
462
+ raise reason
463
+ end
464
+
465
+ # Public: Adds a teardown with the given method and arguments.
466
+ #
467
+ # msg - String message to log when the teardown runs.
468
+ # args - Array of parameters to send (default: []).
469
+ # block - Block method the teardown should run.
470
+ #
471
+ # Returns nothing.
472
+ def add_teardown(msg, *args, &block)
473
+ logger.debug("Adding teardown: #{method_to_str(block)}")
474
+ @teardowns << { message: msg, method: block, args: args }
475
+ end
476
+
477
+ # Public: Records a test error.
478
+ #
479
+ # msg - String error message.
480
+ # log - Boolean indicating whether to log the error immediately (default: false).
481
+ # log_opts - Hash of options to pass to `logger.error', if log is enabled (default: nil).
482
+ # backtrace - Array containing error backtrace (default: {}).
483
+ # If default, caller will be used.
484
+ #
485
+ # Returns the TestError instance.
486
+ def record_error(msg, log: false, log_opts: {}, backtrace: nil)
487
+ err = TestError.new(self, msg, backtrace || caller, step: @current_step)
488
+ @errors << err
489
+ if log
490
+ msg += " #{err}"
491
+ logger.error(msg, log_opts)
492
+ end
493
+ err
494
+ end
495
+
496
+ # Public: Gets server name.
497
+ #
498
+ # Returns the String name of the TMC server.
499
+ def server_name
500
+ server_info['name']
501
+ end
502
+
503
+ # Public: Gets server market.
504
+ #
505
+ # Returns the String market of the TMC server.
506
+ def server_market
507
+ server_info['market']
508
+ end
509
+
510
+ # Public: Gets job name.
511
+ #
512
+ # Returns the String name of the current job.
513
+ def job_name
514
+ job_status['name']
515
+ end
516
+
517
+ # Public: Gets job start time.
518
+ #
519
+ # Returns the String start time of the current job in ISO 8601 format, local to the TMC, with a timezone offset.
520
+ def job_start_time
521
+ job_status['startedAt'].to_time
522
+ end
523
+
524
+ # Public: Gets the device under test, initializing it first if necessary.
525
+ #
526
+ # Returns the dut.
527
+ def dut
528
+ dut1
529
+ end
530
+
531
+ # Public: Gets the 1st device under test, initializing it first if necessary.
532
+ #
533
+ # Returns the 1st dut.
534
+ def dut1
535
+ get_dut(1)
536
+ end
537
+
538
+ # Public: Gets the 2nd device under test, initializing it first if necessary.
539
+ #
540
+ # Returns the 2nd dut.
541
+ def dut2
542
+ get_dut(2)
543
+ end
544
+
545
+ # Public: Gets the 3rd device under test, initializing it first if necessary.
546
+ #
547
+ # Returns the 3rd dut.
548
+ def dut3
549
+ get_dut(3)
550
+ end
551
+
552
+ # Public: Gets a web browser.
553
+ #
554
+ # browser - Symbol browser to launch, can be :firefox or :chrome (default: :chrome).
555
+ #
556
+ # Returns the browser Object.
557
+ def browser(browser: :firefox)
558
+ if @browser.nil? || @browser.send(:closed?)
559
+ require './lib/platform/web/web'
560
+ @browser = Web.new(browser, self)
561
+ end
562
+ @browser
563
+ end
564
+
565
+ # Public: Gets the local UTC offset.
566
+ #
567
+ # Returns the local time offset in Integer milliseconds.
568
+ def local_utc_offset
569
+ local_offset_str = Time.now.getlocal.to_s.match(/([\+-]\d{4})/).to_s
570
+ local_offset = local_offset_str[1..2].to_i.hr + local_offset_str[3..4].to_i.min
571
+ local_offset_str[0..0].eql?('-') ? local_offset * -1 : local_offset
572
+ end
573
+
574
+ # Public: Converts the specified object to a time.
575
+ #
576
+ # obj - Object to convert.
577
+ #
578
+ # Returns a Time object.
579
+ def to_time(obj)
580
+ if obj.is_a?(Time)
581
+ obj
582
+ elsif obj.is_a?(DateTime)
583
+ obj.to_time
584
+ elsif obj.is_a?(Numeric)
585
+ # This expects seconds since the epoch
586
+ Time.at(obj)
587
+ elsif obj.is_a?(String)
588
+ obj.to_time
589
+ else
590
+ raise "#{obj.class.name} cannot be converted to time!"
591
+ end
592
+ end
593
+
594
+ private
595
+
596
+ # Internal: Get test path.
597
+ def path
598
+ test_info['path']
599
+ end
600
+
601
+ # Internal: Get test info.
602
+ def test_info
603
+ if @test_info.nil?
604
+ resp = tmc_get("/api/jobs/#{@job}/tests/#{@id}") || {}
605
+ @test_info = resp['testCase']
606
+ end
607
+ @test_info
608
+ end
609
+
610
+ # Internal: Executes teardowns.
611
+ def teardown
612
+ unless @recording_video_id.nil?
613
+ api_stop_video(@recording_video_id)
614
+ @recording_video_id = nil
615
+ end
616
+ logger.send(:set_tag, 'TEARDOWN')
617
+ logger.info("Doing #{@teardowns.count} teardowns")
618
+ until @teardowns.empty?
619
+ this_teardown = @teardowns.pop
620
+ msg = this_teardown[:message]
621
+ meth = this_teardown[:method]
622
+ logger.debug("Executing teardown: #{method_to_str(meth)}")
623
+ logger.info(msg, tag: 'TEARDOWN') unless msg.nil?
624
+ begin
625
+ meth.call(*this_teardown[:args])
626
+ rescue Exception => e # signals handled by `trap_signals'
627
+ logger.error("Teardown error: #{e.message}\n\t#{e.backtrace.join("\n\t")}")
628
+ end
629
+ end
630
+ logger.send(:unset_tag)
631
+ end
632
+
633
+ # Internal: Get logger for specified dut.
634
+ def logger_for_device(id)
635
+ @loggers[id]
636
+ end
637
+
638
+ # Internal: Block probes.
639
+ def probe_fail(meth)
640
+ raise "Method `#{meth}' not allowed. Further attempts to execute commands on this server will result in more restrictions."
641
+ end
642
+
643
+ # Internal: Release the given lock.
644
+ def release_lock(device, id)
645
+ res, id = @locked_resources.find { |_, i| i == id }
646
+ return if id.nil?
647
+
648
+ uri = '/api/lock'
649
+ uri += "/#{device}" unless device.nil?
650
+ tmc_delete("#{uri}/#{id}")
651
+ @locked_resources.delete(res)
652
+ end
653
+
654
+ # Internal: Indicates whether the test is running from SWORD.
655
+ def is_sword?
656
+ !test_data[:sword_data].nil?
657
+ end
658
+
659
+ # Internal: Hook that executes each time test status is set.
660
+ #
661
+ # Returns nothing.
662
+ def set_status(status, device: nil)
663
+ logger.info("Test #{status.status}", tag: 'STATUS')
664
+ @status = status
665
+ json = jsonify({device: device || @primary_device_id, iteration: @iteration}.merge(@status.to_h))
666
+ tmc_put("/api/jobs/#{@job}/tests/#{@id}/status", json: json)
667
+ end
668
+
669
+ # Internal: Gets the job status.
670
+ def job_status
671
+ if @job_status.nil?
672
+ @job_status = tmc_get("/api/jobs/#{@job}/status")['testJobStatus']
673
+ end
674
+ @job_status
675
+ end
676
+
677
+ # Internal: Hook that executes test.
678
+ #
679
+ # Returns nothing.
680
+ def wrap_run
681
+ set_status(TestStatus.new(self, TestStatus::RUNNING))
682
+ max_timeout_h = 48
683
+ max_timeout_m = 60 * max_timeout_h
684
+ timeout_m = test_data.fetch(:script_timeout, max_timeout_m) # optional timeout, specified in min
685
+ timeout_m = max_timeout_m if timeout_m == 0 # disallow infinite timeout
686
+ if timeout_m > max_timeout_m
687
+ raise "Script timeout cannot be greater than #{max_timeout_h} hours!"
688
+ end
689
+ timeout_s = timeout_m * 60
690
+ logger.info("Timeout in: #{get_readable_time(timeout_s)}") if timeout_s != 0
691
+ Timeout.timeout(timeout_s) do
692
+ @start_time = Time.now
693
+ run
694
+ @stop_time = Time.now
695
+ end
696
+ end
697
+
698
+ # Internal: Defines how the test case should run. Inheriting classes may extend this behavior.
699
+ #
700
+ # Returns nothing.
701
+ def perform
702
+ before_run
703
+ wrap_run
704
+ get_result
705
+ rescue Exception => e # signals handled by `trap_signals'
706
+ if @canceled && !RUBY_PLATFORM.include?('linux')
707
+ Thread.new do
708
+ # "acknowledge" interrupt
709
+ dir = File.join('c:', 'temp')
710
+ Dir.mkdir(dir) unless Dir.exist?(dir)
711
+ File.open(File.join(dir, "SIGINT-#{Process.pid}.pid"), 'w') { |_| }
712
+ @ignore_interrupt = true
713
+ end
714
+ end
715
+ @stop_time = Time.now
716
+ @start_time ||= @stop_time
717
+ if @current_step.nil?
718
+ if e.is_a?(Minitest::Assertion)
719
+ @status = TestStatus.new(self, TestStatus::FAILED, exception: e)
720
+ elsif !e.is_a?(TestException)
721
+ @status = TestStatus.new(self, TestStatus::ERROR, exception: e)
722
+ end
723
+ else
724
+ # avoid logging the stacktrace twice
725
+ @no_log_trace = true
726
+ @status = @current_step.instance_variable_get(:@status)
727
+ end
728
+ ensure
729
+ after_run
730
+ end
731
+
732
+ # Internal: Placeholder for run. TestCase subclasses must implement this.
733
+ #
734
+ # Returns nothing.
735
+ # Raises Exception.
736
+ def run
737
+ raise "Test case must implement `run' method!"
738
+ end
739
+
740
+ # Internal: Hook that executes before every test.
741
+ #
742
+ # Returns nothing.
743
+ def before_run
744
+ # Log server info
745
+ %w[name hostname publicIp localIp version sha authSystem].each do |inf|
746
+ logger.info("TMC Server Info [#{inf}] : #{server_info[inf]}")
747
+ end
748
+ # Log current user and workspace
749
+ logger.info("Current user: #{current_user['name']} (#{current_user['email']})")
750
+ unless @workspace.nil?
751
+ logger.info("Current workspace: #{@workspace}")
752
+ end
753
+ # Populate test info
754
+ @steps = (test_info['steps'] || []).map do |step|
755
+ TestStep.new(self, step['id'], step['name'], @primary_device_id, @iteration)
756
+ end
757
+ parse_sword_test_data if is_sword?
758
+ logger.info("Test: #{name}", screenshot: true)
759
+ set_status(TestStatus.new(self, TestStatus::NOT_RUN)) if status.nil?
760
+ # Verify prerequisites
761
+ check_prerequisites
762
+ # Initialize dut (if there is one) except for CI tests
763
+ if device?
764
+ require_valid_for_device
765
+ # Log the actual resolution
766
+ res = dut.resolution(update: true)
767
+ logger.info("Actual device resolution: #{res[:width]}x#{res[:height]}")
768
+ # Set up video recording
769
+ n = (options[:record_last_n_seconds] || 0)
770
+ if n > 0
771
+ logger.info("Recording last #{n} seconds")
772
+ id = dut.record_video(duration: n.sec, block: false)[:id]
773
+ @recording_video_id = id
774
+ end
775
+ end
776
+ end
777
+
778
+ # Internal: Hook that executes after every test.
779
+ #
780
+ # Returns nothing.
781
+ def after_run
782
+ @ignore_interrupt = true
783
+ begin
784
+ screen = nil
785
+ if device?
786
+ begin
787
+ screen = dut.capture_screen
788
+ rescue Exception # signals handled by `trap_signals'
789
+ # no-op
790
+ end
791
+ end
792
+ @status.status ||= TestStatus::FAILED
793
+ status = @status.status
794
+ message = @status.reason
795
+ backtrace = @status.backtrace
796
+ msg_str = message.nil? ? '' : ": #{message}"
797
+ trace_str = @no_log_trace || backtrace.nil? ? '' : "\n\t#{backtrace.join("\n\t")}"
798
+ # log status
799
+ error_str = ''
800
+ unless backtrace.nil?
801
+ e = record_error(message, backtrace: backtrace)
802
+ error_str = "\n\t" + e.to_s
803
+ end
804
+ args = ["Test #{status}#{msg_str}#{error_str}#{trace_str}", tag: 'RESULT', screen_image: screen]
805
+ puts args[0] # always log test result to STDOUT.
806
+ if [TestStatus::FAILED, TestStatus::ERROR].include?(status)
807
+ logger.error(*args)
808
+ else
809
+ logger.info(*args)
810
+ end
811
+ # TODO: restore or delete this functionality
812
+ # if result == TestStatus::FAILED
813
+ # # Fetch device logs on failure
814
+ # if fetch_option(:generate_odn_logs_on_failure, false) && stb_capable_of?('ODN')
815
+ # mas_fetch_odn_binary_logs_from_stb
816
+ # end
817
+ # if fetch_option(:generate_fdr_logs_on_failure, false) && stb_vendor?('Cisco')
818
+ # dncs_fetch_cisco_fdr_logs_from_stb
819
+ # end
820
+ # end
821
+ # Report execution time before teardown
822
+ logger.info("Total execution time: #{get_readable_time(stop_time - start_time)}", tag: 'RUNTIME')
823
+ teardown
824
+ @video_recording_ids.each do |id, dev|
825
+ begin
826
+ tmc_delete("/api/video/record/#{dev}", json: { id: id })
827
+ rescue StandardError
828
+ # no-op
829
+ end
830
+ end
831
+ @audio_recording_ids.each do |id, dev|
832
+ begin
833
+ tmc_delete("/api/audio/record/#{dev}", json: { id: id })
834
+ rescue StandardError
835
+ # no-op
836
+ end
837
+ end
838
+ # Set status and report result after teardown
839
+ ensure
840
+ # Always set status
841
+ begin
842
+ set_status(@status)
843
+ rescue Exception => e # signals handled by `trap_signals'
844
+ # Log any status error
845
+ logger.error(e)
846
+ ensure
847
+ # Always report
848
+ begin
849
+ report_result(result: @status.status, message: @status.reason) unless @reported_results
850
+ rescue Exception => e # signals handled by `trap_signals'
851
+ # Log any reporting error
852
+ logger.error(e)
853
+ end
854
+ end
855
+ end
856
+ end
857
+
858
+ # Internal: Gets test result, failing the test if any errors occurred.
859
+ def get_result
860
+ if @errors.empty? || @ignore_errors
861
+ pass unless status == TestStatus::PASSED
862
+ else
863
+ err = @errors.each_with_index.map do |e, i|
864
+ step_str = e.step.nil? ? '' : " (Step ##{e.step.id}#{e.step.name.nil? ? '' : " - #{e.step.name}"})"
865
+ "#{i + 1}.#{step_str} #{e.message} #{e}"
866
+ end.join("\n\t")
867
+ @status = TestStatus.new(self, TestStatus::FAILED, exception: Exception.new("One or more errors occurred.\n\t#{err}"))
868
+ raise TestException.new
869
+ end
870
+ end
871
+
872
+ # Internal: Ensures the test and DUT prerequisites are met.
873
+ #
874
+ # Returns nothing.
875
+ def check_prerequisites
876
+ return if (@@prereqs_for_test + @@prereqs_for_dut).empty?
877
+
878
+ lock("prereqs-#{@job}", 12.hr) do
879
+ td_prereqs = test_data.fetch(:_prereqs, {})
880
+ unless @@prereqs_for_test.empty?
881
+ # Check test prereqs
882
+ prereqs_obj = PrereqsForTest.new(self)
883
+ @@prereqs_for_test.each do |prereq|
884
+ success = td_prereqs[prereq]
885
+ if success.nil?
886
+ # Prereq not yet checked
887
+ logger.info("Checking prerequisite for test: #{prereq}")
888
+ success = prereqs_obj.send(prereq) ? true : false
889
+ test_data.update(_prereqs: { prereq => success })
890
+ end
891
+ unless success
892
+ # Prereq failed
893
+ fail("Prerequisite failed for test: #{prereq}")
894
+ end
895
+ end
896
+ end
897
+ unless @@prereqs_for_dut.empty?
898
+ # Check DUT prereqs
899
+ dut_key = :"device #{dut.id}"
900
+ prereqs_obj = PrereqsForDut.new(self)
901
+ @@prereqs_for_dut.each do |prereq|
902
+ dut_prereqs = td_prereqs.fetch(dut_key, {})
903
+ success = dut_prereqs[prereq]
904
+ if success.nil?
905
+ # Prereq not yet checked
906
+ logger.info("Checking prerequisite for device #{dut.id}: #{prereq}")
907
+ success = prereqs_obj.send(prereq) ? true : false
908
+ test_data.update(_prereqs: { dut_key => dut_prereqs.merge(prereq => success) })
909
+ end
910
+ unless success
911
+ # Prereq failed
912
+ fail("Prerequisite failed for device #{dut.id}: #{prereq}")
913
+ end
914
+ end
915
+ end
916
+ end
917
+ end
918
+
919
+ # Internal: Ensures the test is valid for the current device type.
920
+ #
921
+ # Returns nothing.
922
+ def require_valid_for_device
923
+ return unless device?
924
+
925
+ model = dut.model
926
+ model = 'UNKNOWN' if model.nil? || model.empty? || model == -1
927
+ if @@not_valid_for.key?(model.to_sym)
928
+ reason = @@not_valid_for[model.to_sym]
929
+ reason_str = reason.nil? ? '' : " Reason: #{reason}"
930
+ raise "This test is not valid for #{model}!#{reason_str}"
931
+ elsif !@@valid_for.empty? && !@@valid_for.include?(model.to_sym)
932
+ raise "#{model} is not in the list of valid device types for this test!"
933
+ end
934
+ end
935
+
936
+ # Internal: Acquires a TMC lock to modify the given account data.
937
+ #
938
+ # data - Object data for which to acquire a lock.
939
+ # block - Block to execute while lock is acquired.
940
+ #
941
+ # Returns nothing.
942
+ def modifies_account_data(data, &block)
943
+ lock(data.to_s, 1.hr, &block)
944
+ end
945
+
946
+ # Internal: Acquires a TMC lock to modify the parental controls PIN.
947
+ #
948
+ # Returns nothing.
949
+ def modifies_parental_controls_pin(&block)
950
+ modifies_account_data(:parental_controls_pin, &block)
951
+ end
952
+
953
+ # Internal: Formats the given method with optional args and block into a nice string.
954
+ #
955
+ # meth - String or Symbol name of method to format.
956
+ # args - Splat Array of method arguments.
957
+ # block - Block associated with the method.
958
+ #
959
+ # Returns the formatted method String.
960
+ def method_to_str(meth, *args, &block)
961
+ args_str = args.map { |arg| arg.is_a?(String) ? arg.inspect.tr('"', "'") : arg.to_s }.join(' ')
962
+ "#{meth}(#{args_str}#{block.nil? ? '' : ", #{block}"})"
963
+ end
964
+
965
+ # Internal: Gets the specified DUT.
966
+ #
967
+ # n - Integer index (1-based) of DUT to fetch.
968
+ #
969
+ # Returns nothing.
970
+ def get_dut(n)
971
+ if @duts[n].nil?
972
+ # Initialize DUT
973
+ dut_id = @device_ids[n - 1]
974
+ raise "Invalid DUT ##{n}. #{@device_ids.count} devices selected for test." if dut_id.nil?
975
+
976
+ resp = tmc_get("/api/config/hardware/devices?devices=#{dut_id}")
977
+ cfg = resp['devices'].first
978
+ platform = cfg['platform']
979
+ if platform.nil? || platform.empty?
980
+ raise "No platform defined for device #{dut_id}! Check TMC hardware config."
981
+ end
982
+
983
+ Dir['./lib/platform/**/*.rb'].each { |f| require f }
984
+ begin
985
+ cls = Object.const_get(platform)
986
+ rescue NameError
987
+ raise "Unknown platform: #{platform}"
988
+ end
989
+ # Initialize the dut object
990
+ obj = cls.new(self, id: dut_id, config: cfg)
991
+ # Report dut info
992
+ report_info = %w[name model boxCode platform ipAddress macAddress remoteType]
993
+ report_info.each do |inf|
994
+ logger.info "Device #{dut_id} Info [#{inf}] : #{cfg[inf]}"
995
+ end
996
+ @duts[n] = obj
997
+ end
998
+ @duts[n]
999
+ end
1000
+
1001
+
1002
+ # Internal: Parses SWORD test data.
1003
+ def parse_sword_test_data
1004
+ logger.debug('Parsing SWORD test data')
1005
+ sword_data = test_data[:sword_data]
1006
+ begin
1007
+ @sword_job_id = sword_data[:job_id]
1008
+ raise 'SWORD job id not found in test data' if @sword_job_id.nil?
1009
+
1010
+ @sword_test_plan_result_id = sword_data[:test_plan_result_id]
1011
+ raise 'SWORD test plan result id not found in test data' if @sword_test_plan_result_id.nil?
1012
+
1013
+ @sword_report_ip = sword_data[:report_ip]
1014
+ raise 'SWORD report IP not found in test data' if @sword_report_ip.nil?
1015
+
1016
+ @sword_hardware_unit_id = Hash[sword_data.fetch(:hardware_unit_ids, [])][dut.id]
1017
+ raise "SWORD hardware unit id for device #{dut.id} not found in test data" if @sword_hardware_unit_id.nil?
1018
+
1019
+ @sword_test_cycle_test_case_id = @id
1020
+ test_cycle_test_case = Hash[sword_data.fetch(:test_cycle_test_cases, [])].fetch(@sword_test_cycle_test_case_id, {})
1021
+ @sword_test_case_result_id = test_cycle_test_case[:test_case_result_id]
1022
+ raise "SWORD test case result id for test cycle test case #{@sword_test_cycle_test_case_id} not found in test data" if @sword_test_case_result_id.nil?
1023
+
1024
+ @sword_report_grouping = sword_data[:report_grouping]
1025
+ @sword_result_url = is_a?(PerformanceTestCase) ? '/automated_test_reporter' : sword_data[:result_url]
1026
+ @sword_finish_url = sword_data[:finish_url]
1027
+ sword_report_port = sword_data.fetch(:report_port, 80)
1028
+ sword_report_proto = sword_report_port == 443 ? 'https' : 'http'
1029
+ @sword_base_url = "#{sword_report_proto}://#{@sword_report_ip}:#{sword_report_port}"
1030
+ @sword_tcr_auto_detail_id = nil
1031
+ rescue StandardError
1032
+ logger.error("Failed to parse SWORD test data:\n#{sword_data}")
1033
+ raise
1034
+ end
1035
+ end
1036
+
1037
+ # Internal: Traps all possible signals, ignoring them, except for Interrupt, which is used to signify cancellation.
1038
+ def trap_signals
1039
+ Signal.list.each_value do |signo|
1040
+ begin
1041
+ Signal.trap(signo) do
1042
+ puts "Trapped signal: #{signo}"
1043
+ if signo == 2 && !@ignore_interrupt
1044
+ # trap Interrupt
1045
+ @canceled = true
1046
+ puts 'Processing interrupt ..'
1047
+ raise Interrupt, 'Test canceled'
1048
+ end
1049
+ end
1050
+ rescue StandardError
1051
+ # no-op; we couldn't trap this signal
1052
+ end
1053
+ end
1054
+ end
1055
+ end