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,2944 @@
1
+ #Test automation script version# TA-5.5.mdn released time stamp: 12-03-12 14:40:20
2
+
3
+ require 'rubygems'
4
+ require 'net/telnet'
5
+ require 'nokogiri'
6
+ require 'timeout'
7
+ require 'yaml'
8
+ require './dsllib/common/dncs/dncs_utils'
9
+ require './dsllib/common/mas_db/mas_utils'
10
+ require './dsllib/common/utils/stb_health_check_utils'
11
+ require './dsllib/common/utils/sword_utils'
12
+ require './dsllib/common/mas_db/mas_db'
13
+ require './dsllib/common/mas_db/mas_conductor'
14
+ require './dsllib/common/remote_diagnostics/mdn_remote_diagnostics'
15
+ require './dsllib/common/remote_diagnostics/odn_web_server'
16
+ require './lib/selenium/appium/appium'
17
+ require './lib/extensions/extensions'
18
+
19
+ module LegacyLogging
20
+ # Public: DEPRECATED
21
+ def loginfo m, c=false, l=false, _="OCR", i=nil
22
+ p = '*WARNING* The `loginfo\' method is deprecated. '
23
+ logger.info(p + m, screenshot: c, use_last_image: l, screen_image: i)
24
+ end
25
+
26
+ # Public: DEPRECATED
27
+ def loginfo2 m, c=false, l=false, _="OCR", i=nil
28
+ p = '*WARNING* The `loginfo2\' method is deprecated. '
29
+ logger.info(p + m, screenshot: c, use_last_image: l, screen_image: i)
30
+ end
31
+
32
+ # Public: DEPRECATED
33
+ def loginfo3 m, c=true, l=true, _="OCR", i=nil
34
+ p = '*WARNING* The `loginfo3\' method is deprecated. '
35
+ # Update screen capture flag according to global flag
36
+ logger.info(p + m, screenshot: c, use_last_image: l, screen_image: i)
37
+ end
38
+
39
+ # Public: DEPRECATED
40
+ def loginfo4 m, c=true, l=false, _="OCR", i=nil
41
+ p = '*WARNING* The `loginfo4\' method is deprecated. '
42
+ # Update screen capture flag according to global flag
43
+ logger.info(p + m, screenshot: c, use_last_image: l, screen_image: i)
44
+ end
45
+
46
+ # Public: DEPRECATED
47
+ def logdebug m, c=false, l=false
48
+ p = '*WARNING* The `logdebug\' method is deprecated. '
49
+ # Update screen capture flag according to global flag
50
+ logger.info(p + m, screenshot: c, use_last_image: l)
51
+ end
52
+ end
53
+
54
+ module TmcUtils
55
+ include SwordUtils
56
+
57
+ # below file no longer exists. what was the purpose of requiring it here?
58
+ # require_lib_file 'test_cases/libraries/mobile/common/common'
59
+ def append_to_file (filename, text)
60
+ File.open(filename, 'a') do |f|
61
+ f.puts text
62
+ end
63
+ end
64
+
65
+ def read_from_file (filename)
66
+ text_read=""
67
+ File.open(filename, "r") do |f|
68
+ f.each_line do |line|
69
+ text_read+= line
70
+ end
71
+ end
72
+ return text_read
73
+ end
74
+
75
+ def write_to_file (filename, text)
76
+ File.open(filename, 'w') do|f|
77
+ f.write(text)
78
+ end
79
+ end
80
+
81
+ # Override exec_mas_cmd to use script option values over TMC configured values
82
+ def exec_mas_cmd(command, immediately: false)
83
+ mas_ip = test_data[:mas_server_ip]
84
+ mas_prompt = test_data[:mas_server_prompt]
85
+ mas_username = test_data[:mas_username]
86
+ mas_password = test_data[:mas_password]
87
+ retry_count = 3
88
+ begin
89
+ # Random sleep to avoid connection failure
90
+ unless immediately
91
+ sleep_time = rand(60)
92
+ logger.debug("Random sleep for MAS command : [#{sleep_time}] seconds")
93
+ sleep sleep_time.sec
94
+ end
95
+ if @ssh_to_mas.nil?
96
+ @ssh_to_mas = ssh_to(mas_ip, mas_username, password: mas_password)
97
+ end
98
+ @ssh_to_mas.send_command(command, timeout: 10.sec)#, prompt: mas_prompt, expect: nil)
99
+ rescue StandardError => e
100
+ retry_count = retry_count - 1
101
+ retry if retry_count > 0
102
+ raise e
103
+ end
104
+ end
105
+
106
+ # Override exec_dncs_cmd to use script option values over TMC configured values
107
+ def exec_dncs_cmd(command, immediately: false)
108
+ dncs_ip = test_data[:dncs_server_ip]
109
+ dncs_prompt = test_data[:dncs_server_prompt]
110
+ dncs_username = test_data[:dncs_username]
111
+ dncs_password = test_data[:dncs_password]
112
+ retry_count = 3
113
+ begin
114
+ # Random sleep to avoid connection failure
115
+ unless immediately
116
+ sleep_time = rand(60)
117
+ logger.debug("Random sleep for DNCS command : [#{sleep_time}] seconds")
118
+ sleep sleep_time.sec
119
+ end
120
+ if @ssh_to_dncs.nil?
121
+ @ssh_to_dncs = ssh_to(dncs_ip, dncs_username, password: dncs_password)
122
+ end
123
+ full_cmd = ". ./.profile > /dev/null 2>&1 && #{command}"
124
+ @ssh_to_dncs.send_command(full_cmd, timeout: 10.sec)#, prompt: dncs_prompt, expect: nil)
125
+ rescue StandardError => e
126
+ retry_count = retry_count - 1
127
+ retry if retry_count > 0
128
+ raise e
129
+ end
130
+ end
131
+
132
+ # Override reboot_stb_from_mas to use script option values over TMC configured values
133
+ def reboot_stb_from_mas(delay = 0)
134
+ mas_reboot_stb_with_delay(delay)
135
+ end
136
+
137
+
138
+ # Use this to convert epoch time back to seconds since the epoch
139
+ # * *Returns* :
140
+ # - seconds since the specifed epoch as a float
141
+ def from_epoch_time(epoch_time)
142
+ epoch_time.to_f / 1000
143
+ end
144
+
145
+ # Use it to verify vendor of the stb
146
+ # * *Args* :
147
+ # - +vendor+ -> Vendor to be verified ('cisco', 'samsung', 'motorola', 'pace', 'pioneer')
148
+ # * *Returns* :
149
+ # - true if stb is of given vendor else false
150
+ def stb_vendor? vendor
151
+ stb_model = fetch_stb_model
152
+ if vendor.casecmp('cisco') == 0
153
+ return true if stb_model.start_with?('SA') || stb_model == "Spectrum101_C"
154
+ elsif vendor.casecmp('samsung') == 0
155
+ return true if stb_model.start_with?('SMTH')
156
+ elsif vendor.casecmp('motorola') == 0
157
+ return true if stb_model.start_with?('DCX')
158
+ elsif vendor.casecmp('pace') == 0
159
+ return true if stb_model.start_with?('P')
160
+ elsif vendor.casecmp('pioneer') == 0
161
+ return true if stb_model.start_with?('V')
162
+ else
163
+ loginfo2 "Vendor not recognized [#{vendor}]"
164
+ end
165
+
166
+ return false
167
+ end
168
+
169
+ # Use it to check whether stb is capable of ODN, MDN, DVR, etc or not
170
+ # * *Args* :
171
+ # - +args+ -> check options list (comma separated)
172
+ # * *Returns* :
173
+ # - true if stb is capable for options else false
174
+ def stb_capable_of? (*args)
175
+ #return !$rti_flag if(args[0]=="ODN")
176
+ return stb_model_capable_of?(fetch_stb_model, *args)
177
+ end
178
+
179
+ # Use it to check whether given stb is capable of ODN, MDN, DVR, etc or not
180
+ # * *Args* :
181
+ # - +model+ -> model name of STB
182
+ # - +args+ -> check options list (comma separated)
183
+ # * *Returns* :
184
+ # - true if stb is capable for options else false
185
+ def stb_model_capable_of? (stbmodel, *args)
186
+ result = true
187
+ #TODO: put these options in the test data? restore STB registry? etc.
188
+ return false
189
+ args.each{|option|
190
+ if (option.casecmp('ODN') == 0 && !StbRegistry.odn?(stbmodel))
191
+ result = false
192
+ #logdebug "ODN : false"
193
+ elsif (option.casecmp('MDN') == 0 && !StbRegistry.mdn?(stbmodel))
194
+ result = false
195
+ #logdebug "MDN : false"
196
+ elsif (option.casecmp('DVR') == 0 && !StbRegistry.dvr_capable?(stbmodel))
197
+ result = false
198
+ #logdebug "DVR : false"
199
+ elsif (option.casecmp('NONDVR') == 0 && StbRegistry.dvr_capable?(stbmodel))
200
+ result = false
201
+ #logdebug "NONDVR : false"
202
+ elsif (option.casecmp('HD') == 0 && !StbRegistry.hd_capable?(stbmodel))
203
+ result = false
204
+ #logdebug "HD : false"
205
+ elsif (option.casecmp('SD') == 0 && StbRegistry.hd_capable?(stbmodel))
206
+ result = false
207
+ #logdebug "SD : false"
208
+ elsif (option.casecmp('LOWMEMORY') == 0 && !StbRegistry.low_memory_box?(stbmodel))
209
+ result = false
210
+ #logdebug "Low memory : false"
211
+ elsif (option.casecmp('ADSG') == 0 && !StbRegistry.adsg_capable?(stbmodel))
212
+ result = false
213
+ #logdebug "ADSG : false"
214
+ elsif (option.casecmp('ANALOG') == 0 && !StbRegistry.analog_channels_supported?(stbmodel))
215
+ result = false
216
+ #logdebug "Analog channel supported : false"
217
+ elsif (option.casecmp('HDMI') == 0 && !StbRegistry.hdmi_supported?(stbmodel))
218
+ result = false
219
+ #logdebug "HDMI port : false"
220
+ elsif (option.casecmp('NONHDMI') == 0 && StbRegistry.hdmi_supported?(stbmodel))
221
+ result = false
222
+ #logdebug "Does not have HDMI port : false"
223
+ elsif (option.casecmp('TUNERCOUNT1') == 0 && StbRegistry.tuner_count(stbmodel) != 1)
224
+ result = false
225
+ #logdebug "TUNERCOUNT 1 : false"
226
+ elsif (option.casecmp('TUNERCOUNT2') == 0 && StbRegistry.tuner_count(stbmodel) != 2)
227
+ result = false
228
+ #logdebug "TUNERCOUNT 2 : false"
229
+ elsif (option.casecmp('PIP') == 0 && !StbRegistry.pip_capable?(stbmodel))
230
+ result = false
231
+ #logdebug "PIP capable : false"
232
+ elsif (option.casecmp('MOCA') == 0 && !StbRegistry.moca_capable?(stbmodel))
233
+ result = false
234
+ #logdebug "MOCA capable : false"
235
+ end
236
+ }
237
+
238
+ return result
239
+ end
240
+
241
+ # Use it to reset packages on current STB
242
+ # * *Returns* :
243
+ # - true if successfully reset packages else false
244
+ def _reset_packages_for_stb
245
+ loginfo "Resetting packages on STB ..."
246
+ begin
247
+ # Get default package list from config file
248
+ required_packages = StbRegistry.required_packages fetch_stb_model
249
+ not_required_packages = StbRegistry.not_required_packages fetch_stb_model
250
+ # Reset packages
251
+ (return false unless add_pkg_on_dncs(required_packages,false)) unless required_packages.empty?
252
+ (return false unless remove_pkg_from_dncs(not_required_packages,false)) unless not_required_packages.empty?
253
+ rescue StandardError => e
254
+ loginfo2 "Exception raised while adding/removing packages",false
255
+ loginfo2 "Error msg : #{e.message}",false
256
+ logdebug e.backtrace.join("\n")
257
+ return false
258
+ end
259
+
260
+ loginfo2 "Successfully reset packages",false
261
+ return true
262
+ end
263
+
264
+ # Use it to reset packages on current STB
265
+ # * *Returns* :
266
+ # - true if successfully reset packages else false
267
+ def _reset_credit_limit_for_stb
268
+ loginfo "Resetting credit limit to 65000 ..."
269
+ begin
270
+ return false unless set_credit_limit_for_stb_from_dncs(65000,false)
271
+ rescue StandardError => e
272
+ loginfo2 "Exception raised while setting credit limit to - 65000",false
273
+ loginfo2 "Error msg : #{e.message}",false
274
+ logdebug e.backtrace.join("\n")
275
+ return false
276
+ end
277
+
278
+ loginfo2 "Successfully reset credit limit",false
279
+ return true
280
+ end
281
+
282
+ # Private method
283
+ # Use it to reset pin to 0000 (either PC pin or purchase pin)
284
+ def _reset_pin_to_4_zeros
285
+ # Verify that PIN entry has come up.
286
+ unless settings_screen_pin_entry_banner_appears?
287
+ loginfo2 'Pin entry screen does not appear',true
288
+ return false
289
+ end
290
+
291
+ pin = '0000'
292
+ pin_numbers = pin.chars.to_a
293
+ return false unless _settings_screen_enter_pin_and_verify_asterisks(pin_numbers)
294
+
295
+ if settings_screen_pin_entry_banner_title_message 'Incorrect'
296
+ loginfo2 "Incorrect pin: #{pin}",true,true
297
+
298
+ pin = '1234'
299
+ pin_numbers = pin.chars.to_a
300
+ return false unless _settings_screen_enter_pin_and_verify_asterisks(pin_numbers)
301
+
302
+ if settings_screen_pin_entry_banner_title_message 'Incorrect'
303
+ loginfo2 "Invalid pin [0000] or [1234]"
304
+ return false
305
+ end
306
+ else
307
+ loginfo2 "Pin [0000] verified no need to change"
308
+ return true
309
+ end
310
+
311
+ # Verify message for new pin entry screen
312
+ unless settings_screen_pin_entry_banner_title_message 'Enter'
313
+ loginfo2 "Failed to verify pin entry banner message - Enter your new PIN", true
314
+ return false
315
+ end
316
+
317
+ # Enter new pin
318
+ loginfo2 "New pin : 0000"
319
+ new_pin = '0000'
320
+ pin_numbers = new_pin.chars.to_a
321
+ return false unless _settings_screen_enter_pin_and_verify_asterisks(pin_numbers)
322
+
323
+ # Verify re-enter pin screen
324
+ unless (settings_screen_pin_entry_banner_title_message 'Re-Enter')
325
+ loginfo2 "Failed to verify pin entry banner message - Re-Enter your new PIN", true
326
+ return false
327
+ end
328
+
329
+ # Re-enter new pin
330
+ return false unless _settings_screen_enter_pin_and_verify_asterisks(pin_numbers)
331
+ return true
332
+ end
333
+
334
+ # Private method
335
+ # Use it to reset PC pin
336
+ # Assumption !! - OLD pin will be either 0000 or 1234
337
+ def _reset_pc_pin
338
+ # try to set to 0000 from 1234
339
+ reset_pin_from_mas = false
340
+ begin
341
+ settings_launch_and_verify
342
+ return false unless settings_screen_navigate_to_tab('PARENTAL CONTROL')
343
+ return false unless settings_screen_navigate_vertically_to('Blocking PIN', 10, 5)
344
+ press_select_sleep
345
+
346
+ unless _reset_pin_to_4_zeros
347
+ tcfail "Failed to reset pin to 0000"
348
+ end
349
+ press_exit_sleep # exit to full screen
350
+
351
+ loginfo2 "PC pin verified successfully",false
352
+ return true
353
+ rescue TestException => e
354
+ loginfo2 e.message
355
+ unless reset_pin_from_mas
356
+ change_parental_control_pin_from_mas('0000')
357
+ loginfo2 "Sleeping for 2 min ..."
358
+ sleep 2.min
359
+ reset_pin_from_mas = true
360
+ retry
361
+ end
362
+ loginfo2 "Failed to reset PC pin",true,false
363
+ return false
364
+ end
365
+ end
366
+
367
+ # Private method
368
+ # Use it to reset purchase pin
369
+ # Assumption !! - OLD pin will be either 0000 or 1234
370
+ def _reset_purchase_pin
371
+ # try to set to 0000 from 1234
372
+ reset_pin_from_mas = false
373
+ begin
374
+ settings_launch_and_verify
375
+ return false unless settings_screen_navigate_to_tab('Purchases')
376
+ return false unless settings_screen_navigate_vertically_to('Purchase PIN', 10, 5)
377
+
378
+ if settings_verify_status?('OFF')
379
+ press_select_sleep # to navigate to option to enable purchase pin
380
+ press_select_sleep # to enable purchase pin
381
+ return false unless settings_verify_status?('ON')
382
+ end
383
+
384
+ press_select_sleep # to select purchase pin option
385
+
386
+ return false unless settings_navigate_to_option('Change PIN',10)
387
+ press_select_sleep
388
+
389
+ return false unless _reset_pin_to_4_zeros
390
+ press_exit_sleep # exit to full screen
391
+
392
+ loginfo2 "Purchase pin verified successfully",false
393
+ return true
394
+ rescue TestException => e
395
+ loginfo2 e.message
396
+ unless reset_pin_from_mas
397
+ loginfo2 "Resetting pin using mas command ..."
398
+ change_purchase_pin_from_mas('0000')
399
+ loginfo2 "Sleeping for 2 min ..."
400
+ sleep 2.min
401
+ reset_pin_from_mas = true
402
+ retry
403
+ end
404
+ loginfo2 "Failed to reset purchase pin",true,false
405
+ return false
406
+ end
407
+ end
408
+
409
+ # Private method
410
+ # Use it to rest STB state
411
+ def _reset_stb(ignore_dvr_setup=false)
412
+ # Reset packages and credit limit for STB
413
+ _reset_stb_failed "Failed to reset packages" unless _reset_packages_for_stb
414
+ _reset_stb_failed "Failed to reset credit limit" unless _reset_credit_limit_for_stb
415
+
416
+ # Reboot STB to reset it's state
417
+ loginfo2 "Rebooting stb to reset state ...",false
418
+ (_reset_stb_failed "Failed to reboot STB using AC power") unless stb_reboot_using_ac_power
419
+ (_reset_stb_failed "Failed to Reboot STB") unless stb_wait_till_finish_rebooting(true)
420
+ loginfo2 "Successfully rebooted STB",false
421
+
422
+ # check whether STB is having valid ip or not
423
+ loginfo2 "Verifying valid IP ..."
424
+ unless has_valid_ip?
425
+ _reset_stb_failed "STB is not having valid IP, Please check STB MAC"
426
+ end
427
+
428
+ # Change default language to english if it's SPANISH
429
+ loginfo "Changing default launguage to English if it is Spanish"
430
+ _reset_stb_failed 'Failed to set language to English.' unless settings_screen_launch_and_reset_language_from_spanish_to_english
431
+
432
+ # Reset PC pin
433
+ loginfo2 "Resetting PC pin to [0000]"
434
+ _reset_stb_failed "Failed to reset PC pin to 0000" unless _reset_pc_pin
435
+ loginfo2 "Resetting Purchase pin to [0000]"
436
+ _reset_stb_failed "Failed to reset purchase pin to 0000" unless _reset_purchase_pin
437
+ loginfo2 "Enabling IPPV from DNCS ..."
438
+ _reset_stb_failed "Failed to enable IPPV flag" unless enable_ippv_from_dncs(false)
439
+ loginfo2 "Sleeping for 2 mins so that STB will get message from MAS and reset PIN ..."
440
+ sleep 2.min
441
+ loginfo2 "Successfully reset PC pin to [0000]"
442
+ loginfo2 "Successfully reset Purchase pin to [0000]"
443
+
444
+ # Reset PIP
445
+ if stb_capable_of?('PIP')
446
+ loginfo2 "Resetting PIP by powering OFF and ON STB ..."
447
+ _reset_stb_failed "Unable to power off STB" unless power_off_stb?
448
+ _reset_stb_failed "Unable to power on STB" unless power_on_stb?
449
+ loginfo2 "Successfully reset PIP window"
450
+ end
451
+
452
+ # Tuning to home channel
453
+ loginfo2 "Tuning to home channel : [#{fetch_option(:a_home_channel)}] ..."
454
+ press_exit_sleep
455
+ tune_immediately_to fetch_option(:a_home_channel)
456
+ # Resolved tuning conflict for DVR STBs
457
+ if stb_capable_of?('DVR') and record_screen_tuning_conflict_banner_appears?
458
+ if (stb_capable_of?('ODN') or stb_capable_of?('MDN'))
459
+ press_down_arrow_sleep
460
+ else
461
+ _reset_stb_failed "Not a valid STB type : #{fetch_stb_model}"
462
+ return false
463
+ end
464
+ end
465
+ press_exit_sleep
466
+
467
+ # Ignore pc pin error and continue with test case execution
468
+ loginfo2 "Turning OFF parental control"
469
+ begin
470
+ # set pc off
471
+ settings_launch_and_verify(true)
472
+ _reset_stb_failed "[Setup] failed to set parental control - OFF" unless settings_screen_set_parental_control_status('OFF')
473
+ # setting set transparency off (Not available in ODN52)
474
+ (_reset_stb_failed "[Setup] failed to set transparency - OFF" unless settings_screen_set_transparency('OFF')) if (fetch_option(:transparency_modifiable).casecmp('true') == 0) and stb_capable_of?('ODN')
475
+ press_exit_sleep
476
+ loginfo2 "Successfully turned OFF parental control and transparency"
477
+ rescue TestException => e
478
+ _reset_stb_failed "Settings error : #{e.message}"
479
+ press_exit_sleep
480
+ end
481
+
482
+ return if ignore_dvr_setup # return if dvr setup is not required
483
+
484
+ # Cleanup recordings for DVR STBs
485
+ begin
486
+ dvr_setup
487
+ rescue StandardError => e
488
+ _reset_stb_failed "[DVR setup] : #{e.message}"
489
+ end
490
+ end
491
+
492
+ # Private method
493
+ # Use it to clean up existing scheculed recordings and last two days recorded programs
494
+ def _stb_clean_up_recordings
495
+ # Launch show list
496
+ show_list_launch_and_verify
497
+
498
+ # remove all series reocrdings
499
+ tcfail "Failed to clear series recordings" unless show_list_screen_clear_all_series_recordings
500
+
501
+ # remove all scheduled recordings
502
+ tcfail "Failed to clear Scheduled recordings" unless show_list_screen_clear_all_scheduled_recordings
503
+
504
+ # remove all recorded programs
505
+ tcname = (($user_log.getTestCase).split("/")).last
506
+ ignore_test_cases = fetch_option(:ignore_last_two_days_recordings_for_scripts).to_s.split(",")
507
+ if ignore_test_cases.include?(tcname)
508
+ loginfo2 "Ignored last two days recording for : #{tcname}, Removing inprogress recordings ..."
509
+ tcfail "Failed to clear in progress recordings" unless show_list_delete_inprogress_recordings
510
+ else
511
+ tcfail "Failed to clear last two days recordings " unless show_list_delete_last_two_days_recordings
512
+ end
513
+
514
+ #Exit ot full screen
515
+ press_exit_sleep
516
+ end
517
+
518
+ # Initial Setup for dvr/recording test scripts
519
+ # Remove all Series Recording.
520
+ # Remove all Scheduled Recording.
521
+ # Remove last two day Recorded contented (including in progress) from show list
522
+ def dvr_setup
523
+ # DVR check
524
+ return unless stb_capable_of? 'DVR'
525
+
526
+ loginfo2 "DVR setup [START]",false
527
+ show_list_launch_and_verify
528
+ hdd_status_high_water_mark = fetch_option(:hdd_status_high_water_mark).to_s.to_i
529
+ hdd_status_high_water_mark = 90 if hdd_status_high_water_mark.eql?(0)
530
+ loginfo2 "Verifying HDD status is less than high water mark : #{hdd_status_high_water_mark}% full ..."
531
+ hdd_status = _percentage_hdd_full
532
+ hdd_status = 0 if hdd_status.nil?
533
+ if hdd_status > hdd_status_high_water_mark
534
+ hdd_status_low_water_mark = fetch_option(:hdd_status_low_water_mark).to_s.to_i
535
+ hdd_status_low_water_mark = 60 if hdd_status_low_water_mark.eql?(0)
536
+ loginfo2 "HDD [#{hdd_status}]% full more than high water mark level : #{hdd_status_high_water_mark}%, Removing recorded program to make it lower than [#{hdd_status_low_water_mark}]%"
537
+ tcfail "Failed to remove recording from STB to make HDD %{hdd_status_high_water_mark} % full" unless make_hdd_empty(hdd_status_low_water_mark)
538
+ end
539
+ loginfo2 "HDD status check successful"
540
+ _stb_clean_up_recordings
541
+ loginfo2 "DVR setup [END]",false
542
+ end
543
+
544
+ # Clean up for dvr/recording test scripts
545
+ # Remove all Series Recording.
546
+ # Remove all Scheduled Recording.
547
+ # Remove last two day Recorded contented (including in progress) from show list
548
+ def dvr_cleanup
549
+ # DVR check
550
+ return unless stb_capable_of? 'DVR'
551
+
552
+ loginfo2 "DVR cleanup [START]",false
553
+ _stb_clean_up_recordings
554
+ loginfo2 "DVR cleanup [END]",false
555
+ end
556
+
557
+ # Initial setup method to reset common STB settings
558
+ $execution_count = {}
559
+
560
+ # Private method to get execution count for active STB
561
+ def execution_count(count=nil, stb_id=$stb_id)
562
+ unless $execution_count.has_key?(stb_id.to_s)
563
+ $execution_count[stb_id.to_s] = 0
564
+ end
565
+
566
+ return $execution_count[stb_id.to_s]
567
+ end
568
+
569
+ # Private method to update execution count for active STB
570
+ def update_execution_count(count, stb_id=$stb_id)
571
+ unless $execution_count.has_key?(stb_id.to_s)
572
+ $execution_count[stb_id.to_s] = 0
573
+ end
574
+
575
+ $execution_count[stb_id.to_s] = count
576
+ end
577
+
578
+ $internal_iteration=2 # max iterations
579
+
580
+ def setup(ignore_dvr_setup=false)
581
+ # increase execution count
582
+ update_execution_count(execution_count + 1)
583
+
584
+ run_mode = fetch_option(:execution_mode).strip.downcase
585
+
586
+ # Do not run setup for first execution
587
+ if run_mode.eql?('advanced')
588
+ if execution_count == 1
589
+ loginfo2 "Executing test case using advanced mode ...",false
590
+
591
+ # Power on stb if required
592
+ tcfail "Failed to power ON STB" unless power_on_stb?
593
+
594
+ # Tuning to home channel
595
+ loginfo2 "Tuning to home channel : [#{fetch_option(:a_home_channel)}] ..."
596
+ press_exit_sleep
597
+ tune_immediately_to fetch_option(:a_home_channel)
598
+
599
+ loginfo2 "STB reset not required for first execution"
600
+ return
601
+ end # run setup subset for first run only
602
+ elsif run_mode.eql?('classic')
603
+ $internal_iteration = 1 # run test case with setup
604
+ loginfo2 "Executing test case using classic mode ...",false
605
+ else
606
+ $internal_iteration = 1 # run test case without setup
607
+ loginfo2 "Unknown execution mode, executing test case without setup",false
608
+ return
609
+ end
610
+
611
+ loginfo2 "Setup [START]"
612
+
613
+ begin
614
+ # Reset STB state
615
+ _reset_stb(ignore_dvr_setup)
616
+
617
+ # verify health check
618
+ # Home channel
619
+ tcfail "[STB health check failed] : Home channel" unless _verify_home_channel
620
+
621
+ # Screen launch and verify
622
+ tcfail "[STB health check failed] : Screens launch and verify" unless _verify_screen_launch
623
+
624
+ test_data[:stb_ip] = fetch_ip
625
+ rescue StandardError => e
626
+ _setup_failed e.message
627
+ end
628
+
629
+ loginfo2 "Setup [END]"
630
+ end
631
+
632
+ # Initial setup method to reset PIP window in second Quadrant
633
+ # * *Returns* :
634
+ # - true if PIP window successfully reset else false
635
+ def pip_setup
636
+ loginfo2 "PIP setup [START]",false
637
+ loginfo2 'Ensuring that pip will have video'
638
+ tune_immediately_to(fetch_option(:a_live_channel_1))
639
+ unless info_banner_launch_and_verify_channel_number(fetch_option(:a_live_channel_1), 10)
640
+ loginfo2 "Failed to tune to live channel: #{(fetch_option(:a_live_channel_1))}"
641
+ return false
642
+ end
643
+ unless fullscreen_video_playing?(20)
644
+ loginfo2 "Failed to verify video on live channel: #{(fetch_option(:a_live_channel_1))}"
645
+ return false
646
+ end
647
+
648
+ # Sleep for few seconds so that current channel will be last tuned channel
649
+ sleep 30.sec
650
+
651
+ tune_immediately_to(fetch_option(:a_live_channel_2))
652
+ unless info_banner_launch_and_verify_channel_number(fetch_option(:a_live_channel_2), 10)
653
+ loginfo2 "Failed to tune to live channel: #{(fetch_option(:a_live_channel_2))}"
654
+ return false
655
+ end
656
+ unless fullscreen_video_playing?(20)
657
+ loginfo2 "Failed to verify video on live channel: #{(fetch_option(:a_live_channel_2))}"
658
+ return false
659
+ end
660
+
661
+ press_pip_onoff_sleep
662
+ unless pip_window_appears?
663
+ loginfo2 "PIP window does not appeared after pressing PIP ON/OFF"
664
+ return false
665
+ end
666
+
667
+ unless pip_window_reset_quadrant
668
+ loginfo2 "Unable to Reset PIP window in second quadrant"
669
+ return false
670
+ end
671
+
672
+ press_pip_onoff_sleep
673
+ if pip_window_appears?
674
+ loginfo2 "PIP window appears after pressing PIP ON/OFF"
675
+ return false
676
+ end
677
+
678
+ loginfo2 "PIP setup [END]",false
679
+ return true
680
+ end
681
+
682
+ # Clenup methods for PIP
683
+ # * *Returns* :
684
+ # - true if PIP window successfully reset else false
685
+ def pip_cleanup
686
+ loginfo2 "PIP cleanup [START]",false
687
+ # Reset PIP
688
+ if stb_capable_of?('PIP')
689
+ loginfo2 "Resetting PIP by powering OFF and ON STB ..."
690
+ tcfail "Unable to power off STB" unless power_off_stb?
691
+ tcfail "Unable to power on STB" unless power_on_stb?
692
+ loginfo2 "Successfully reset PIP window"
693
+ end
694
+ loginfo2 "PIP cleanup [END]",false
695
+ end
696
+
697
+ # ADSG setup
698
+ # 1.) Add DSG package, in not present.
699
+ # 2.) Reboot STB.
700
+ # 3.) Verify if STB is up in DSG mode from host diags.
701
+ # (host_diags_verify_OOB_mode can be used)
702
+ def adsg_setup
703
+ begin
704
+ unless verify_package_on_dncs(['ADSGB'])
705
+ return false unless add_pkg_on_dncs(['ADSGB'], false)
706
+ return false unless stb_reboot_using_ac_power
707
+ return false unless stb_wait_till_finish_rebooting(true)
708
+ host_diags_launch_and_verify
709
+ return false unless host_diags_verify_OOB_mode('DSG')
710
+ else
711
+ host_diags_launch_and_verify
712
+ unless host_diags_verify_OOB_mode('DSG')
713
+ return false unless stb_reboot_using_ac_power
714
+ return false unless stb_wait_till_finish_rebooting(true) # TODO use reboot stb : line 710-111
715
+ host_diags_launch_and_verify
716
+ return false unless host_diags_verify_OOB_mode('DSG')
717
+ else
718
+ loginfo2 "STB already in 'ADSG' mode"
719
+ end
720
+ end
721
+ return true
722
+ rescue StandardError => e
723
+ loginfo2 e.message
724
+ return false
725
+ end
726
+ end
727
+
728
+ # ADSG cleanup
729
+ # 1.) Remove DSG package, if present.
730
+ # 2.) Reboot STB.
731
+ def adsg_cleanup
732
+ begin
733
+ if verify_package_on_dncs(['ADSGB'])
734
+ return false unless remove_pkg_from_dncs(['ADSGB'], false)
735
+ return false unless stb_reboot_using_ac_power
736
+ return false unless stb_wait_till_finish_rebooting(true) # TODO use reboot stb : line 710-111
737
+ host_diags_launch_and_verify
738
+ return false unless host_diags_verify_OOB_mode('OOB(SCTE55)')
739
+ else
740
+ loginfo2 "Package already removed"
741
+ end
742
+ return true
743
+ rescue StandardError => e
744
+ loginfo2 e.message
745
+ return false
746
+ end
747
+ end
748
+
749
+ # Use it to compare two string using string similarity
750
+ # * *Args* :
751
+ # - +expected_text+ -> expected text
752
+ # - +ocr_text+ -> ocr text
753
+ # - +similarity_level=0.75+ -> similarity level (e.g. 0.75 is 75% similar)
754
+ # * *Returns* :
755
+ # - true if string similar else false
756
+ def string_similar?(expected_text, ocr_text, similarity_level=0.75)
757
+ # nil or empty check for OCR and expected text
758
+ if (ocr_text.nil? or ocr_text.empty? or expected_text.nil? or expected_text.empty?)
759
+ loginfo2 "Empty string : OCR text -> #{ocr_text}, Expected text -> #{expected_text}"
760
+ return false
761
+ end
762
+
763
+ similarity = (string_similarity expected_text, ocr_text)
764
+ logdebug "[#{expected_text}] Similarity : #{similarity}"
765
+ return similarity >= similarity_level
766
+ end
767
+
768
+ # Use it to compare two string using sub-string similarity
769
+ # * *Args* :
770
+ # - +expected_text+ -> expected text
771
+ # - +ocr_text+ -> ocr text
772
+ # - +similarity_level=0.75+ -> similarity level (e.g. 0.75 is 75% similar)
773
+ # * *Returns* :
774
+ # - true if string similar else false
775
+ def sub_string_similar?(expected_text, ocr_text, similarity_level=0.75)
776
+ # nil or empty check for OCR and expected text
777
+ if (ocr_text.nil? or ocr_text.empty? or expected_text.nil? or expected_text.empty?)
778
+ loginfo2 "Empty string : OCR text -> #{ocr_text}, Expected text -> #{expected_text}}"
779
+ return false
780
+ end
781
+
782
+ similarity = (substring_similarity expected_text, ocr_text)
783
+ logdebug "[#{expected_text}] Similarity(SubStr) : #{similarity}"
784
+ return similarity >= similarity_level
785
+ end
786
+
787
+ # Use it to tune to given channel
788
+ def tune_immediately_to (channel)
789
+ key_seq = channel.to_s.chars.to_a
790
+ key_seq.push('SELECT') unless key_seq.length.eql?(4) # only for less than 4 digits channels
791
+ _press_key_sequence key_seq
792
+
793
+ sleep 3.sec
794
+ loginfo3 "Numeric tuning to channel : [#{channel}]",true,false,"TUNE_TO_#{channel}"
795
+ end
796
+
797
+ # Use it to verify if screensaver is active
798
+ def screensaver_active? retries = 5
799
+ # Brightness calibration will not work for black screen verification so removing it temporary
800
+ brightness_correction_status = get_stb_brightness_correction_status
801
+ loginfo2 "Brightness correction status : #{brightness_correction_status}",false
802
+ # Disable brightness correction
803
+ set_stb_brightness_correction_status('false')
804
+
805
+ roi_name = :screen_saver_roi
806
+ icon_file_path = golden_roi(:screensaver_twc_logo).referenceImage
807
+ result = false
808
+ if (screen_matches_for_icon_roi roi_name, icon_file_path, retries)
809
+ loginfo2 "Screen saver is displayed", true, false
810
+ result = true
811
+ else
812
+ loginfo2 "Failed to verify screensaver",true,false
813
+ result = false
814
+ end
815
+
816
+ # Restoring old value
817
+ set_stb_brightness_correction_status(brightness_correction_status.to_s)
818
+
819
+ return result
820
+ end
821
+
822
+ # Use it to verify if screensaver is dismissed.
823
+ def screensaver_inactive? retries = 5
824
+ # Brightness calibration will not work for black screen verification so removing it temporary
825
+ brightness_correction_status = get_stb_brightness_correction_status
826
+ loginfo2 "Brightness correction status : #{brightness_correction_status}",false
827
+ # Disable brightness correction
828
+ set_stb_brightness_correction_status('false')
829
+
830
+ roi_name = :screen_saver_inactive_roi
831
+ icon_file_path = golden_roi(:screensaver_twc_logo).referenceImage
832
+ result = false
833
+ if (screen_matches_for_icon_roi roi_name, icon_file_path, retries)
834
+ loginfo2 "Failed to verify screensaver dismissed",true,false
835
+ result = false
836
+ else
837
+ loginfo2 "Screen saver is dismissed", true, false
838
+ result = true
839
+ end
840
+
841
+ # Restoring old value
842
+ set_stb_brightness_correction_status(brightness_correction_status.to_s)
843
+
844
+ return result
845
+ end
846
+
847
+ # Use to to get mas db time zone difference in minutes
848
+ # * *Returns* :
849
+ # - GMT offset in minutes (integer)
850
+ def mas_db_time_zone_diff_in_min
851
+ tzbk = ENV['TZ'] # backup current time zone
852
+ tz = test_data[:mas_db_time_zone]
853
+ tz = tzbk if tz.nil? # Use system timezone
854
+
855
+ ENV['TZ'] = tz
856
+ result = (Time.now.gmt_offset / 60)
857
+ ENV['TZ'] = tzbk # restore backup current time zone
858
+
859
+ logdebug "MAS DB time zone difference in min : #{result}",false
860
+
861
+ return result
862
+ end
863
+
864
+ # Use to to get mas conductor time zone difference in minutes
865
+ # * *Returns* :
866
+ # - GMT offset in minutes (integer)
867
+ def mas_conductor_time_zone_diff_in_min
868
+ tz = test_data[:mas_conductor_time_zone]
869
+ unless tz.nil?
870
+ db_tz_diff = mas_db_time_zone_diff_in_min
871
+
872
+ tzbk = ENV['TZ'] # backup current time zone
873
+
874
+ ENV['TZ'] = tz
875
+ tz_diff = (Time.now.gmt_offset / 60)
876
+
877
+ result = (db_tz_diff - tz_diff)
878
+ ENV['TZ'] = tzbk # restore backup current time zone
879
+
880
+ logdebug "MAS Conductor time zone difference in min : #{result}",false
881
+
882
+ return result
883
+ else
884
+ return 0
885
+ end
886
+ end
887
+
888
+ # Use it to get current date from MAS
889
+ # * *Returns* :
890
+ # - date object that contains hashmap
891
+ # - e.g { day => 07, month => 06, year => 2011, hour => 05, min => 06, sec => 56 }
892
+ def mas_current_date
893
+ time_arr = mas_db_get_curr_date[0]['NOW'].split('/')
894
+
895
+ loginfo2 "MASDate : #{time_arr[0].to_i}/#{time_arr[1].to_i}/#{time_arr[2].to_i} #{time_arr[3].to_i}:#{time_arr[4].to_i}:#{time_arr[5].to_i}"
896
+
897
+ return Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
898
+ end
899
+
900
+ # Use it to get week days array
901
+ # * *Returns* :
902
+ # - array of weekdays
903
+ def week_days
904
+ return ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT']
905
+ end
906
+
907
+ # Use it to get week day of today
908
+ # * *Returns* :
909
+ # - weekday, e.g. "SUN", "MON", "TUE", etc.
910
+ def mas_current_date_week_day
911
+ wdays = week_days
912
+ t = mas_current_date
913
+ return wdays[t.wday]
914
+ end
915
+
916
+ # Use it to get channels list from mas
917
+ # * *Returns* :
918
+ # - Array of channel
919
+ # - each channel is array [integer, string] (number, name), e.g. [2, dstk]
920
+ def mas_channels_list
921
+ result_array = []
922
+ channel_hash_array = mas_db_get_channels
923
+ channel_hash_array.each {|channel|
924
+ result_array.push([channel['DISPLAY_CHANNEL'].to_s.to_i, channel['DISPLAY_NAME'].to_s.downcase])
925
+ }
926
+ return result_array
927
+ end
928
+
929
+ # Use it to get genre names from genre codes
930
+ # * *Args* :
931
+ # - +genre_codes+ -> codes list (e.g. ":17:18:") (get using db query)
932
+ # - +valid_genre+ -> valid genre codes array
933
+ # * *Returns* :
934
+ # - array of genre names
935
+ def genre_names_from (genre_codes="", valid_genre = valid_genre_codes)
936
+
937
+ names = []
938
+ genre_codes.split(":").each {|genre|
939
+ next if genre.empty?
940
+ index = valid_genre.index {|code| (code[0] == genre.to_i)}
941
+ names.push(valid_genre[index][1]) unless index.nil?
942
+ }
943
+
944
+ return names
945
+ end
946
+
947
+ # Private function
948
+ # Use it to get genre codes from genre names
949
+ # * *Args* :
950
+ # - +genre_names+ -> comma separated genre names. (e.g, "News, Weather")
951
+ # - +valid_genre+ -> valid genre codes array
952
+ # * *Returns* :
953
+ # - array of genre codes
954
+ def _genre_codes_from (genre_names="", valid_genre = valid_genre_codes)
955
+ codes = []
956
+ genre_names.split(",").each {|genre|
957
+ next if genre.empty?
958
+ index = valid_genre.index {|code| (code[1].to_s.casecmp(genre.to_s) == 0)}
959
+ codes.push(valid_genre[index][0]) unless index.nil?
960
+ }
961
+
962
+ return codes
963
+ end
964
+
965
+ # Use it to valid genre codes with description from MAS DB
966
+ # * *Returns* :
967
+ # - array of genre codes, genre desc
968
+ def valid_genre_codes
969
+ genre_arr = []
970
+ mas_db_genre.each {|data_hash|
971
+ genre_arr.push([data_hash['GENRE_CODE'].to_s.to_i, data_hash['GENRE_CODE_DESC'].to_s])
972
+ }
973
+
974
+ return genre_arr
975
+ end
976
+
977
+ # Private method
978
+ # Use to convert date and time to 'TO_DATE' format
979
+ # * *Args* :
980
+ # - +date_arr+ -> first element will be days (e.g. 0 for today, 1 for tomorrow) and
981
+ # second element will be time in 24hrs format (e.g 18:00)
982
+ # * *Returns* :
983
+ # - 'TO_DATE' format date and time. (e.g TO_DATE('2011-07-20 07:00:00'))
984
+ def _parse_date date_arr, curr_date = mas_current_date
985
+ time_zone_diff = mas_db_time_zone_diff_in_min
986
+
987
+ if(date_arr.class == Time)
988
+ new_time = (Time.local(date_arr.year,date_arr.month,date_arr.day,date_arr.hour,date_arr.min,0) - (time_zone_diff * 60)).strftime("%Y-%m-%d %H:%M:00")
989
+ return "TO_DATE('#{new_time}')"
990
+ end
991
+
992
+ if date_arr.length == 2
993
+ hour = date_arr[1][0..(date_arr[1].index(':') - 1)]
994
+ mins = date_arr[1][(date_arr[1].index(':') + 1)..(date_arr[1].length)]
995
+ new_time = (Time.local(curr_date.year,curr_date.month,curr_date.day,hour,mins,0) + (date_arr[0]*24*3600) - (time_zone_diff * 60)).strftime("%Y-%m-%d %H:%M:00")
996
+
997
+ return "TO_DATE('#{new_time}')"
998
+ elsif date_arr.length == 1
999
+ mins = curr_date.min > 30 ? 30 : 0
1000
+ curr_time = (Time.local(curr_date.year,curr_date.month,curr_date.day,curr_date.hour,mins,0) + (date_arr[0]*24*3600) - (time_zone_diff * 60)).strftime("%Y-%m-%d %H:%M:00")
1001
+ return "TO_DATE('#{curr_time}')"
1002
+ else
1003
+ return "''"
1004
+ end
1005
+ end
1006
+
1007
+ # Private function
1008
+ # Use it to get advisory flags from MAS db
1009
+ def _valid_advisory_flags
1010
+ # Avoid MAS query for static list
1011
+ # result = []
1012
+ # mas_db_advisory_flags.each{ |flag_details|
1013
+ # result.push([flag_details['ADVISORY_FLAG'].to_s.to_i, flag_details['ADVISORY_LONG_DESC'].to_s])
1014
+ # }
1015
+ #
1016
+ # return result
1017
+
1018
+ result = [
1019
+ [0,'No Advisories'],
1020
+ [1,'Sexual Content'],
1021
+ [2,'Violence'],
1022
+ [4,'Explicit Language'],
1023
+ [8,'Strong Dialog'],
1024
+ [16,'Fantasy Violence'],
1025
+ [32,'Adult Situations'],
1026
+ [64,'Brief Nudity'],
1027
+ [128,'Graphic Language'],
1028
+ [256,'Graphic Violence'],
1029
+ [512,'Language'],
1030
+ [1024,'Mild Violence'],
1031
+ [2048,'Nudity'],
1032
+ [4096,'Rape'],
1033
+ [8192,'Strong Sexual']] # TODO : database mismatch "Strong Sexual Content"
1034
+
1035
+ return result
1036
+ end
1037
+
1038
+ # Private function
1039
+ # Use it to get advisory flags from advisory code
1040
+ def _advisory_flags_from_advisory_code advisory_code, flags = _valid_advisory_flags
1041
+ # return first no advisory if advisory_code is 0
1042
+ return flags[0][1] if advisory_code.nil? || advisory_code.to_s.to_i == 0
1043
+
1044
+ result = []
1045
+ advisory_code_int = advisory_code
1046
+ advisory_code = advisory_code.to_s.to_i.to_s(2).reverse # convert to string -> integer -> string base 2
1047
+
1048
+ counter = 1
1049
+ advisory_code.each_char {|flag|
1050
+ if counter >= flags.length
1051
+ loginfo2 "advisory_code [#{advisory_code_int}] not available"
1052
+ next
1053
+ end
1054
+ result.push(flags[counter][1]) if flag.casecmp('1') == 0
1055
+ counter = counter + 1
1056
+ }
1057
+
1058
+ return result.join(',')
1059
+ end
1060
+
1061
+ # Private function
1062
+ # Use it to get event flags from MAS db
1063
+ def _valid_event_flags
1064
+ # TODO fix me : EV_FLAG is not having all flags
1065
+ # result = []
1066
+ # mas_db_event_flags.each {|program_type|
1067
+ # result.push([program_type['EV_FLAG'].to_s.to_i, program_type['EV_FLAG_DESC'].to_s])
1068
+ # }
1069
+
1070
+ result = [
1071
+ [0, 'RESERVED'],
1072
+ [1, 'REPEAT'],
1073
+ [2, 'LETTERBOX'],
1074
+ [4, 'HDTV'],
1075
+ [8, 'CLOSED_CAPTIONED'],
1076
+ [16, 'ENHANCED'],
1077
+ [32, 'STEREO'],
1078
+ [64, 'DOLBY'],
1079
+ [128, 'SAP'],
1080
+ [256, 'MYSTRO_PAUSABLE'],
1081
+ [512, 'MYSTRO_REWIND_PRIOR_TO_SESSION_START'],
1082
+ [1024, 'MYSTRO_PAST_RESERVE'],
1083
+ [2048, 'MYSTRO_CURRENT_RESERVE'],
1084
+ [4096, 'MYSTRO_FUTURE_RESERVE']]
1085
+
1086
+ return result
1087
+ end
1088
+
1089
+ # Private function
1090
+ # Use it to get event flags from event code
1091
+ def _event_flags_from_event_code event_code, flags = _valid_event_flags
1092
+ # return first no event flag if event_code is 0
1093
+ return flags[0][1] if event_code.nil? || event_code.to_s.to_i == 0
1094
+
1095
+ result = []
1096
+ event_code_int = event_code
1097
+ event_code = event_code.to_s.to_i.to_s(2).reverse # convert to string -> integer -> string base 2
1098
+
1099
+ counter = 1
1100
+ event_code.each_char {|flag|
1101
+ if counter >= flags.length
1102
+ loginfo2 "event_code [#{event_code_int}] not available"
1103
+ next
1104
+ end
1105
+ result.push(flags[counter][1]) if flag.casecmp('1') == 0
1106
+ counter = counter + 1
1107
+ }
1108
+
1109
+ return result.join(',')
1110
+ end
1111
+
1112
+ # Use it to find program on particular channel, time and duration
1113
+ # * *Args* :
1114
+ # - +params+ -> data hash e.g params = {{:CHANNEL_NUMBER => 85, :CHANNEL_NUMBERS => [80, 85, 45], :START_DATE_TIME => [0, '1:00'] OR ruby_time, :END_DATE_TIME => [0, '2:00'] OR ruby_time}}
1115
+ # - all return array parameters can be passed as argument
1116
+ # - GENRE_NAMES are comma separated names(e.g, News, Weather)
1117
+ # - Valid PROGRAM_TYPE = EP, MV, Miniseries, Paid Programming, SH, SP, Series, Special
1118
+ # * *Returns* :
1119
+ # - Array of programs each array will contain CHANNEL_NUMBER, CHANNEL_NAME, PROGRAM_START_TIME, PROGRAM_END_TIME, PROGRAM_SHORT_TITLE, PROGRAM_LONG_TITLE
1120
+ # PROGRAM_RATING_SHORT, PROGRAM_RATING_LONG, PROGRAM_STAR_RATING, PROGRAM_GENRE_CODES, PROGRAM_SHORT_DESC, PROGRAM_LONG_DESC, PROGRAM_TYPE, PROGRAM_CONTENT_TYPE, PROGRAM_FLAG, EVENT_DETAIL_ID, SERVICE_SCHEDULE_ID, MYSTRO_SERVICE_ID
1121
+ def find_programs(params={}, curr_date = mas_current_date)
1122
+ where_clause = ''
1123
+ where_clause << " AND MYSTRO_CHANNEL.DISPLAY_CHANNEL = #{params[:CHANNEL_NUMBER]}" if (!params[:CHANNEL_NUMBER].nil? && params[:CHANNEL_NUMBER].to_s.to_i >= 0)
1124
+ where_clause << " AND MYSTRO_CHANNEL.DISPLAY_CHANNEL IN (#{params[:CHANNEL_NUMBERS].join(',')})" if (!params[:CHANNEL_NUMBERS].nil? && params[:CHANNEL_NUMBERS].class == Array && !(params[:CHANNEL_NUMBERS].empty?))
1125
+ where_clause << " AND UPPER(MYSTRO_SERVICE.DISPLAY_NAME) LIKE '%#{params[:CHANNEL_NAME].to_s.upcase}%'" if (!params[:CHANNEL_NAME].nil? && params[:CHANNEL_NAME].strip != '')
1126
+ where_clause << " AND (SERVICE_SCHEDULE.TMS_ENDAIR_TIME > #{_parse_date(params[:START_DATE_TIME], curr_date)})" if (!params[:START_DATE_TIME].nil? && params[:END_DATE_TIME].nil?)
1127
+ where_clause << " AND (SERVICE_SCHEDULE.TMS_AIR_DATETIME < #{_parse_date(params[:END_DATE_TIME], curr_date)})" if (!params[:END_DATE_TIME].nil? && params[:START_DATE_TIME].nil?)
1128
+ where_clause << " AND (SERVICE_SCHEDULE.TMS_ENDAIR_TIME > #{_parse_date(params[:START_DATE_TIME], curr_date)} AND SERVICE_SCHEDULE.TMS_AIR_DATETIME < #{_parse_date(params[:END_DATE_TIME], curr_date)})" if (!params[:END_DATE_TIME].nil? && !params[:START_DATE_TIME].nil?)
1129
+ where_clause << " AND UPPER(EVENT.EVENT_SHORT_TITLE) LIKE '%#{params[:PROGRAM_SHORT_TITLE].to_s.upcase}%'" if (!params[:PROGRAM_SHORT_TITLE].nil? && params[:PROGRAM_SHORT_TITLE].strip != '')
1130
+ where_clause << " AND UPPER(EVENT.EVENT_LONG_TITLE) LIKE '%#{params[:PROGRAM_LONG_TITLE].to_s.upcase}%'" if (!params[:PROGRAM_LONG_TITLE].nil? && params[:PROGRAM_LONG_TITLE].strip != '')
1131
+ where_clause << " AND UPPER(RATING_FLAG.RATING_FLAG_SHORT_DESC) LIKE '%#{params[:PROGRAM_RATING_SHORT].to_s.upcase}%'" if (!params[:PROGRAM_RATING_SHORT].nil? && params[:PROGRAM_RATING_SHORT].strip != '')
1132
+ where_clause << " AND UPPER(RATING_FLAG.RATING_FLAG_LONG_DESC) LIKE '%#{params[:PROGRAM_RATING_LONG].to_s.upcase}%'" if (!params[:PROGRAM_RATING_LONG].nil? && params[:PROGRAM_RATING_LONG].strip != '')
1133
+ where_clause << " AND UPPER(STAR_RATING_CODE.STAR_RATING_CODE_DESC) LIKE '%#{params[:PROGRAM_STAR_RATING].to_s.upcase}%'" if (!params[:PROGRAM_STAR_RATING].nil? && params[:PROGRAM_STAR_RATING].strip != '')
1134
+ where_clause << " AND UPPER(EVENT_DETAIL.EVENT_SHORT_DESCRIPTION) LIKE '%#{params[:PROGRAM_SHORT_DESC].to_s.upcase}%'" if (!params[:PROGRAM_SHORT_DESC].nil? && params[:PROGRAM_SHORT_DESC].strip != '')
1135
+ where_clause << " AND UPPER(EVENT_DETAIL.EVENT_LONG_DESCRIPTION) LIKE '%#{params[:PROGRAM_LONG_DESC].to_s.upcase}%'" if (!params[:PROGRAM_LONG_DESC].nil? && params[:PROGRAM_LONG_DESC].strip != '')
1136
+ where_clause << " AND UPPER(EVENT.EVENT_TYPE) LIKE '%#{params[:PROGRAM_TYPE].to_s.upcase}%'" if (!params[:PROGRAM_TYPE].nil? && params[:PROGRAM_TYPE].strip != '')
1137
+ where_clause << " AND EVENT_DETAIL.ADVISORY_CODE NOT IN ('0')" if (!params[:HAS_CONTENT_TYPES].nil? && params[:HAS_CONTENT_TYPES] == true)
1138
+ where_clause << " AND (SERVICE_SCHEDULE.TMS_ENDAIR_TIME > #{_parse_date(params[:DATE_TIME], curr_date)} AND SERVICE_SCHEDULE.TMS_AIR_DATETIME <= #{_parse_date(params[:DATE_TIME], curr_date)})" if (!params[:DATE_TIME].nil?)
1139
+ where_clause << " AND EVENT.EVENT_ID like '#{params[:EVENT_ID]}'" if (!params[:EVENT_ID].nil? && params[:EVENT_ID].strip != '')
1140
+ # hidden channel check, clock channel check
1141
+ if (!params[:CHANNEL_HIDDEN].nil? && params[:CHANNEL_HIDDEN] == true)
1142
+ where_clause << " AND MYSTRO_CHANNEL.CHANNEL_FLAGS >= 32 "
1143
+ elsif !params[:CHANNEL_NUMBER].nil? && params[:CHANNEL_NUMBER].to_s == fetch_option(:a_clock_channel).to_s
1144
+ # Do nothing
1145
+ loginfo2 "Query for clock channel data (hidden channel)"
1146
+ else
1147
+ where_clause << " AND MYSTRO_CHANNEL.CHANNEL_FLAGS < 32 "
1148
+ end
1149
+
1150
+ if (!params[:GENRE_NAMES].nil? && !params[:GENRE_NAMES].strip.empty?)
1151
+ where_clause << " AND ( "
1152
+ _genre_codes_from(params[:GENRE_NAMES]).each{|code|
1153
+ where_clause << "EVENT_DETAIL.GENRE_CODE LIKE '%:#{code}:%' OR "
1154
+ }
1155
+ where_clause = "#{where_clause[0..(where_clause.length - 4)]} )"
1156
+ end
1157
+
1158
+ if (!params[:PROGRAM_FLAGS].nil? && !params[:PROGRAM_FLAGS].empty?)
1159
+ valid_flags = _valid_event_flags
1160
+ result = 0
1161
+ params[:PROGRAM_FLAGS].each{|flag|
1162
+ index = valid_flags.index{|v_flag| v_flag[1].delete(' ').downcase.casecmp(flag.delete(' ').downcase) == 0}
1163
+ result = result + valid_flags[index][0]
1164
+ }
1165
+
1166
+ where_clause << "AND BITAND(SERVICE_SCHEDULE.MYSTRO_EVENT_CODE, #{result}) = #{result}"
1167
+ end
1168
+
1169
+ if (!params[:PROGRAM_CONTENT_TYPES].nil? && params[:PROGRAM_CONTENT_TYPES].empty?)
1170
+ valid_adflags = _valid_advisory_flags
1171
+ result = 0
1172
+ params[:PROGRAM_CONTENT_TYPES].each{|flag|
1173
+ index = valid_adflags.index{|v_flag| v_flag[1].delete(' ').downcase.casecmp(flag.delete(' ').downcase) == 0}
1174
+ result = result + valid_adflags[index][0]
1175
+ }
1176
+
1177
+ where_clause << "AND BITAND(EVENT_DETAIL.ADVISORY_CODE, #{result}) = #{result}"
1178
+ end
1179
+
1180
+ loginfo2 "WhereClause : #{where_clause}"
1181
+
1182
+ data_arr = mas_db_guide_data where_clause
1183
+ result_arr = []
1184
+ return result_arr if data_arr.nil?
1185
+
1186
+ # Advisory flags
1187
+ flags = _valid_advisory_flags
1188
+ types = _valid_event_flags
1189
+
1190
+ data_arr.each {|data_hash|
1191
+ time_arr = data_hash['PROGRAM_START_TIME'].split('/')
1192
+ prog_start_time = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
1193
+
1194
+ time_arr = data_hash['PROGRAM_END_TIME'].split('/')
1195
+ prog_end_time = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
1196
+
1197
+ content_type = _advisory_flags_from_advisory_code(data_hash['CONTENT_TYPE'], flags)
1198
+ event_type = _event_flags_from_event_code(data_hash['EVENT_CODE'],types)
1199
+
1200
+ result_arr.push([data_hash['CHANNEL_NUMBER'].to_s.to_i, data_hash['CHANNEL_NAME'], prog_start_time, prog_end_time, data_hash['PROGRAM_SHORT_TITLE'], data_hash['PROGRAM_LONG_TITLE'], data_hash['PROGRAM_RATING_SHORT'], data_hash['PROGRAM_RATING_LONG'], data_hash['PROGRAM_STAR_RATING'], data_hash['PROGRAM_GENRE_CODES'], (data_hash['PROGRAM_SHORT_DESC'] || ""), (data_hash['PROGRAM_LONG_DESC'] || ""), data_hash['PROGRAM_TYPE'], content_type, event_type, data_hash['EVENT_DETAIL_ID'], data_hash['SERVICE_SCHEDULE_ID'], data_hash['MYSTRO_SERVICE_ID'], data_hash['EVENT_ID']])
1201
+ }
1202
+ return result_arr
1203
+ end
1204
+
1205
+ # Use it to fetch option from YAML file
1206
+ # * *Args* :
1207
+ # - +option+ -> option name (e.g. :a_live_channel1)
1208
+ # * *Returns* :
1209
+ # - Option value as string
1210
+ def fetch_option(option, default=:__fetch_option_default)
1211
+ if default == :__fetch_option_default
1212
+ result = test_data[option]
1213
+ raise "Test data missing attribute: :#{option}" if result.nil?
1214
+ else
1215
+ result = test_data.fetch(option, default)
1216
+ end
1217
+ result
1218
+ end
1219
+
1220
+ # DEPRECATED
1221
+ def set_option(option, value)
1222
+ loginfo2 "WARNING: set_option is deprecated",false
1223
+ option = option.to_sym
1224
+ old_value = test_data[option]
1225
+ unless old_value.nil?
1226
+ loginfo2 "Option[#{option}] : OLD value [#{old_value}] - New value[#{value}]",false
1227
+ test_data[option] = value
1228
+ else
1229
+ loginfo2 "Option missing from test data: #{option}",false
1230
+ end
1231
+ end
1232
+
1233
+ def fetch_stb
1234
+ return $stb
1235
+ end
1236
+
1237
+ # Use it to get rack ip
1238
+ def fetch_rack_ip
1239
+ return $ip_address
1240
+ end
1241
+
1242
+ # Use it to undo black and white screen using long select + 1 key sequence
1243
+ def stb_undo_black_n_white
1244
+ return false unless power_off_stb?
1245
+
1246
+ key_seq = [['SEL_LONG', 10000], ['1', 200], ['POWER', 200]]
1247
+ _press_key_sequence key_seq
1248
+
1249
+ sleep 5.sec
1250
+
1251
+ return true
1252
+ end
1253
+
1254
+ # Use it to fetch ip address of STB from its MAC address
1255
+ # * *Args* :
1256
+ # * *Returns* :
1257
+ # - IP address or nil if IP unavailable
1258
+ def fetch_ip
1259
+ #if test_data[:sword_override_tmc] == "true"
1260
+ #return test_data[:stb_ip]
1261
+ #end
1262
+ return "00:00:00:00" if $rti_flag==false
1263
+ ip_addr = nil
1264
+ begin
1265
+ mac_addr = fetch_stb_mac_address
1266
+ loginfo2 "Mac address: #{mac_addr}",false
1267
+
1268
+ # TODO : mac address check
1269
+ # if mac_addr.to_s.scan(/(\s*)([0-9A-F]{12})(\s*)/).empty?
1270
+ # loginfo2 "STB is not having valid MAC address",false
1271
+ # return nil
1272
+ # end
1273
+ if(mac_addr.gsub(':','').length > 12)
1274
+ loginfo2 "Executing mas command 'mdiags stb unitaddr2ip #{mac_addr}'",false
1275
+ result = (exec_mas_cmd "mdiags stb unitaddr2ip #{mac_addr}")
1276
+ else
1277
+ loginfo2 "Executing mas command 'mdiags stb mac2ip #{mac_addr}'",false
1278
+ result = (exec_mas_cmd "mdiags stb mac2ip #{mac_addr}")
1279
+ end
1280
+
1281
+ loginfo2 "MAS Command Result : #{result}",false
1282
+
1283
+ tcfail 'MAS command result is nil or empty' if result.nil? or result.empty?
1284
+
1285
+ ip_add_array = result.to_s.scan(/(\d{1,3})(.)(\d{1,3})(.)(\d{1,3})(.)(\d{1,3})/)
1286
+
1287
+ if ip_add_array.empty?
1288
+ loginfo2 "MAS command result (output) is not having valid IP address",false
1289
+ else
1290
+ ip_addr = ip_add_array[0].to_s
1291
+ loginfo2 "IP address : #{ip_addr}",false
1292
+ end
1293
+ rescue => e
1294
+ loginfo2 "EXEC MAS command error : #{e.message}",false
1295
+ end
1296
+
1297
+ return ip_addr
1298
+ end
1299
+
1300
+ # Use it to fetch screensaver timeout from MAS via selenium
1301
+ def screen_saver_timeout_in_millis
1302
+ time_in_min = fetch_screensaver_timeout
1303
+ loginfo2 "Screen saver timeout is #{time_in_min} minutes"
1304
+ return time_in_min.to_i.min
1305
+ end
1306
+
1307
+ # Use it to check that box has a valid IP Address.
1308
+ def has_valid_ip?(stb_ip = fetch_ip,retries=5)
1309
+ if stb_ip.nil?
1310
+ loginfo2 'Box has not been assigned any IP Address.',false
1311
+ return false
1312
+ else
1313
+ loginfo2 "IP of the box is #{stb_ip}",false
1314
+
1315
+ retries.times do
1316
+ ping_cmd = "/bin/ping -c 3 #{stb_ip}"
1317
+ result = exec_mas_cmd ping_cmd
1318
+ loginfo2 "Ping result : #{result}",false
1319
+
1320
+ packets_received = result.scan(/(\d+)(\s+)(received)/)
1321
+ if packets_received.empty?
1322
+ loginfo2 "Ping command output is not having packet received count",false
1323
+ return false
1324
+ else
1325
+ return true if (packets_received[0][0].to_s.to_i > 0)
1326
+ loginfo2 "100 % packet loss, IP[#{stb_ip}] is not reachable",false
1327
+ # sleep for 10 sec and try again
1328
+ sleep 10.sec
1329
+ next
1330
+ end
1331
+ end
1332
+
1333
+ loginfo2 "Failed to validate STB ip",false
1334
+ return false
1335
+ end
1336
+ end
1337
+
1338
+ # Use to verify whether STB is having valid MAC address or not (syntax)
1339
+ def has_valid_mac?
1340
+ mac_add = fetch_stb_mac_address.to_s.strip
1341
+
1342
+ re1='((?:[0-9A-F][0-9A-F]:){5}(?:[0-9A-F][0-9A-F]))(?![:0-9A-F])' # Mac Address 1
1343
+ re2='(([0-9A-F][0-9A-F]){5}([0-9A-F][0-9A-F]))(?![0-9A-F])' # Mac Address 2
1344
+
1345
+ m1=Regexp.new(re1,Regexp::IGNORECASE);
1346
+ m2=Regexp.new(re2,Regexp::IGNORECASE);
1347
+ if m1.match(mac_add) or m2.match(mac_add)
1348
+ loginfo2 "STB is having valid MAC address (Syntax)",false
1349
+ return true
1350
+ else
1351
+ loginfo2 "STB is not having valid MAC address (Syntax)",false
1352
+ return false
1353
+ end
1354
+ end
1355
+
1356
+ # Use it to verify whether STB is having valid MODEL defined or not (settop box config)
1357
+ # Verify from stb registry
1358
+ def has_valid_model?
1359
+ stbmodel = fetch_stb_model.to_s.upcase
1360
+
1361
+ if StbRegistry.model_exists?(stbmodel)
1362
+ loginfo2 "STB model #{stbmodel} exists in STB Registry",false
1363
+ return true
1364
+ else
1365
+ loginfo2 "STB model #{stbmodel} does not exist in STB Registry",false
1366
+ return false
1367
+ end
1368
+ end
1369
+
1370
+ # Use it check whether STB is able to response commands from DNCS to check connectivity
1371
+ # This method will send call to STB and verify whether STB is getting calling message or not
1372
+ def has_connectivity?
1373
+ # add caller id package
1374
+ return false unless add_pkg_on_dncs(fetch_option(:caller_id_package_name))
1375
+
1376
+ begin
1377
+ caller_id_prompt_on
1378
+ press_exit_sleep
1379
+ rescue StandardError => e
1380
+ loginfo2 "Failed to set caller id prompt to ON : #{e.message}"
1381
+ return false
1382
+ end
1383
+
1384
+ # send call to STB
1385
+ caller_name = "AAA_#{dut.id.to_s}"
1386
+ caller_number = "0" << dut.id.to_s(2)
1387
+ callee_number = "0000"
1388
+
1389
+ return false unless send_call_to_stb(caller_name, caller_number, callee_number)
1390
+
1391
+ # verify caller id screen
1392
+ if ocr_text_similar_for_roi(:caller_id_call_log_roi,'Call Log',3,true,false,0.75,true)
1393
+ result1 = ocr_text_includes_for_roi(:caller_id_caller_name_roi,caller_name,3,true,false,1.0,true)
1394
+ result2 = ocr_text_includes_for_roi(:caller_id_caller_number_roi,caller_number,3,true,false,1.0,true)
1395
+ if result1 or result2
1396
+ press_exit_sleep
1397
+ return true
1398
+ end
1399
+ end
1400
+
1401
+ loginfo2 "Failed to verify caller name / caller number : [#{caller_name},#{caller_number}]"
1402
+ return false
1403
+ end
1404
+
1405
+ # Use it to get all parental rating values
1406
+ # * *Returns* :
1407
+ # - array of ratings, each rating is array of short description and long description
1408
+ # e.g. [['TV-Y','All Children'], ['TV-Y7','Children Age 7 and Above'] .. etc
1409
+ def valid_parental_ratings
1410
+ # Avoid MAS Query for static list
1411
+ # result = []
1412
+ # mas_db_parental_ratings.each { |rating_hash|
1413
+ # result.push([rating_hash['RATING_FLAG_SHORT_DESC'].to_s, rating_hash['RATING_FLAG_LONG_DESC'].to_s])
1414
+ # }
1415
+ #
1416
+ # return result
1417
+
1418
+ result = [
1419
+ ['NR','No Mystro Rating'],
1420
+ ['TV-Y','All Children'],
1421
+ ['TV-Y7','Children Age 7 and Above'],
1422
+ ['TV-G','General Audience'],
1423
+ ['G','General Audience'],
1424
+ ['TV-PG','Parental Guidence Suggested'],
1425
+ ['PG','Parental Guidence Suggested'],
1426
+ ['PG-13','Parents Strongly Cautioned'],
1427
+ ['TV-14','Parents Strongly Cautioned'],
1428
+ ['TV-MA','Mature Audiences Only'],
1429
+ ['R','Restricted'],
1430
+ ['NC-17','No One Under 17'],
1431
+ ['AO','Adults Only']]
1432
+
1433
+ return result
1434
+ end
1435
+
1436
+ # Use to get index of given rating
1437
+ # * *Args* :
1438
+ # - +rating+ -> rating string to get index of
1439
+ # - +flags+ -> valid rating flags
1440
+ # * *Returns* :
1441
+ # - index of specified rating flag , nil for invalid rating flag
1442
+ def parental_rating_index rating, flags = valid_parental_ratings
1443
+ index = flags.index{|flag| flag[0].casecmp(rating) == 0}
1444
+ loginfo2 "Invalid rating flag : #{rating}" if index.nil?
1445
+ return index
1446
+ end
1447
+
1448
+ # Use it to verify the catalog info from web-based Diagnostics page for the STB and MAS.
1449
+ # * *Returns* :
1450
+ # - true if atleast one value of catalog info from web-based Diagnostics page for the STB matches with MAS"
1451
+ def verify_mas_catalogs_with_stb_catalogs?
1452
+ ip = fetch_ip
1453
+ if ip.nil?
1454
+ loginfo2 'STB does not have an IP address'
1455
+ return false
1456
+ end
1457
+ return false unless has_valid_ip?(ip)
1458
+ web_diag_catalog = []
1459
+ loginfo2 "Fetching catalogs directory from web diags"
1460
+ if stb_capable_of? 'MDN'
1461
+ web_diag_catalog = _fetch_mdn_airtime_catalog_id ip
1462
+ elsif stb_capable_of? 'ODN'
1463
+ web_diag_catalog = _fetch_odn_airtime_catalog_id ip
1464
+ end
1465
+ if web_diag_catalog.empty?
1466
+ loginfo2 "Unable to fetch catalog directory from web diagnostics"
1467
+ return false
1468
+ end
1469
+ loginfo2 "Successfully fetched airtime catalogs directory from web diagnostics"
1470
+
1471
+ loginfo2 "Fetching catalogs list from MAS"
1472
+ mas_catalog = []
1473
+ mas_catalog = _fetch_catalog_info
1474
+ if mas_catalog.empty?
1475
+ loginfo2 "Unable to fetch catalog list from MAS"
1476
+ return false
1477
+ end
1478
+ loginfo2 "Successfully fetched airtime catalogs listing from MAS"
1479
+
1480
+ web_diag_catalog.each do |catalog|
1481
+ if mas_catalog.include?(catalog)
1482
+ loginfo2 "Airtime catalog ID [#{catalog}] matched in MAS cataogs list and Web diags catalogs directory"
1483
+ return true
1484
+ end
1485
+ end
1486
+ return false
1487
+ end
1488
+
1489
+ # Use it to read value of Instant replay jump value in seconds from MAS
1490
+ # * *Returns* :
1491
+ # - value of "Instant replay jump value in seconds"
1492
+ def mas_instant_replay_jump
1493
+ result = fetch_dvr_parameters
1494
+
1495
+ return '' if result.empty?
1496
+ loginfo2 "Instant Replay Jump(seconds): [#{result[2]}]"
1497
+ return result[2]
1498
+ end
1499
+
1500
+ # Use it to read value of Time Shift Buffer length from MAS
1501
+ # * *Returns* :
1502
+ # - value of "Time Shift Buffer length"
1503
+ def mas_tsb_length
1504
+ result = fetch_dvr_parameters
1505
+
1506
+ return '' if result.empty?
1507
+ loginfo2 "Time Shift Buffer length: [#{result[0]}]"
1508
+ return result[0]
1509
+ end
1510
+
1511
+ # Use it to read value of Paused session timeout from MAS
1512
+ # * *Returns* :
1513
+ # - value of "Paused session timeout" in seconds
1514
+ def mas_paused_session_timeout
1515
+ result = fetch_timeout_parameters
1516
+
1517
+ return '' if result.empty?
1518
+ loginfo2 "Paused Session Timeout (seconds) : [#{result[13]}]"
1519
+ return result[13]
1520
+ end
1521
+
1522
+ # Use it to read value of Menu timeout in seconds from MAS
1523
+ # * *Returns* :
1524
+ # - value of "Menu timeout" in seconds
1525
+ def mas_menu_timeout
1526
+ result = fetch_timeout_parameters
1527
+
1528
+ return '' if result.empty?
1529
+ loginfo2 "Menu Timeout (seconds) : [#{result[2]}]"
1530
+ return result[2]
1531
+ end
1532
+
1533
+ # Use it to read value of # of Hours of Inactivity to Enter Low Power State(hours) from MAS
1534
+ # * *Returns* :
1535
+ # - value of "# of Hours of Inactivity to Enter Low Power State(hours)"
1536
+ def mas_hours_of_inactivity_to_enter_low_power
1537
+ result = fetch_power_save_settings
1538
+
1539
+ return '' if result.empty?
1540
+ loginfo2 "No. of Hours of Inactivity to Enter Low Power State(hours) : [#{result[0]}]"
1541
+ return result[0]
1542
+ end
1543
+
1544
+ # Use it to clear buffer for currently tuned channel by navigating 2 channels up and then move back to current channel
1545
+ # * *Returns* :
1546
+ # - true if successfully else false
1547
+ def clear_buffer_for_current_channel
1548
+ # Move up two channels
1549
+ channel_up_count = 0
1550
+ video_channels_count = 0
1551
+ max_count = 50 # to avoid infinite loop
1552
+
1553
+ # tune channel up until 2 channels with video found
1554
+ max_count.times do
1555
+ press_channel_up_sleep
1556
+ sleep_for_last_tuned_channel
1557
+
1558
+ video_channels_count+=1 if fullscreen_video_playing? # increment video channel count
1559
+ channel_up_count+=1 # increment channel up count
1560
+
1561
+ break if video_channels_count >= 2
1562
+ end
1563
+
1564
+ if video_channels_count < 2
1565
+ loginfo2 "Failed to get 2 video channels",true,true
1566
+ return false
1567
+ end
1568
+
1569
+ # tune back to home channel
1570
+ channel_up_count.times do
1571
+ sleep_for_last_tuned_channel
1572
+ press_channel_down_sleep
1573
+ end
1574
+
1575
+ loginfo2 "Successfully cleared buffer for current channel"
1576
+ return true
1577
+ end
1578
+
1579
+ # Use convert time in seconds to hour:min format
1580
+ # * *Args* :
1581
+ # - +seconds+ -> number of seconds
1582
+ # * *Returns* :
1583
+ # - time text string in "hour:min" format
1584
+ def seconds_to_hour_min_text seconds
1585
+ # convert seconds to integer
1586
+ seconds = seconds.to_s.to_i
1587
+
1588
+ hours = (seconds / (60 * 60)).to_s.to_i
1589
+ mins = ((seconds - (hours * 60 * 60)) / 60).to_s.to_i
1590
+ mins = "0#{mins}" if mins < 10 # add prefix '0' for single digit mins
1591
+ return "#{hours}:#{mins}"
1592
+ end
1593
+
1594
+ # Use it to switch-off the STB power.
1595
+ def stb_power_off
1596
+ ac_power_sleep = fetch_option(:stb_ac_power_on_off_wait_in_seconds)
1597
+ if ac_power_sleep.nil?
1598
+ loginfo2 "Config parameter [:stb_ac_power_on_off_wait_in_seconds] is not set"
1599
+ return false
1600
+ end
1601
+ ac_power_sleep = ac_power_sleep.to_s.to_i
1602
+
1603
+ begin
1604
+ ac_power(false)
1605
+ loginfo2 "Sleeping for AC power OFF ...(#{ac_power_sleep} seconds)"
1606
+ sleep ac_power_sleep.sec
1607
+ loginfo2 "Successfully AC powered OFF STB"
1608
+
1609
+ return true
1610
+ rescue StandardError => e
1611
+ logdebug "Exception : #{e.message}"
1612
+ logdebug e.backtrace.join("\n")
1613
+
1614
+ loginfo2 "Failed to powered off STB using AC power"
1615
+ return false
1616
+ end
1617
+ end
1618
+
1619
+ # Use it to verify whether STB bootup screen appears or not
1620
+ def stb_reboot_loading_message_appears?(retries=2)
1621
+ icon1 = :fullscreen_reboot_message_icon1 # cisco or powertv or samsung
1622
+ icon2 = :fullscreen_reboot_message_icon2 # mystro
1623
+
1624
+ if stb_capable_of?('ODN')
1625
+ return true if (screen_matches_for_icon_roi(icon1,icon1,retries) or screen_matches_for_icon_roi(icon2,icon2,retries))
1626
+ else
1627
+ return true if (screen_matches_for_icon_roi(icon1,icon1,retries) or golden_copy_matches_for_roi(icon2,retries))
1628
+ end
1629
+
1630
+ loginfo2 "Reboot loading message does not appear on the screen",true
1631
+ return false
1632
+ end
1633
+
1634
+ # Use it to reboot STB using AC power on/off
1635
+ def stb_reboot_using_ac_power
1636
+ # ac_power_sleep = fetch_option(:stb_ac_power_on_off_wait_in_seconds)
1637
+ # if ac_power_sleep.nil?
1638
+ # loginfo2 "Config parameter [:stb_ac_power_on_off_wait_in_seconds] is not set"
1639
+ # return false
1640
+ # end
1641
+ # ac_power_sleep = ac_power_sleep.to_s.to_i
1642
+ ac_power_sleep = 3
1643
+ begin
1644
+ ac_power(false)
1645
+ loginfo2 "Sleeping for AC power OFF ...(#{ac_power_sleep} seconds)"
1646
+ sleep ac_power_sleep.sec
1647
+ loginfo2 "Successfully AC powered OFF STB"
1648
+
1649
+ ac_power(true)
1650
+ #loginfo2 "Sleeping for AC power ON ...(#{ac_power_sleep} seconds)"
1651
+ #sleep ac_power_sleep.sec
1652
+ loginfo2 "Successfully AC powered ON STB"
1653
+
1654
+ return true
1655
+ rescue StandardError => e
1656
+ logdebug "Exception : #{e.message}"
1657
+ logdebug e.backtrace.join("\n")
1658
+
1659
+ loginfo2 "Failed to reboot STB using AC power"
1660
+ return false
1661
+ end
1662
+ end
1663
+
1664
+ # Use it to power on stb within given duration
1665
+ # * *Args* :
1666
+ # - +duration+ -> duration in minutes
1667
+ # * *Returns* :
1668
+ # - true if successfully else false
1669
+ def _power_on_stb_within_duration(duration=1)
1670
+ # Power on STB (within [x] min)
1671
+ failed_to_power_on_retry_count = (duration * 60) / 10
1672
+ failed_to_power_on_retry_count.times do
1673
+ if power_on_stb?
1674
+ return true
1675
+ end
1676
+ sleep 10.sec # wait for few seconds
1677
+ end
1678
+ return false
1679
+ end
1680
+
1681
+ # Use it to power on stb and verify loading message/icon
1682
+ # * *Returns* :
1683
+ # - true if successfully else false
1684
+ def _power_on_stb_and_verify_reboot_loading_screen
1685
+ 2.times do
1686
+ _power_on_stb_within_duration
1687
+ return true if stb_reboot_loading_message_appears?(1) # only 1 retry
1688
+ end
1689
+ return false
1690
+ end
1691
+
1692
+ # Private method
1693
+ # Use it to reset application screen back to stretched mode
1694
+ def _stb_p550hd_reset_application_aspect_ratio(retries=3)
1695
+ retries.times do
1696
+ press_exit_sleep
1697
+ press_settings_sleep
1698
+ sleep 10.sec # wait for STB to load settings screen
1699
+ # Navigate to aspect ratio
1700
+ 4.times do
1701
+ press_right_arrow_sleep
1702
+ end
1703
+ # Select focused setting (aspect ratio)
1704
+ press_select_sleep
1705
+ # Select default setting
1706
+ press_select_sleep
1707
+ # Exit to fullscreen
1708
+ press_exit_sleep
1709
+ # Verify using info banner
1710
+ return true if info_banner_launch_and_verify(true,true)
1711
+ end
1712
+
1713
+ loginfo2 "Failed to reset aspect ratio"
1714
+ return false
1715
+ end
1716
+
1717
+ # Use it to wait till STB finished rebooting
1718
+ # * *Args* :
1719
+ # - +apc_reboot+ -> reboot STB again using AC power if failed to reboot
1720
+ # * *Returns* :
1721
+ # - true if successfully finished rebooting else false
1722
+ def stb_wait_till_finish_rebooting(apc_reboot = false)
1723
+ waiting_time = fetch_option(:stb_reboot_wait_time_in_minutes).to_s.to_i
1724
+
1725
+ failed_to_power_on_retry_count = 6
1726
+
1727
+ waiting_time.times do
1728
+ # Power on STB (within 1 min)
1729
+ unless _power_on_stb_within_duration(1)
1730
+ if apc_reboot
1731
+ loginfo2 "Failed to power ON STB, rebooting STB using AC power ..."
1732
+ return false unless stb_reboot_using_ac_power
1733
+ return stb_wait_till_finish_rebooting
1734
+ else
1735
+ loginfo2 "Failed to power on STB"
1736
+ return false
1737
+ end
1738
+ end
1739
+
1740
+ # exit to fullscreen
1741
+ press_exit_sleep
1742
+
1743
+ if _power_on_stb_and_verify_reboot_loading_screen
1744
+ loginfo2 "STB booting up, Please wait ...", true
1745
+ sleep 1.min
1746
+ else
1747
+ unless power_on_stb? # it may possible that STB will switch to standby mode after reboot
1748
+ loginfo2 "Failed to power on STB"
1749
+ return false
1750
+ end
1751
+ loginfo2 "STB is ON",true
1752
+ # Reset Aspect ratio for P550HD
1753
+ (return false unless _stb_p550hd_reset_application_aspect_ratio) if fetch_stb_model.upcase.eql?('P550HD')
1754
+ (return false unless stb_undo_black_n_white) if check_models?('SA8010HD')
1755
+ return true # successfully finished rebooting
1756
+ end
1757
+ end
1758
+
1759
+ # if STB still loading then reboot the STB again
1760
+ if apc_reboot
1761
+ loginfo2 "STB still loading, rebooting again",true
1762
+ return false unless stb_reboot_using_ac_power
1763
+ return stb_wait_till_finish_rebooting
1764
+ else
1765
+ loginfo2 "STB has not finished loading within [#{waiting_time}] minutes, Please check",true
1766
+ return false
1767
+ end
1768
+ end
1769
+
1770
+ # Use it to switch-on the STB power.
1771
+ # * *Args* :
1772
+ # - +return_when_up+ -> if true, this method waits till STB properly boots up.
1773
+ # * *Returns* :
1774
+ # - true, if STB seems operational, false otherwise.
1775
+ def stb_power_on(return_when_up = false)
1776
+ ac_power_sleep = fetch_option(:stb_ac_power_on_off_wait_in_seconds)
1777
+ if ac_power_sleep.nil?
1778
+ loginfo2 "Config parameter [:stb_ac_power_on_off_wait_in_seconds] is not set"
1779
+ return false
1780
+ end
1781
+ ac_power_sleep = ac_power_sleep.to_s.to_i
1782
+
1783
+ begin
1784
+ ac_power(true)
1785
+ loginfo2 "Sleeping for AC power ON ...(#{ac_power_sleep} seconds)"
1786
+ sleep ac_power_sleep.sec
1787
+ loginfo2 "Successfully AC powered ON STB"
1788
+ rescue StandardError => e
1789
+ logdebug "Exception : #{e.message}"
1790
+ logdebug e.backtrace.join("\n")
1791
+
1792
+ loginfo2 "Failed to powered on STB using AC power"
1793
+ return false
1794
+ end
1795
+
1796
+ return true unless return_when_up
1797
+
1798
+ return stb_wait_till_finish_rebooting(false)
1799
+ end
1800
+
1801
+ # Use it to verify the STB operational mode.
1802
+ # * *Args* :
1803
+ # - +mode+ -> adsg or davic
1804
+ # * *Returns* :
1805
+ # - true, if STB operational in the mode(adsg/davic) passed, false otherwise.
1806
+ def verify_stb_mode(mode='adsg')
1807
+ ip = fetch_ip
1808
+ return false if ip.nil?
1809
+ return false unless has_valid_ip?(ip)
1810
+ return (get_snmp("#{ip}", '1.3.6.1.4.1.4491.2.3.1.1.4.5.3.0', 'public') == '2') if mode.casecmp('adsg') == 0
1811
+ return (get_snmp("#{ip}", '1.3.6.1.4.1.4491.2.3.1.1.4.5.3.0', 'public') != '2') if mode.casecmp('davic') == 0
1812
+ end
1813
+
1814
+ # Use it to find details of PPV program on particular channel, time, name, duration etc
1815
+ # * *Args* :
1816
+ # - +params+ -> data hash e.g params = {{:CHANNEL_NUMBER => 85, :CHANNEL_NUMBERS => [80, 85, 45], :START_DATE_TIME => [0, '1:00'] OR ruby_time, :END_DATE_TIME => [0, '2:00'] OR ruby_time}}
1817
+ # - all return array parameters can be passed as argument
1818
+ # - Valid PROGRAM_WINDOW_NAME = 'LIFETIME_WINDOW', 'PREVIEW_WINDOW', 'BUY_WINDOW', 'CANCEL_WINDOW', 'ADVERTISING_WINDOW', 'MARKETING_WINDOW', 'FREE_CANCEL_WINDOW'
1819
+ # * *Returns* :
1820
+ # - Returns an Array of programs as a MultiHashMap each hash will contain the following keys CHANNEL_NUMBER, CHANNEL_NAME, PROGRAM_SHORT_TITLE, PROGRAM_COST, PROGRAM_TYPE, PROGRAM_EVENT_ID, ADVERTISING_WINDOW, BUY_WINDOW, CANCEL_WINDOW, LIFETIME_WINDOW, MARKETING_WINDOW, PREVIEW_WINDOW
1821
+ # - Each window type will contain a Hash Map with start time and duration as keys
1822
+ def find_ppv_programs(params={}, curr_date = mas_current_date)
1823
+
1824
+ where_clause = ''
1825
+ where_clause << " AND MYSTRO_CHANNEL.DISPLAY_CHANNEL = #{params[:CHANNEL_NUMBER]}" if (!params[:CHANNEL_NUMBER].nil? && params[:CHANNEL_NUMBER].to_s.to_i >= 0)
1826
+ where_clause << " AND MYSTRO_CHANNEL.DISPLAY_CHANNEL IN (#{params[:CHANNEL_NUMBERS].join(',')})" if (!params[:CHANNEL_NUMBERS].nil? && params[:CHANNEL_NUMBERS].class == Array && !(params[:CHANNEL_NUMBERS].empty?))
1827
+ where_clause << " AND UPPER(MYSTRO_SERVICE.DISPLAY_NAME) LIKE '%#{params[:CHANNEL_NAME].to_s.upcase}%'" if (!params[:CHANNEL_NAME].nil? && params[:CHANNEL_NAME].strip != '')
1828
+ where_clause << " AND UPPER(PPV_EVENT_INFO.EVENT_TITLE) LIKE '%#{params[:PROGRAM_SHORT_TITLE].to_s.upcase}%'" if (!params[:PROGRAM_SHORT_TITLE].nil? && params[:PROGRAM_SHORT_TITLE].strip != '')
1829
+ where_clause << " AND (( PPV_TIME_WINDOW.START_TIME + (PPV_TIME_WINDOW.DURATION/(24*60*60))) > #{_parse_date(params[:START_DATE_TIME], curr_date)})" if (!params[:START_DATE_TIME].nil?)
1830
+ where_clause << " AND WINDOW_TYPE.WINDOW_NAME = '#{params[:WINDOW_NAME].to_s.upcase}'" if (!params[:WINDOW_NAME].nil?)
1831
+ where_clause << " AND PPV_EVENT_INFO.PPV_TYPE=2" # 2 means RPPV events
1832
+
1833
+ loginfo2 "WhereClause : #{where_clause}"
1834
+
1835
+ data_arr = mas_db_guide_data_for_ppv_programs where_clause
1836
+
1837
+ channels = []
1838
+ channels.push(params[:CHANNEL_NUMBER].to_s.to_i) unless params[:CHANNEL_NUMBER].nil?
1839
+ channels = channels + params[:CHANNEL_NUMBERS].to_i_arr unless params[:CHANNEL_NUMBERS].nil?
1840
+
1841
+ airing_and_future_programs = guide_screen_airing_and_future_programs(channels)
1842
+ logdebug "Total PPV programs [Guide] : #{airing_and_future_programs.length}"
1843
+ result_arr = []
1844
+
1845
+ return result_arr if data_arr.nil?
1846
+
1847
+ data_arr.each do |data_hash|
1848
+ time_arr = data_hash['ADVERTISING_WINDOW'].to_s.split('/')
1849
+ advertising_window_start_time = time_arr.empty? ? nil : Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
1850
+
1851
+ time_arr = data_hash['BUY_WINDOW'].to_s.split('/')
1852
+ buy_window_start_time = time_arr.empty? ? nil : Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
1853
+
1854
+ time_arr = data_hash['CANCEL_WINDOW'].to_s.split('/')
1855
+ cancel_window_start_time = time_arr.empty? ? nil : Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
1856
+
1857
+ time_arr = data_hash['FREE_CANCEL_WINDOW'].to_s.split('/')
1858
+ free_cancel_window_start_time = time_arr.empty? ? nil : Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
1859
+
1860
+ time_arr = data_hash['LIFETIME_WINDOW'].to_s.split('/')
1861
+ lifetime_window_start_time = time_arr.empty? ? nil : Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
1862
+
1863
+ time_arr = data_hash['MARKETING_WINDOW'].to_s.split('/')
1864
+ marketing_window_start_time = time_arr.empty? ? nil : Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
1865
+
1866
+ time_arr = data_hash['PREVIEW_WINDOW'].to_s.split('/')
1867
+ preview_window_start_time = time_arr.empty? ? nil : Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
1868
+
1869
+ guide_prog = airing_and_future_programs.select{|prog| prog[2].to_i.eql?(lifetime_window_start_time.to_i) and prog[0].to_i.eql?(data_hash['CHANNEL_NUMBER'].to_s.to_i)}[0]
1870
+
1871
+ # ignore asset/event if no matching guide data found
1872
+ next if guide_prog.nil?
1873
+
1874
+ prog_long_title = guide_prog[5]
1875
+ prog_short_title = guide_prog[4]
1876
+
1877
+ ppv_program = {
1878
+ :event_id => data_hash['PPV_EVENT_INFO_ID'],
1879
+ :channel_number => data_hash['CHANNEL_NUMBER'].to_s.to_i,
1880
+ :channel_name => data_hash['CHANNEL_NAME'].to_s,
1881
+ :short_title => prog_short_title,
1882
+ :long_title => prog_long_title,
1883
+ :prog_cost => data_hash['PPV_EVENT_COST'].to_s.to_f,
1884
+ :prog_type => data_hash['PPV_TYPE'].to_s,
1885
+ }
1886
+
1887
+ ppv_program[:ADVERTISING_WINDOW] = {:start_time => advertising_window_start_time, :duration => data_hash['ADVERTISING_WINDOW_DURATION'].to_s.to_i} if advertising_window_start_time
1888
+ ppv_program[:BUY_WINDOW] = {:start_time => buy_window_start_time, :duration => data_hash['BUY_WINDOW_DURATION'].to_s.to_i} if buy_window_start_time
1889
+ ppv_program[:CANCEL_WINDOW] = {:start_time => cancel_window_start_time, :duration => data_hash['CANCEL_WINDOW_DURATION'].to_s.to_i} if cancel_window_start_time
1890
+ ppv_program[:FREE_CANCEL_WINDOW] = {:start_time => free_cancel_window_start_time, :duration => data_hash['FREE_CANCEL_WINDOW_DURATION'].to_s.to_i} if free_cancel_window_start_time
1891
+ ppv_program[:LIFETIME_WINDOW] = {:start_time => lifetime_window_start_time, :duration => data_hash['LIFETIME_WINDOW_DURATION'].to_s.to_i} if lifetime_window_start_time
1892
+ ppv_program[:MARKETING_WINDOW] = {:start_time => marketing_window_start_time, :duration => data_hash['MARKETING_WINDOW_DURATION'].to_s.to_i} if marketing_window_start_time
1893
+ ppv_program[:PREVIEW_WINDOW] = {:start_time => preview_window_start_time, :duration => data_hash['PREVIEW_WINDOW_DURATION'].to_s.to_i} if preview_window_start_time
1894
+
1895
+ result_arr.push(ppv_program)
1896
+ end
1897
+
1898
+ logdebug "Total PPV programs : #{result_arr.length}"
1899
+ return result_arr
1900
+ end
1901
+
1902
+ # Use it to find lookback program on given channel using MAS query
1903
+ # * *Args* :
1904
+ # - +channel_number+ -> integer channel number
1905
+ # - +without_multiple_listing+ -> true to filtered out programs with multiple listing
1906
+ # - +expire_after+ -> program expiry time is after [x] minutes
1907
+ # * *Returns* :
1908
+ # - Array of lookback programs
1909
+ # - each program is hash of program details
1910
+ #( day, day_sequence, program_name, program_desc, program_sequence,program_duration_mins,program_rating,program_start_time,program_end_time,
1911
+ # program_content_type,program_genre,license_window_start,license_window_end)
1912
+ def find_lookback_programs channel_number, without_multiple_listing=false, expire_after=10
1913
+ channel_name = guide_screen_channel_info(channel_number)[:service_name].strip
1914
+
1915
+ menu_name = _mas_conductor_fetch_enhanced_menu_for_service(channel_name)
1916
+
1917
+ lookback_programs = []
1918
+
1919
+ return lookback_programs if menu_name.nil?
1920
+
1921
+ current_time = mas_current_date
1922
+
1923
+ # RegEx for time string
1924
+ re1='((?:(?:[0-1][0-9])|(?:[2][0-3])|(?:[0-9])):(?:[0-5][0-9])(?::[0-5][0-9])?(?:\\s?(?:am|AM|pm|PM))?)' # HourMinuteSec 1
1925
+ re=(re1)
1926
+ m=Regexp.new(re,Regexp::IGNORECASE);
1927
+
1928
+ # Advisory flags
1929
+ flags = _valid_advisory_flags
1930
+ # genre codes
1931
+ genre_codes = valid_genre_codes
1932
+
1933
+ # Total asset counter
1934
+ total_programs_count = 0
1935
+ folder_sequence = 0
1936
+ data_arr1 = mas_db_look_back_folders(menu_name)
1937
+
1938
+ if data_arr1.empty?
1939
+ loginfo2 "Lookback data not found for channel : #{channel_number}",false
1940
+ return lookback_programs
1941
+ end
1942
+
1943
+ # check if day folder available or not
1944
+ if(data_arr1[0]['NODE_TYPE'].to_s.to_i == 3)
1945
+ data_arr1 = [data_arr1[0]['PARENT_NODE_ID'].to_s]
1946
+ end
1947
+
1948
+ data_arr1.each {|data_hash1|
1949
+ # default folder sequence update to false
1950
+ update_folder_sequence = false
1951
+
1952
+ folder_id = ""
1953
+ if data_hash1.is_a?String
1954
+ folder_id = data_hash1
1955
+ folder_sequence = -1 # no sub folder
1956
+ else
1957
+ folder_id = data_hash1['MENU_NODE_ID']
1958
+ end
1959
+
1960
+ data_arr2 = mas_db_look_back_programs_in_folder(folder_id)
1961
+
1962
+ # update total programs count
1963
+ total_programs_count += (data_arr2.length)
1964
+
1965
+ lookback_prog_sequence = 0
1966
+ prev_lookback_progs_end_time = []
1967
+ data_arr2.each {|data_hash2|
1968
+ time_arr = data_hash2['PROGRAM_START'].to_s.split('/')
1969
+ program_start = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
1970
+ time_arr = data_hash2['PROGRAM_END'].to_s.split('/')
1971
+ program_end = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
1972
+ time_arr = data_hash2['LICENSE_WINDOW_START'].to_s.split('/')
1973
+ license_window_start = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
1974
+ time_arr = data_hash2['LICENSE_WINDOW_END'].to_s.split('/')
1975
+ license_window_end = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
1976
+ closed_captioned = (data_hash2['MYSTRO_EVENT_CODE'].to_s.empty?)? (false):(data_hash2['MYSTRO_EVENT_CODE'].to_s.to_i.to_s(2)[-4,1].eql?("1")) # 4th index from right is closed caption
1977
+ # add to program list
1978
+ prog_hash = {
1979
+ :day => data_hash1['NODE_NAME'].to_s,
1980
+ :day_sequence => folder_sequence,
1981
+ :channel_number => channel_number.to_s.to_i,
1982
+ :program_name => data_hash2['NODE_NAME'].to_s,
1983
+ :program_desc => data_hash2['NODE_DESC'].to_s,
1984
+ :program_sequence => lookback_prog_sequence,
1985
+ :program_duration_mins => data_hash2['EVENT_DURATION'].to_s.to_i,
1986
+ :program_rating => data_hash2['RATING'].to_s,
1987
+ :program_start_time => program_start,
1988
+ :program_end_time => program_end,
1989
+ :program_content_type => _advisory_flags_from_advisory_code(data_hash2['ADVISORY_CODE'], flags),
1990
+ :program_genre => genre_names_from(data_hash2['GENRE_CODE'].to_s,genre_codes),
1991
+ :license_window_start => license_window_start,
1992
+ :license_window_end => license_window_end,
1993
+ :closed_captioned => closed_captioned,
1994
+ }
1995
+
1996
+ # Push prog details to array if required
1997
+ expiry_time_left = (prog_hash[:program_end_time] - current_time).to_i
1998
+
1999
+ if expiry_time_left > 0
2000
+ # Update first prog
2001
+ prev_lookback_progs_end_time.push(prog_hash[:program_end_time])
2002
+
2003
+ # increment sequence
2004
+ lookback_prog_sequence += 1
2005
+ update_folder_sequence = true
2006
+ end
2007
+
2008
+ if (expiry_time_left > (expire_after * 60) and (prog_hash[:program_start_time] + (prog_hash[:program_duration_mins] * 60)) < current_time)
2009
+ prog_hash[:prev_lookback_progs_end_time] = prev_lookback_progs_end_time.dup
2010
+
2011
+ lookback_programs.push(prog_hash) if !without_multiple_listing or (without_multiple_listing and (m.match(data_hash2['NODE_NAME'].to_s)).nil?)
2012
+ elsif expiry_time_left > 0
2013
+ logdebug "Program will expire in [#{expiry_time_left}] seconds : #{prog_hash}"
2014
+ end
2015
+ }
2016
+
2017
+ # Update folder sequence counter
2018
+ folder_sequence+=1 if update_folder_sequence
2019
+ }
2020
+ logdebug "Total lookback programs - #{lookback_programs.length} : Lookback program(s) --> [#{lookback_programs}]"
2021
+ return lookback_programs
2022
+ end
2023
+
2024
+ # Use it to find lookback folders on given channel using MAS query
2025
+ # * *Args* :
2026
+ # - +channel_number+ -> integer channel number
2027
+ # * *Returns* :
2028
+ # - Array of lookback day strings (e.g. Today, Sunday, 11/22, etc.)
2029
+ def find_lookback_folders channel_number
2030
+ programs = find_lookback_programs(channel_number)
2031
+ return [] if programs.empty?
2032
+
2033
+ if programs[0][:day_sequence]==-1
2034
+ loginfo2 "Programs are not in sub folders"
2035
+ return []
2036
+ end
2037
+
2038
+ folders = programs.collect{|prog| prog[:day]}.uniq
2039
+ return folders
2040
+ end
2041
+
2042
+ # Use it to find quick clips on given channel using MAS query
2043
+ # * *Args* :
2044
+ # - +channel_number+ -> integer channel number
2045
+ # * *Returns* :
2046
+ # - Array of quick clips
2047
+ # - each clip is hash of details ( :name, :sequence, :desc, :rating, :duration, :path, :menu_node_id)
2048
+ def find_quickclips channel_number
2049
+ channel_name = guide_screen_channel_info(channel_number)[:service_name].strip
2050
+
2051
+ menu_name = _mas_conductor_fetch_enhanced_menu_for_service(channel_name)
2052
+ return [] if menu_name.nil?
2053
+ quickclip_list = []
2054
+ enhanced_menu_data = (mas_db_quickclips menu_name) # Fetch enhanced menu data
2055
+ if enhanced_menu_data.empty? # Check for empty data
2056
+ loginfo2 "Failed to fetch enhanced menu data for channel :[#{channel_name}]"
2057
+ return []
2058
+ end
2059
+ quick_clip_nodes = enhanced_menu_data.select{|data| data['NODE_TYPE'].to_s.to_i==3} # Select playble assets
2060
+ quick_clip_nodes.each{|clip|
2061
+ # Get all folders with sequence for clip
2062
+ node = clip
2063
+ folders = []
2064
+ while !(node['PARENT_NODE_ID'].to_s.empty?) # Find folders
2065
+ parent = enhanced_menu_data.select{|data| data['MENU_NODE_ID']==node['PARENT_NODE_ID']}[0]
2066
+ folders.push([parent['NODE_SEQUENCE'].to_s.to_i, parent['NODE_NAME']])
2067
+ node = parent
2068
+ end
2069
+
2070
+ data_hash = {
2071
+ :menu_node_id => clip['MENU_NODE_ID'].to_s.to_i,
2072
+ :path => folders.reverse,
2073
+ :name => clip['NODE_NAME'],
2074
+ :sequence => clip['NODE_SEQUENCE'].to_s.to_i,
2075
+ :desc => clip['NODE_DESC'],
2076
+ }
2077
+
2078
+ # Assumption !!! : all folders except lookback are quick clips and folders only (node type 3)
2079
+ quickclip_list.push(data_hash) unless data_hash[:path].empty? or data_hash[:path][0][1].delete(' ').casecmp('lookback')==0 # Push data hash of only quick clips
2080
+ }
2081
+
2082
+ if quickclip_list.empty? # Check for empty data
2083
+ loginfo2 "Failed to fetch quick clip data for channel :[#{channel_name}]"
2084
+ return []
2085
+ end
2086
+
2087
+ # Fetch more details (e.g. rating and duration)
2088
+ id_array = quickclip_list.collect{|clip| clip[:menu_node_id]}
2089
+ more_info = mas_db_quickclip_more_info_for_ids id_array # Query of more info
2090
+
2091
+ if more_info.empty? # Check for empty data
2092
+ loginfo2 "Failed to fetch more info for quick clips on channel :[#{channel_name}]"
2093
+ return []
2094
+ end
2095
+
2096
+ quickclip_list.each{|clip| # Update existing data with more info
2097
+ info = more_info.select{|x| x['MENU_NODE_ID'].to_s.to_i==clip[:menu_node_id]}[0]
2098
+ clip[:rating] = info['RATING_FLAG_SHORT_DESC']
2099
+ clip[:duration] = info['DURATION_SECONDS']
2100
+ }
2101
+
2102
+ return quickclip_list
2103
+ end
2104
+
2105
+ # Use it to find enhanced menu video assets on given channel using MAS query
2106
+ # * *Args* :
2107
+ # - +channel_number+ -> integer channel number
2108
+ # * *Returns* :
2109
+ # - Array of video assets
2110
+ # - each asset is hash of details ( :name, :sequence, :desc, :rating, :duration, :path, :menu_node_id)
2111
+ def find_enhanced_menu_video_asset channel_number
2112
+ channel_name = guide_screen_channel_info(channel_number)[:service_name].strip
2113
+
2114
+ menu_name = _mas_conductor_fetch_enhanced_menu_for_service(channel_name)
2115
+ return [] if menu_name.nil?
2116
+
2117
+ enhanced_menu_data = (mas_db_quickclips menu_name)
2118
+ video_asset_nodes = enhanced_menu_data.select{|data| data['NODE_TYPE'].to_s.to_i==3 and (data['PARENT_NODE_ID'].to_s.empty?)} # Select video assets
2119
+
2120
+ quickclip_list = []
2121
+ video_asset_nodes.each{|clip|
2122
+ # Get all folders with sequence for clip
2123
+ node = clip
2124
+ folders = []
2125
+
2126
+ data_hash = {
2127
+ :menu_node_id => clip['MENU_NODE_ID'].to_s.to_i,
2128
+ :path => folders.reverse,
2129
+ :name => clip['NODE_NAME'],
2130
+ :sequence => clip['NODE_SEQUENCE'].to_s.to_i,
2131
+ :desc => clip['NODE_DESC'],
2132
+ }
2133
+
2134
+ quickclip_list.push(data_hash)# Push data hash of video assets
2135
+ }
2136
+
2137
+ if quickclip_list.empty? # Check for empty data
2138
+ loginfo2 "Failed to fetch quick clip data for channel :[#{channel_name}]"
2139
+ return []
2140
+ end
2141
+
2142
+ # Fetch more details (e.g. rating and duration)
2143
+ id_array = quickclip_list.collect{|clip| clip[:menu_node_id]}
2144
+ more_info = mas_db_quickclip_more_info_for_ids id_array # Query of more info
2145
+
2146
+ if more_info.empty? # Check for empty data
2147
+ loginfo2 "Failed to fetch more info for quick clips on channel :[#{channel_name}]"
2148
+ return []
2149
+ end
2150
+
2151
+ filtered_list = []
2152
+
2153
+ quickclip_list.each{|clip| # Update existing data with more info
2154
+ info = more_info.select{|x| x['MENU_NODE_ID'].to_s.to_i==clip[:menu_node_id]}[0]
2155
+ clip[:rating] = info['RATING_FLAG_SHORT_DESC']
2156
+ clip[:duration] = info['DURATION_SECONDS']
2157
+ clip[:is_valid] = info['IS_VALID']
2158
+ if clip[:is_valid].to_s == '0'
2159
+ logdebug "Asset [#{clip[:name]}] is invalid"
2160
+ else
2161
+ filtered_list.push(clip)
2162
+ end
2163
+ }
2164
+
2165
+ return filtered_list
2166
+ end
2167
+
2168
+ # Use it to get Launch application option in enhanced menu
2169
+ #**NOTE!! Returns first level options only
2170
+ # * *Args* :
2171
+ # - +channel_number+ -> enhanced menu channel number
2172
+ # * *Returns* :
2173
+ # - option names as array
2174
+ def find_enhanced_menu_applications channel_number
2175
+ channel_name = guide_screen_channel_info(channel_number)[:service_name].strip
2176
+
2177
+ menu_name = _mas_conductor_fetch_enhanced_menu_for_service(channel_name)
2178
+ return [] if menu_name.nil?
2179
+
2180
+ enhanced_menu_data = (mas_db_quickclips menu_name)
2181
+
2182
+ launch_application_data = enhanced_menu_data.select{|data| data['PARENT_NODE_ID'].to_s.empty? and data['NODE_TYPE'].to_s.to_i.eql?(4)}
2183
+
2184
+ if launch_application_data.empty?
2185
+ loginfo2 "Launch application option not found"
2186
+ return []
2187
+ end
2188
+ return launch_application_data.collect{|x| x['NODE_NAME'].to_s}
2189
+ end
2190
+
2191
+ # Use it to get Tune to service option in enhanced menu
2192
+ #**NOTE!! Returns first level options only
2193
+ # * *Args* :
2194
+ # - +channel_number+ -> enhanced menu channel number
2195
+ # * *Returns* :
2196
+ # - option names as array
2197
+ def find_enhanced_menu_services channel_number
2198
+ channel_name = guide_screen_channel_info(channel_number)[:service_name].strip
2199
+
2200
+ menu_name = _mas_conductor_fetch_enhanced_menu_for_service(channel_name)
2201
+ return [] if menu_name.nil?
2202
+
2203
+ enhanced_menu_data = (mas_db_quickclips menu_name)
2204
+
2205
+ tune_to_service_data = enhanced_menu_data.select{|data| data['PARENT_NODE_ID'].to_s.empty? and data['NODE_TYPE'].to_s.to_i.eql?(2)}
2206
+
2207
+ if tune_to_service_data.empty?
2208
+ loginfo2 "Tune to service option not found"
2209
+ return []
2210
+ end
2211
+ return tune_to_service_data.collect{|x| x['NODE_NAME'].to_s}
2212
+ end
2213
+
2214
+ # Use it to empty the HDD to given threshold level
2215
+ # * *Args* :
2216
+ # - +percentage_empty+ -> max threshold level
2217
+ # * *Returns* :
2218
+ # - true if successful else false
2219
+ def make_hdd_empty percentage_empty=70
2220
+ stb_ip = fetch_ip
2221
+ return false if stb_ip.nil?
2222
+
2223
+ hdd_status = _percentage_hdd_full(stb_ip)
2224
+
2225
+ return false if hdd_status.nil?
2226
+
2227
+ if hdd_status < percentage_empty
2228
+ loginfo2 "HDD is #{hdd_status} % full"
2229
+ return true
2230
+ end
2231
+
2232
+ # navigate to by date
2233
+ return false unless show_list_launch_and_verify(true,false)
2234
+ return false unless show_list_navigate_to_tab('by date')
2235
+
2236
+ while hdd_status >= percentage_empty
2237
+ return false unless show_list_screen_delete_focused_recorded_program
2238
+
2239
+ hdd_status = _percentage_hdd_full(stb_ip)
2240
+ return false if hdd_status.nil?
2241
+ end
2242
+
2243
+ # HDD full
2244
+ loginfo2 "HDD full #{hdd_status} %"
2245
+ return true
2246
+ end
2247
+
2248
+ # Private method
2249
+ # Use to record program on given channel and verify HDD full message
2250
+ # * *Args* :
2251
+ # - +channel+ -> channel to recording program on
2252
+ # * *Returns* :
2253
+ # - true if it's showing HDD full message else false
2254
+ def _record_program_and_verify_hdd_full_message channel, retries=2
2255
+ message = ""
2256
+ if stb_capable_of?('MDN')
2257
+ message = "Your program cannot be recorded now To make room, delete recordings from Show List"
2258
+ elsif stb_capable_of?('ODN')
2259
+ message = "No Room to Record, Storage Full To make room, delete recordings from Show List"
2260
+ end
2261
+
2262
+ 2.times do
2263
+ press_exit_sleep
2264
+ press_exit_sleep
2265
+
2266
+ # tune to channel
2267
+ tune_immediately_to(channel)
2268
+
2269
+ # channel up/down to avoid failures where sometimes STB is not showing HDD full message
2270
+ press_channel_up_sleep
2271
+ press_channel_down_sleep
2272
+
2273
+ # exit to fullscreen
2274
+ press_exit_sleep
2275
+
2276
+ # start recording
2277
+ press_record_sleep
2278
+
2279
+ # sleep for 5 sec to avoid screen update lag
2280
+ sleep 5.sec
2281
+
2282
+ # verify HDD full message
2283
+ return true if ocr_text_similar_for_roi(:recording_attention_banner_storage_full_message,message,3, true, false, 0.50, true)
2284
+ end
2285
+
2286
+ loginfo2 "HDD full message not showing up on screen"
2287
+ return false
2288
+ end
2289
+
2290
+ # Private method
2291
+ # Use it to start instance recording on given channel and mark it as do not delete in show list
2292
+ # * *Args* :
2293
+ # - +channel_info+ -> channel info to record program
2294
+ # * *Returns* :
2295
+ # - airing program object if successful else false
2296
+ def _record_airing_program_with_do_not_delete_flag channel_info
2297
+ sleep_till_current_time_slot_having_min_duration_left(7)
2298
+
2299
+ airing_progs = []
2300
+ 2.times do
2301
+ airing_progs = channel_info[:rec_channels].collect do |chnl|
2302
+ guide_screen_airing_program(chnl)
2303
+ end
2304
+
2305
+ # filter out nil programs
2306
+ airing_progs = airing_progs.select{|x| !x.nil?}
2307
+
2308
+ # filter airing programs
2309
+ curr_time = mas_current_date
2310
+ airing_progs = airing_progs.select{|p| (p[3] - curr_time).to_i > 300}
2311
+
2312
+ break unless airing_progs.empty?
2313
+ loginfo2 "Airing program is having less then 5 min left, Sleep for 5 min"
2314
+ sleep 5.min
2315
+ end
2316
+
2317
+ return nil if airing_progs.empty?
2318
+ shortest_prog = airing_progs.min {|a,b| a[3] <=> b[3]}
2319
+
2320
+ retries = ((shortest_prog[3] - mas_current_date).to_i / 60) / 5 # each interval is having 5 min sleep
2321
+ logdebug "HDD full max retreis count : #{retries}"
2322
+
2323
+ rec_in_progress = nil
2324
+ retries.times do
2325
+ start_time = Time.now
2326
+ airing_progs.each do |prog|
2327
+ prog_duration = (prog[3] - mas_current_date).to_i
2328
+ logdebug "Program duration left : [#{prog_duration/60}] minutes"
2329
+ next if(prog_duration <= (5*60)) # break if program ends (within 5 min)
2330
+
2331
+ press_exit_sleep
2332
+ press_exit_sleep
2333
+
2334
+ # tune to channel
2335
+ tune_immediately_to(prog[0])
2336
+
2337
+ # start recording
2338
+ press_record_sleep
2339
+
2340
+ # wait for record to start
2341
+ loginfo2 "Sleeping for recording to start ..."
2342
+ sleep 30.sec
2343
+
2344
+ # exit to fullscreen
2345
+ press_exit_sleep
2346
+ 3.times do |j|
2347
+ (return nil if j.eql?(2)) unless info_banner_launch_and_verify(true,true)
2348
+ end
2349
+
2350
+ if info_banner_verify_recording_icon?(2)
2351
+ channel_info[:current_channel] = prog[0].to_s.to_i
2352
+ rec_in_progress = prog
2353
+ break # recording in progress
2354
+ end
2355
+ end # airing programs loop
2356
+ break if rec_in_progress
2357
+ # tune to buffer channels
2358
+ buffer_channels = channel_info[:buffer_channels]
2359
+ tune_immediately_to(buffer_channels[0])
2360
+ sleep 10.sec
2361
+ tune_immediately_to(buffer_channels[1])
2362
+
2363
+ sleep_time = (300 - (Time.now - start_time).to_i)
2364
+ loginfo2 "Sleeping for #{sleep_time} seconds ..."
2365
+ sleep sleep_time.sec
2366
+
2367
+ end # retries loop
2368
+
2369
+ return nil unless rec_in_progress
2370
+
2371
+ # mark new recording as do not delete
2372
+ return nil unless show_list_launch_and_verify(true,false)
2373
+ return nil unless show_list_navigate_to_top_of_list
2374
+ return nil unless show_list_navigate_to_recording_of_program(rec_in_progress)
2375
+ unless show_list_focused_recording_has_do_not_delete_icon?(2)
2376
+ press_select_sleep
2377
+ unless guide_screen_navigate_to_any_of_the_options ['Record Options']
2378
+ loginfo2 'Unable to verify if navigated to record options'
2379
+ return nil
2380
+ end
2381
+ press_select_sleep
2382
+ unless guide_screen_set_record_options({:change_save_time => 'Do not delete'})
2383
+ loginfo2 'Unable to verify if option is set'
2384
+ return nil
2385
+ end
2386
+
2387
+ press_a_sleep
2388
+ sleep_to_get_focus_back
2389
+ end
2390
+
2391
+ # exit to fullscreen
2392
+ press_exit_sleep
2393
+
2394
+ return rec_in_progress
2395
+ end
2396
+
2397
+ # Use it to fill the HDD using recordings
2398
+ # This method will take 1-2 days to fill HDD to full
2399
+ # * *Args* :
2400
+ # - +percentage_full+ -> % full hdd using recordings
2401
+ # - +min_recording_length+ -> minimum recording lenght in minutes
2402
+ # - +do_not_delete+ -> true to set all recordings as do not delete
2403
+ # * *Returns* :
2404
+ # - recorded programs if successful or HDD full else nil
2405
+ def make_hdd_full percentage_full=100, min_recording_length=10, do_not_delete=true
2406
+ # Note : used percentage_full = 101 for 100% hdd full, so that method will record programs till HDD full banner appears
2407
+ percentage_full = 101 if percentage_full > 99 # HDD can not be more than 100% full
2408
+
2409
+ stb_ip = fetch_ip
2410
+ return nil if stb_ip.nil?
2411
+
2412
+ hdd_status = _percentage_hdd_full(stb_ip)
2413
+
2414
+ return nil if hdd_status.nil?
2415
+
2416
+ if hdd_status >= percentage_full
2417
+ loginfo2 "HDD is #{percentage_full} % full"
2418
+ return []
2419
+ end
2420
+
2421
+ # recorded programs
2422
+ recorded_programs = []
2423
+
2424
+ # clear in-progress recordings and scheduled recordings to avoid conflict
2425
+ begin
2426
+ return nil unless show_list_launch_and_verify(true,false)
2427
+ return nil unless show_list_screen_clear_all_series_recordings
2428
+ return nil unless show_list_screen_clear_all_scheduled_recordings
2429
+ return nil unless show_list_cancel_inprogress_recordings
2430
+
2431
+ # mark all recorded programs to do not delete
2432
+ return nil unless show_list_launch_and_verify(true,false)
2433
+ return nil unless show_list_navigate_to_tab 'BY DATE'
2434
+ (return nil unless show_list_screen_set_do_not_delete_for_all_recordings) unless show_list_screen_empty_list?
2435
+
2436
+ # start recording on two HD/SD channels
2437
+ is_hd = stb_capable_of?('HD')
2438
+
2439
+ # live channels to record
2440
+ sd_channels = fetch_option(:miscellaneous_sd_channels).to_i_arr
2441
+ hd_channels = fetch_option(:miscellaneous_hd_channels).to_i_arr
2442
+
2443
+ live_channels = []
2444
+
2445
+ channels = is_hd ? (hd_channels + sd_channels) : sd_channels
2446
+ # filter channles with video
2447
+ channels.each do |chnl|
2448
+ sd_channels = sd_channels - [chnl] # remove current channel from sd channel list
2449
+ tune_immediately_to(chnl)
2450
+ sleep_for_normal_tune
2451
+ press_exit_sleep
2452
+ next unless info_banner_launch_and_verify_channel_number(chnl)
2453
+ if fullscreen_video_playing?
2454
+ live_channels.push(chnl)
2455
+ end
2456
+
2457
+ break if live_channels.length.eql?(2)
2458
+ end
2459
+
2460
+ # filter SD channles with video,
2461
+ # if STB failed to record HD program due to space then it can record SD program
2462
+ sd_channels.each do |chnl|
2463
+ tune_immediately_to(chnl)
2464
+ sleep_for_normal_tune
2465
+ press_exit_sleep
2466
+ if fullscreen_video_playing?
2467
+ live_channels.push(chnl)
2468
+ end
2469
+
2470
+ break if live_channels.length.eql?(6)
2471
+ end
2472
+
2473
+ if live_channels.length < 6
2474
+ loginfo2 "Unable to get six channels having video"
2475
+ return false
2476
+ end
2477
+
2478
+ channel1_info = {
2479
+ :rec_channels => [live_channels[0], live_channels[2], live_channels[3]],
2480
+ :current_channel => live_channels[0],
2481
+ :buffer_channels => [live_channels[0], live_channels[1]],
2482
+ }
2483
+
2484
+ channel2_info = {
2485
+ :rec_channels => [live_channels[1], live_channels[4], live_channels[5]],
2486
+ :current_channel => live_channels[1],
2487
+ :buffer_channels => [live_channels[0], live_channels[1]],
2488
+ }
2489
+
2490
+ prog1 = prog2 = nil
2491
+ start_time = nil
2492
+
2493
+ # max wait in minutes
2494
+ max_wait_minutes = (36 * 60) # 36 hours
2495
+
2496
+ begin
2497
+ # power on STB if required
2498
+ unless power_on_stb?
2499
+ loginfo2 "Unable to powre on STB"
2500
+ return nil
2501
+ end
2502
+
2503
+ current_time = mas_current_date
2504
+ start_time = current_time if start_time.nil? # set start time for first recording
2505
+
2506
+ # break if wait time exceeded max wait time
2507
+ if (current_time - start_time).to_i / 60 >= max_wait_minutes
2508
+ loginfo2 "Not able to fillup HDD withing [#{max_wait_minutes}] minutes"
2509
+ return nil
2510
+ end
2511
+
2512
+ # verify whether recording in progress or not
2513
+ tune_immediately_to(channel1_info[:current_channel])
2514
+ sleep_for_normal_tune
2515
+ press_exit_sleep
2516
+ return nil unless info_banner_launch_and_verify(true,false)
2517
+ rec_in_progress = info_banner_verify_recording_icon?(2)
2518
+
2519
+ if prog1.nil? or prog1[3] < current_time or !rec_in_progress
2520
+ prog1 = _record_airing_program_with_do_not_delete_flag(channel1_info)
2521
+
2522
+ recorded_programs.push(prog1) unless prog1.nil?
2523
+
2524
+ # update current time
2525
+ current_time = mas_current_date
2526
+ end
2527
+
2528
+ # verify whether recording in progress or not
2529
+ tune_immediately_to(channel2_info[:current_channel])
2530
+ sleep_for_normal_tune
2531
+ press_exit_sleep
2532
+ return nil unless info_banner_launch_and_verify(true,false)
2533
+ rec_in_progress = info_banner_verify_recording_icon?(2)
2534
+
2535
+ if prog2.nil? or prog2[3] < current_time or !rec_in_progress
2536
+ prog2 = _record_airing_program_with_do_not_delete_flag(channel2_info)
2537
+
2538
+ recorded_programs.push(prog2) unless prog2.nil?
2539
+
2540
+ # update current time
2541
+ current_time = mas_current_date
2542
+ end
2543
+
2544
+ if prog1.nil? and prog2.nil?
2545
+ return recorded_programs if _record_program_and_verify_hdd_full_message(channel2_info[:current_channel]) # verify HDD full message and its shwoing up then return true
2546
+ loginfo2 "Unlable to record programs on HD/SD channels"
2547
+ return nil
2548
+ else
2549
+ # sleep for 10 min and verify HDD percentage
2550
+ loginfo2 "Sleeping for 5 min ...",false
2551
+ sleep 5.min
2552
+ end
2553
+
2554
+ # update HDD status
2555
+ hdd_status = _percentage_hdd_full(stb_ip)
2556
+ return nil if hdd_status.nil?
2557
+ end while percentage_full > hdd_status # while loop
2558
+
2559
+ # HDD full
2560
+ loginfo2 "HDD full #{hdd_status} %"
2561
+
2562
+ # Sleep till program ends
2563
+ recorded_programs = recorded_programs.sort_by{|x| x[3]} # sort by program end time
2564
+
2565
+ sleep_till_time(recorded_programs.last[3],1) unless recorded_programs.empty?
2566
+
2567
+ return recorded_programs
2568
+ rescue TestException => e
2569
+ logdebug e.message
2570
+ return nil
2571
+ end
2572
+ end
2573
+
2574
+ # Use it to fill / empty HDD till given level
2575
+ # This method will take 1-2 days to fill HDD to full
2576
+ # * *Args* :
2577
+ # - +percentage_full+ -> % full hdd using recordings
2578
+ # * *Returns* :
2579
+ # - true if successful else false
2580
+ def make_hdd_full_percentage percentage_full=100
2581
+ percentage_full = 101 if percentage_full > 99 # HDD can not be more than 100% full
2582
+
2583
+ stb_ip = fetch_ip
2584
+ return false if stb_ip.nil?
2585
+
2586
+ hdd_status = _percentage_hdd_full(stb_ip)
2587
+
2588
+ return false if hdd_status.nil?
2589
+
2590
+ if hdd_status > percentage_full
2591
+ return make_hdd_empty(percentage_full)
2592
+ elsif hdd_status < percentage_full
2593
+ return !make_hdd_full(percentage_full,10,true).nil? # not nill means successful
2594
+ else
2595
+ loginfo2 "No need to empty or full HDD"
2596
+ return true
2597
+ end
2598
+ end
2599
+
2600
+ # Use it to check if the STB's ODN version is same or newer than the specified version.
2601
+ # ODN version is of the format 5.0.0_7 2011/10/06 14:29
2602
+ def odn_same_or_newer_than minimum_odn
2603
+ current_version = test_data[:current_odn_version].split()[0].split(/[._]/).map {|s| s.to_i}
2604
+ minimum_version = minimum_odn.split()[0].split(/[._]/).map {|s| s.to_i}
2605
+
2606
+ current_version.each_index do |x|
2607
+ return true if current_version[x] > minimum_version[x] # newer
2608
+ next if current_version[x] == minimum_version[x]
2609
+ return false # STB's ODN is older
2610
+ end
2611
+
2612
+ return true # same
2613
+ end
2614
+
2615
+ # Use it to check if the STB's ODN version is same or newer than the specified version.
2616
+ # MDN version is of the format 3.2.0_0 2011/10/06 14:29
2617
+ def mdn_same_or_newer_than minimum_mdn
2618
+ current_version = test_data[:current_mdn_version].split()[0].split(/[._]/).map {|s| s.to_i}
2619
+ minimum_version = minimum_mdn.split()[0].split(/[._]/).map {|s| s.to_i}
2620
+
2621
+ current_version.each_index do |x|
2622
+ return true if current_version[x] > minimum_version[x] # newer
2623
+ next if current_version[x] == minimum_version[x]
2624
+ return false # STB's ODN is older
2625
+ end
2626
+
2627
+ return true # same
2628
+ end
2629
+
2630
+ # Private method
2631
+ # Use it to find purchased od assets using MAS query
2632
+ # * *Args* :
2633
+ # - +params+ -> hash of parameters for filtering search. (:service_name,:channel_number)
2634
+ # * *Returns* :
2635
+ # - Array of purchased assets
2636
+ # - each program is hash of program details( od_asset_id,title,purchase_time,offering_window)
2637
+ def _purchased_od_assets(params={})
2638
+ where_clause = 'PURCHASE_STATE = 2 '
2639
+ where_clause << "AND PRODUCT like '#{params[:service_name]}'" if (!params[:service_name].nil?)
2640
+ where_clause << "AND PRODUCT like '#{(mas_db_get_channels("and display_channel = #{params[:channel_number]}"))[0]['DISPLAY_NAME']}'" if (!params[:channel_number].nil?)
2641
+
2642
+ # get mac address of current stb
2643
+ mac = fetch_stb_mac_address.to_s
2644
+ if mac.length == 12
2645
+ mac_address = "#{mac[0,2]}:#{mac[2,2]}:#{mac[4,2]}:#{mac[6,2]}:#{mac[8,2]}:#{mac[10,2]}" # Inserting colons in mac address
2646
+ else
2647
+ mac_address = mac
2648
+ end
2649
+ loginfo2 "Mac address of this box is #{mac_address}"
2650
+ where_clause << "AND TERMINAL_ID like '#{mac_address}'"
2651
+ data_array = mas_db_purchased_assets(where_clause)
2652
+ programs = []
2653
+ data_array.each{ |data_hash|
2654
+ time_arr = data_hash['PURCHASE_TIME'].split('/')
2655
+ purchase_time = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
2656
+
2657
+ programs.push({
2658
+ :od_asset_id => data_hash['OD_ASSET_ID'],
2659
+ :title => data_hash['OFFER_NAME'],
2660
+ :purchase_time => purchase_time,
2661
+ :offering_window => data_hash['OFFERING_WINDOW_HRS'],
2662
+ })
2663
+ }
2664
+
2665
+ return programs
2666
+ end
2667
+
2668
+ # Use it to tune to hidden channel
2669
+ # * *Args* :
2670
+ # - +channel+ -> channel number
2671
+ def tune_to_hidden_channel channel
2672
+ key_seq = [['SEL_LONG', 10000], ['RIGHT_ARROW', 200]]
2673
+ key_seq = key_seq + channel.to_s.chars.to_a
2674
+ key_seq.push('SELECT') unless key_seq.length.eql?(4) # only for less than 4 digits channels
2675
+ _press_key_sequence key_seq
2676
+
2677
+ sleep 3.sec
2678
+ loginfo3 "Tuned to hidden channel : [#{channel}]",true,false,"TUNE_TO_#{channel}"
2679
+ end
2680
+
2681
+ #Use it to enable field tools
2682
+ # * *Args* :
2683
+ # * *Returns* :
2684
+ # - true if enabled, else false
2685
+ def enable_field_tools
2686
+ if power_on_stb?
2687
+ key_sequence = [['POWER',200],['A',200],['B',200],['C',200],['SETTINGS',200],['POWER',500]]
2688
+ _press_key_sequence key_sequence
2689
+
2690
+ # wait few sec for setting to enable
2691
+ sleep 5.sec
2692
+ return true
2693
+ else
2694
+ loginfo2 'Failed to power on stb'
2695
+ return false
2696
+ end
2697
+ end
2698
+
2699
+ #Use it to enable power user
2700
+ # * *Args* :
2701
+ # * *Returns* :
2702
+ # - true if enabled, else false
2703
+ def enable_power_user
2704
+ enable_field_tools
2705
+ end
2706
+
2707
+ #Use it to find all shows for a program
2708
+ # * *Args* :
2709
+ # - +guide_program+ -> guide program
2710
+ # - +curr_time+ -> current time
2711
+ # - +no_of_days+ -> no. of days for which data is to be fetched
2712
+ # * *Returns* :
2713
+ # - array of guide programs
2714
+ def _find_all_shows_for_program guide_program, curr_time = mas_current_date, no_of_days = 5
2715
+ event_id = guide_program[18].to_s
2716
+ programs = find_programs({:EVENT_ID => event_id, :START_DATE_TIME => curr_time, :END_DATE_TIME => (curr_time + no_of_days*24*60*60)})
2717
+ return programs
2718
+ end
2719
+
2720
+ # Use it to get percent hdd full
2721
+ # * *Args* :
2722
+ # - +stb_ip+ -> ip address of box
2723
+ # * *Returns* :
2724
+ # - integer value of percent hdd full (eg. 85 for 85%)
2725
+ def _percentage_hdd_full stb_ip = fetch_ip
2726
+ percent_full = nil
2727
+ return percent_full if stb_ip.nil? # return nil if failed to fetch ip
2728
+
2729
+ if stb_capable_of?('ODN')
2730
+ disk_info = odn_web_server_disk_info(stb_ip)
2731
+ if disk_info
2732
+ percent_free = disk_info[:fractional_free_space].to_f * 100
2733
+ percent_full = (100-percent_free).round
2734
+ end
2735
+ else
2736
+ percent_full = mdn_remote_diags_get_hdd_status(stb_ip).to_i
2737
+ end
2738
+
2739
+ loginfo2 "HDD status : #{percent_full}% full"
2740
+ return percent_full
2741
+ end
2742
+
2743
+ # Use it to fetch stb list
2744
+ def fetch_stb_list
2745
+ $stbs
2746
+ end
2747
+
2748
+ # Use it to verify if sdv is eanbled or not from web diags
2749
+ # * *Args* :
2750
+ # - +stb_ip+ -> ip address of box
2751
+ # * *Returns* :
2752
+ # - integer true if enabled, else false
2753
+ def stb_sdv_enabled? stb_ip = fetch_ip
2754
+ if stb_capable_of?('ODN')
2755
+ return odn_web_server_stb_sdv_capable?(stb_ip)
2756
+ else
2757
+ return mdn_remode_diags_stb_sdv_capable?(stb_ip)
2758
+ end
2759
+ end
2760
+
2761
+ # Use it to get sdv source id from web diags
2762
+ # * *Args* :
2763
+ # - +stb_ip+ -> ip address of box
2764
+ # * *Returns* :
2765
+ # - source id as string
2766
+ def stb_sdv_source_id stb_ip = fetch_ip
2767
+ if stb_capable_of?('ODN')
2768
+ return odn_web_server_source_id(stb_ip)
2769
+ else
2770
+ return mdn_remote_diags_source_id(stb_ip)
2771
+ end
2772
+ end
2773
+
2774
+ # Use it to get sdv frequency from web diags
2775
+ # * *Args* :
2776
+ # - +stb_ip+ -> ip address of box
2777
+ # * *Returns* :
2778
+ # - sdv frequency as string
2779
+ def stb_sdv_frequency stb_ip = fetch_ip
2780
+ if stb_capable_of?('ODN')
2781
+ return odn_web_server_stb_frequency(stb_ip)
2782
+ else
2783
+ return mdn_remote_diags_sdv_frequency(stb_ip)
2784
+ end
2785
+ end
2786
+
2787
+ # Use it to get sdv packets sent/recieved from web diags
2788
+ # * *Args* :
2789
+ # - +stb_ip+ -> ip address of box
2790
+ # * *Returns* :
2791
+ # - array of sent recieved data [sent,recieved]
2792
+ def stb_sdv_packets_sent_recieved stb_ip = fetch_ip
2793
+ if stb_capable_of?('ODN')
2794
+ return odn_web_server_sdv_packets_sent_recieved(stb_ip)
2795
+ else
2796
+ return mdn_remote_diags_sdv_packets_sent_recieved(stb_ip)
2797
+ end
2798
+ end
2799
+
2800
+ # Use it to get channel change message for stb from sdv server
2801
+ # * *Args* :
2802
+ # - +no_of_logs+ -> number of logs to be fetched
2803
+ # - +stb_ip+ -> ip address of box
2804
+ # * *Returns* :
2805
+ # - array of logs
2806
+ def stb_sdv_channel_change_messages no_of_logs = 5, stb_ip = fetch_ip
2807
+ sdv_ip = fetch_option(:sdv_ip) # 172.16.3.33
2808
+ sdv_port = 22
2809
+ sdv_prompt = fetch_option(:sdv_prompt) # "]#"
2810
+ sdv_username = fetch_option(:sdv_username) # 'root'
2811
+ sdv_password = fetch_option(:sdv_password) # 'generic'
2812
+ logdebug "SDV Prompt '#{sdv_prompt}'"
2813
+ date = mas_current_date
2814
+ log_file_name = date.strftime("%d%b%Y_000000.txt")
2815
+
2816
+ begin
2817
+ opened = false
2818
+ open_interactive_ssh(sdv_ip, sdv_port, sdv_prompt, sdv_username, sdv_password)
2819
+ loginfo2 "opened ssh session"
2820
+ opened = true
2821
+ cmd = "tac #{fetch_option(:sdv_server_log_folder)}/#{log_file_name} | grep -m#{no_of_logs} #{stb_ip}"
2822
+ loginfo2 "command: #{cmd}"
2823
+ result = exec_interactive_ssh(sdv_prompt, cmd)
2824
+ result.gsub!(cmd,'')
2825
+ result.gsub!(/\[.*#{sdv_prompt.delete("\/")}/,'')
2826
+ date_time_regexp = /\d{4}\/\d{2}\/\d{2}\D*\d{2}:\d{2}:\d{2}\.\d{3}/
2827
+ result_array = result.split(date_time_regexp)
2828
+ result_array.shift
2829
+ return result_array
2830
+ rescue StandardError => e
2831
+ logdebug e.to_s
2832
+ return []
2833
+ ensure
2834
+ close_interactive_ssh if opened
2835
+ end
2836
+ end
2837
+
2838
+ #Private method
2839
+ # Use it to get od assets from reservation catalogs
2840
+ def _od_rsrv_assets(params={})
2841
+ where_clause = ''
2842
+ if (!params[:mac].nil?)
2843
+ where_clause << "AND TERMINAL_ID in (#{params[:mac]})"
2844
+ else
2845
+ mac = fetch_stb_mac_address.to_s
2846
+ if mac.length == 12
2847
+ mac_address = "#{mac[0,2]}:#{mac[2,2]}:#{mac[4,2]}:#{mac[6,2]}:#{mac[8,2]}:#{mac[10,2]}" # Inserting colons in mac address
2848
+ else
2849
+ mac_address = mac
2850
+ end
2851
+ where_clause << "AND TERMINAL_ID like '#{mac_address}'"
2852
+ end
2853
+ where_clause << "AND DISPLAY_CHANNEL = #{params[:channel_number]}" if (!params[:channel_number].nil?)
2854
+
2855
+ data = mas_db_od_assets_in_rsrv(where_clause)
2856
+ assets = []
2857
+ data.each{|data_hash|
2858
+ time_arr = data_hash['EXPIRATION_DATE'].split('/')
2859
+ expiration_date = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
2860
+
2861
+ asset = {
2862
+ :od_asset_id => data_hash['OD_ASSET_ID'],
2863
+ :title => data_hash['ASSET_TITLE'],
2864
+ :purchase_id => data_hash['OD_PURCHASE_ID'],
2865
+ :mystro_service_id => data_hash['MYSTRO_SERVICE_ID'],
2866
+ :expiration_date => expiration_date,
2867
+ }
2868
+ assets.push(asset)
2869
+ }
2870
+ return assets
2871
+ end
2872
+
2873
+ # Use this method to query RTI for ODN STBs.
2874
+ # * *Args* :
2875
+ # - +rti_path+ -> The xpath for query (must begin with forward slash)
2876
+ # * *Returns* :
2877
+ # - The body of the RTI response
2878
+ def fetch_rti(rti_path)
2879
+ tcinvalid "Box does not have IP for RTI." if test_data[:stb_ip].nil?
2880
+ uri = URI.parse("http://#{test_data[:stb_ip]}/rti#{rti_path}")
2881
+ loginfo "Fetching RTI from #{uri}"
2882
+ response = Net::HTTP.get_response(uri)
2883
+ return response.body.strip
2884
+ end
2885
+
2886
+ # Use it to get the message dialog object.
2887
+ # * *Returns* :
2888
+ # - nil, if no message dialog is displayed
2889
+ # - otherwise, A map object with keys
2890
+ # :title
2891
+ def message_dialog
2892
+ dialog = {}
2893
+
2894
+ dialog_title = fetch_rti("/UI/MessageDialog/Title")[1..-1]
2895
+ dialog[:title] = dialog_title.to_s
2896
+ loginfo3 "RTI Message Dialog, title:#{dialog_title}", true, false, "RTI"
2897
+
2898
+ return dialog
2899
+ end
2900
+
2901
+ # Use it to get the options dialog object.
2902
+ # * *Returns* :
2903
+ # - nil, if no options dialog is displayed
2904
+ # - otherwise, A map object with keys
2905
+ # :title
2906
+ def options_dialog
2907
+ dialog = {}
2908
+
2909
+ item_count = fetch_rti("/UI/MenuItemList/ItemCount")[1..-1].to_i
2910
+ dialog[:item_count] = item_count
2911
+ loginfo3 "RTI Options Dialog, items_count:#{item_count}", true, false, "RTI"
2912
+ return dialog
2913
+ end
2914
+
2915
+ # Use it to get the enhanced menu dialog object.
2916
+ # * *Returns* :
2917
+ # - nil, if no enhanced menu dialog is displayed
2918
+ # - otherwise, A map object with keys
2919
+ # :title
2920
+ def enhanced_menu_dialog
2921
+ dialog = {}
2922
+
2923
+ item_count = fetch_rti("/UI/EnhancedMenu/MenuItemList/ItemCount")[1..-1].to_i
2924
+ dialog[:item_count] = item_count
2925
+ loginfo3 "RTI Enhanced menu Dialog, items_count:#{item_count}", true, false, "RTI"
2926
+
2927
+ return dialog
2928
+ end
2929
+
2930
+ # Use it to get the keyboard dialog object.
2931
+ # * *Returns* :
2932
+ # - nil, if keyboard search isn't displayed
2933
+ # - otherwise, A map object with keys
2934
+ # :focus_char
2935
+ def keyboard_dialog
2936
+ dialog = {}
2937
+
2938
+ focus_char = fetch_rti("/UI/Keyboard/FocusChar")[1..-1].to_s
2939
+ dialog[:focus_char] = focus_char
2940
+ loginfo3 "RTI Keyboard, focus_char:#{focus_char}", true, false, "RTI"
2941
+
2942
+ return dialog
2943
+ end
2944
+ end