appium-espresso-driver 1.46.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 (311) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/LICENSE +201 -0
  3. package/README.md +864 -0
  4. package/build/index.js +48 -0
  5. package/build/lib/commands/execute.js +67 -0
  6. package/build/lib/commands/general.js +337 -0
  7. package/build/lib/commands/idling-resources.js +31 -0
  8. package/build/lib/commands/index.js +26 -0
  9. package/build/lib/commands/services.js +27 -0
  10. package/build/lib/desired-caps.js +65 -0
  11. package/build/lib/driver.js +475 -0
  12. package/build/lib/espresso-runner.js +381 -0
  13. package/build/lib/logger.js +18 -0
  14. package/build/lib/server-builder.js +213 -0
  15. package/build/lib/server.js +39 -0
  16. package/build/lib/utils.js +85 -0
  17. package/espresso-server/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk +0 -0
  18. package/espresso-server/app/build/outputs/apk/androidTest/debug/output-metadata.json +18 -0
  19. package/espresso-server/app/build.gradle.kts +153 -0
  20. package/espresso-server/app/proguard-rules.pro +25 -0
  21. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/EspressoServerRunnerTest.kt +93 -0
  22. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/AppDriver.kt +29 -0
  23. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/ComposeDriver.kt +73 -0
  24. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/DriverContext.kt +35 -0
  25. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/EspressoDriver.kt +70 -0
  26. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/AcceptAlert.kt +32 -0
  27. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Back.kt +31 -0
  28. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Clear.kt +40 -0
  29. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Click.kt +27 -0
  30. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/CreateSession.kt +58 -0
  31. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/DeleteSession.kt +33 -0
  32. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/DismissAlert.kt +32 -0
  33. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/DrawerActionHandler.kt +45 -0
  34. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ElementEquals.kt +19 -0
  35. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ElementScreenshot.kt +31 -0
  36. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ElementValue.kt +85 -0
  37. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindActive.kt +32 -0
  38. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindElement.kt +29 -0
  39. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindElements.kt +43 -0
  40. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetAlertText.kt +31 -0
  41. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetAttribute.kt +101 -0
  42. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetClipboard.kt +65 -0
  43. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetDeviceInfo.kt +44 -0
  44. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetDisplayed.kt +28 -0
  45. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetEnabled.kt +30 -0
  46. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetLocation.kt +32 -0
  47. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetLocationInView.kt +33 -0
  48. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetName.kt +31 -0
  49. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetOrientation.kt +44 -0
  50. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetRect.kt +38 -0
  51. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetRotation.kt +33 -0
  52. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSelected.kt +30 -0
  53. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSession.kt +34 -0
  54. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSessions.kt +41 -0
  55. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSettings.kt +25 -0
  56. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSize.kt +32 -0
  57. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetToastVisibility.kt +34 -0
  58. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetWindowRect.kt +43 -0
  59. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetWindowSize.kt +42 -0
  60. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/HideKeyboard.kt +29 -0
  61. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Keys.kt +82 -0
  62. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ListIdlingResources.kt +30 -0
  63. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileBackdoor.kt +42 -0
  64. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileClickAction.kt +49 -0
  65. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileSwipe.kt +71 -0
  66. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileViewFlash.kt +50 -0
  67. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MoveTo.kt +50 -0
  68. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MultiTouchAction.kt +50 -0
  69. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/NavigateTo.kt +42 -0
  70. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/NoSessionCommandHandler.kt +4 -0
  71. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/NotYetImplemented.kt +28 -0
  72. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/OpenNotifications.kt +28 -0
  73. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PerformAction.kt +42 -0
  74. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PerformAutofillDismissal.kt +31 -0
  75. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PerformEditorAction.kt +30 -0
  76. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PointerEventHandler.kt +281 -0
  77. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PressKeyCode.kt +90 -0
  78. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/RegisterIdlingResources.kt +33 -0
  79. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ReleaseActions.kt +41 -0
  80. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/RequestHandler.kt +43 -0
  81. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ScreenshotHandler.kt +29 -0
  82. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ScrollToPage.kt +60 -0
  83. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetClipboard.kt +64 -0
  84. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetDate.kt +41 -0
  85. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetOrientation.kt +61 -0
  86. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetRotation.kt +46 -0
  87. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetTime.kt +41 -0
  88. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Source.kt +29 -0
  89. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/StartActivity.kt +30 -0
  90. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/StartService.kt +40 -0
  91. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Status.kt +26 -0
  92. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/StopService.kt +37 -0
  93. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Text.kt +28 -0
  94. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/TouchAction.kt +49 -0
  95. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Uiautomator.kt +68 -0
  96. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/UiautomatorPageSource.kt +35 -0
  97. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/UnregisterIdlingResources.kt +33 -0
  98. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/UpdateSettings.kt +35 -0
  99. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/WebAtoms.kt +69 -0
  100. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/AppiumException.kt +40 -0
  101. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/DuplicateRouteException.kt +22 -0
  102. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/ElementNotVisibleException.kt +30 -0
  103. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidArgumentException.kt +35 -0
  104. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidElementStateException.kt +41 -0
  105. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidSelectorException.kt +35 -0
  106. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/MoveTargetOutOfBoundsException.kt +39 -0
  107. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NoAlertOpenException.kt +33 -0
  108. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NoSuchDriverException.kt +31 -0
  109. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NoSuchElementException.kt +34 -0
  110. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NotYetImplementedException.kt +33 -0
  111. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/ScreenCaptureException.kt +30 -0
  112. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/SessionNotCreatedException.kt +34 -0
  113. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/StaleElementException.kt +30 -0
  114. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/XPathLookupException.kt +31 -0
  115. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AccessibilityServiceState.kt +15 -0
  116. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ActivityHelpers.kt +125 -0
  117. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ActivityOptionsHelpers.kt +60 -0
  118. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AlertHelpers.kt +170 -0
  119. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AndroidLogger.kt +45 -0
  120. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AssertHelpers.kt +17 -0
  121. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AutofillHelpers.kt +44 -0
  122. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/BackdoorUtils.java +49 -0
  123. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ClipboardHelper.kt +51 -0
  124. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ComposeNodeFinder.kt +59 -0
  125. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/DeviceInfoHelper.kt +148 -0
  126. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/EspressoViewsCache.kt +57 -0
  127. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/GsonParserHelpers.kt +72 -0
  128. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/IMEHelpers.kt +88 -0
  129. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/IntentHelpers.kt +336 -0
  130. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/InteractionHelper.kt +40 -0
  131. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/InvocationOperation.java +80 -0
  132. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/LocaleHelpers.kt +46 -0
  133. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/Logger.kt +25 -0
  134. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/NotificationListener.kt +87 -0
  135. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/Rect.kt +22 -0
  136. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ReflectionUtils.kt +64 -0
  137. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ScreenshotsHelper.kt +59 -0
  138. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/StringHelpers.kt +42 -0
  139. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ThreadHelpers.kt +15 -0
  140. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/UiAutomationWrapper.kt +48 -0
  141. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ViewFinder.kt +316 -0
  142. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/XMLHelpers.kt +56 -0
  143. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/extensions/Semaphore.kt +22 -0
  144. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/ArrayUtils.java +110 -0
  145. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/ClassUtils.java +180 -0
  146. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/MethodUtils.java +155 -0
  147. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/Validate.java +34 -0
  148. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/BaseW3CActionAdapter.kt +71 -0
  149. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/DummyW3CActionAdapter.kt +133 -0
  150. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/W3CActionAdapter.kt +71 -0
  151. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/AndroidKeyEvent.kt +271 -0
  152. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/AndroidMotionEvent.kt +90 -0
  153. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/EspressoW3CActionAdapter.kt +147 -0
  154. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/Helpers.kt +71 -0
  155. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/MotionEventBuilder.kt +153 -0
  156. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/MultiTouchState.kt +132 -0
  157. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/TouchState.kt +7 -0
  158. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/caps/CapsUtils.kt +96 -0
  159. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/BaseDispatchResult.kt +14 -0
  160. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/DispatchPointerMoveResult.kt +22 -0
  161. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/KeyDispatch.kt +151 -0
  162. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/PointerDispatch.kt +286 -0
  163. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/W3CKeyEvent.kt +21 -0
  164. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/KeyCodeMapper.kt +169 -0
  165. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/KeyLocationMapper.kt +50 -0
  166. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/KeyNormalizer.kt +84 -0
  167. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/NormalizedKeys.kt +60 -0
  168. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/ActionObject.kt +138 -0
  169. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/ActionSequence.kt +112 -0
  170. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/Actions.kt +89 -0
  171. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/InputSource.kt +173 -0
  172. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/Origin.kt +24 -0
  173. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/OriginDeserializer.kt +25 -0
  174. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/Tick.kt +62 -0
  175. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/ActionsProcessor.kt +93 -0
  176. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/KeyProcessor.kt +57 -0
  177. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/PauseProcessor.kt +59 -0
  178. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/PointerProcessor.kt +115 -0
  179. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/ProcessorHelpers.kt +35 -0
  180. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/ActiveInputSources.kt +62 -0
  181. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/InputState.kt +6 -0
  182. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/InputStateTable.kt +95 -0
  183. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/KeyInputState.kt +82 -0
  184. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/PointerInputState.kt +45 -0
  185. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/RouteDefinition.kt +67 -0
  186. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/RouteMap.kt +51 -0
  187. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/Router.kt +250 -0
  188. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/Server.kt +109 -0
  189. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/response/AppiumResponse.kt +61 -0
  190. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/response/BaseResponse.kt +25 -0
  191. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/AlertParams.kt +21 -0
  192. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/AppiumParams.kt +55 -0
  193. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/BackdoorMethodArg.kt +3 -0
  194. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ClipboardDataType.kt +18 -0
  195. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/DrawerActionParams.kt +21 -0
  196. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/EditorActionParams.kt +21 -0
  197. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Element.kt +169 -0
  198. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/GetClipboardParams.kt +27 -0
  199. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/GlobalSession.kt +64 -0
  200. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/HamcrestMatcher.kt +144 -0
  201. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/IdlingResourcesParams.kt +66 -0
  202. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/KeyEventParams.kt +23 -0
  203. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/LocaleParams.kt +34 -0
  204. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Location.kt +19 -0
  205. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Locator.kt +22 -0
  206. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MatcherJson.kt +37 -0
  207. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileBackdoorMethod.kt +22 -0
  208. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileBackdoorParams.kt +20 -0
  209. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileClickActionParams.kt +81 -0
  210. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileSwipeParams.kt +106 -0
  211. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MotionEventParams.kt +37 -0
  212. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MoveToParams.kt +26 -0
  213. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MultiTouchActionsParams.kt +5 -0
  214. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/NavigateToParams.kt +21 -0
  215. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/OrientationParams.kt +21 -0
  216. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/OrientationType.kt +6 -0
  217. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Rect.kt +24 -0
  218. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/RotationParams.kt +38 -0
  219. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ScrollToPageParams.kt +36 -0
  220. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SessionParams.kt +23 -0
  221. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SetClipboardParams.kt +29 -0
  222. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SetDateParams.kt +23 -0
  223. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SetTimeParams.kt +22 -0
  224. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SettingsParams.kt +19 -0
  225. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Size.kt +22 -0
  226. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SourceDocument.kt +286 -0
  227. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/StartActivityParams.kt +9 -0
  228. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/StartServiceParams.kt +22 -0
  229. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/StopServiceParams.kt +21 -0
  230. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Strategy.kt +49 -0
  231. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TextValueParams.kt +6 -0
  232. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ToastLookupParams.kt +22 -0
  233. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TouchAction.kt +178 -0
  234. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TouchActionsParams.kt +5 -0
  235. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/UiautomatorParams.kt +123 -0
  236. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewAttributesEnum.kt +51 -0
  237. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewElement.kt +204 -0
  238. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewFlashParams.kt +9 -0
  239. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewText.kt +12 -0
  240. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/WindowRect.kt +24 -0
  241. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/WindowSize.kt +22 -0
  242. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/AbstractSetting.kt +23 -0
  243. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/DriverSetting.kt +40 -0
  244. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/SettingType.kt +21 -0
  245. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtom.kt +26 -0
  246. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtomDeserializer.kt +99 -0
  247. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtomsMethods.kt +4 -0
  248. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtomsParams.kt +9 -0
  249. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/OrientationChange.kt +47 -0
  250. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/ScrollTo.kt +48 -0
  251. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/UiControllerPerformer.kt +67 -0
  252. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/UiControllerRunnable.kt +25 -0
  253. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/ViewGetter.kt +79 -0
  254. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/ViewTextGetter.kt +31 -0
  255. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/RegexpTextMatcher.kt +38 -0
  256. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/WithView.kt +33 -0
  257. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/WithXPath.kt +55 -0
  258. package/espresso-server/app/src/main/AndroidManifest.xml +7 -0
  259. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/Helpers.kt +20 -0
  260. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/backdoor-methods.json +51 -0
  261. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/key-actions.json +15 -0
  262. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/multi-touch-actions.json +28 -0
  263. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/GsonParserHelpersTest.kt +41 -0
  264. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/IntentCreationTests.kt +115 -0
  265. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/InvocationOperationTest.java +97 -0
  266. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/KReflectionUtilsTest.kt +108 -0
  267. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/XpathQueryParserTests.kt +42 -0
  268. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/ActionSequenceTest.kt +220 -0
  269. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/ActionsTest.kt +76 -0
  270. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/CapsUtilsTest.kt +76 -0
  271. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/Helpers.kt +7 -0
  272. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/InputSourceTest.kt +153 -0
  273. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/InputStateTableTest.kt +72 -0
  274. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/KeyDispatchTest.kt +133 -0
  275. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/KeyInputStateTest.kt +74 -0
  276. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/PointerDispatchTest.kt +370 -0
  277. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/ProcessorTest.kt +320 -0
  278. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/TickTest.kt +265 -0
  279. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/adapter/AndroidKeyEventTest.kt +114 -0
  280. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/adapter/HelpersTest.kt +31 -0
  281. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/http/RouteDefinitionTest.kt +74 -0
  282. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/HamcrestMatcherTest.kt +112 -0
  283. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MatcherJsonTest.kt +20 -0
  284. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileBackdoorMethodTest.java +110 -0
  285. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileClickTest.kt +46 -0
  286. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileSwipeTest.kt +68 -0
  287. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/TouchActionTest.kt +56 -0
  288. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/web/WebAtomTest.kt +68 -0
  289. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/web/WebAtomsTest.kt +96 -0
  290. package/espresso-server/build.gradle.kts +33 -0
  291. package/espresso-server/gradle/wrapper/gradle-wrapper.jar +0 -0
  292. package/espresso-server/gradle/wrapper/gradle-wrapper.properties +5 -0
  293. package/espresso-server/gradle.properties +26 -0
  294. package/espresso-server/gradlew +185 -0
  295. package/espresso-server/gradlew.bat +89 -0
  296. package/espresso-server/lint.xml +4 -0
  297. package/espresso-server/settings.gradle.kts +1 -0
  298. package/index.js +29 -0
  299. package/lib/commands/execute.js +72 -0
  300. package/lib/commands/general.js +321 -0
  301. package/lib/commands/idling-resources.js +52 -0
  302. package/lib/commands/index.js +16 -0
  303. package/lib/commands/services.js +50 -0
  304. package/lib/desired-caps.js +55 -0
  305. package/lib/driver.js +566 -0
  306. package/lib/espresso-runner.js +340 -0
  307. package/lib/logger.js +6 -0
  308. package/lib/server-builder.js +194 -0
  309. package/lib/server.js +18 -0
  310. package/lib/utils.js +74 -0
  311. package/package.json +105 -0
@@ -0,0 +1,67 @@
1
+ /*
2
+ * Licensed under the Apache License, Version 2.0 (the "License");
3
+ * you may not use this file except in compliance with the License.
4
+ * See the NOTICE file distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ package io.appium.espressoserver.lib.http
18
+
19
+ import java.util.HashMap
20
+
21
+ import fi.iki.elonen.NanoHTTPD.Method
22
+ import io.appium.espressoserver.lib.handlers.RequestHandler
23
+ import io.appium.espressoserver.lib.model.AppiumParams
24
+
25
+ class RouteDefinition(val method: Method, val routeUri: String,
26
+ val handler: RequestHandler<*, *>,
27
+ val paramClass: Class<out AppiumParams>) {
28
+
29
+ private val testRegex = buildTestRegex(routeUri)
30
+
31
+ fun isMatch(uri: String): Boolean = uri.matches(testRegex)
32
+
33
+ fun getUriParams(uri: String): Map<String, String> {
34
+ val uriParams = HashMap<String, String>()
35
+ val uriTokens = uri.split("/".toRegex())
36
+ .dropLastWhile { it.isEmpty() }
37
+ .toTypedArray()
38
+ for ((index, routeUriToken) in routeUri.split("/".toRegex())
39
+ .dropLastWhile { it.isEmpty() }
40
+ .toTypedArray()
41
+ .withIndex()) {
42
+ // If a token starts with ':', then what's after is an identifier
43
+ if (routeUriToken.startsWith(":")) {
44
+ uriParams[routeUriToken.substring(1)] = uriTokens[index]
45
+ }
46
+ }
47
+ return uriParams
48
+ }
49
+
50
+ private fun buildTestRegex(uri: String): Regex {
51
+ val testRegex = StringBuilder("^")
52
+
53
+ // Convert route to a regex
54
+ for (uriToken in uri.split("/".toRegex())
55
+ .dropLastWhile { it.isEmpty() }
56
+ .toTypedArray()) {
57
+ if (uriToken.startsWith(":")) {
58
+ testRegex.append("/[^/]*")
59
+ } else if (uriToken.isNotEmpty()) {
60
+ testRegex.append("/")
61
+ testRegex.append(uriToken)
62
+ }
63
+ }
64
+ testRegex.append("/?$")
65
+ return testRegex.toString().toRegex()
66
+ }
67
+ }
@@ -0,0 +1,51 @@
1
+ /*
2
+ * Licensed under the Apache License, Version 2.0 (the "License");
3
+ * you may not use this file except in compliance with the License.
4
+ * See the NOTICE file distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ package io.appium.espressoserver.lib.http
18
+
19
+ import java.util.concurrent.ConcurrentHashMap
20
+
21
+ import fi.iki.elonen.NanoHTTPD.Method
22
+ import io.appium.espressoserver.lib.handlers.exceptions.DuplicateRouteException
23
+
24
+ class RouteMap {
25
+
26
+ private val routeMap = ConcurrentHashMap<Method, MutableMap<String, RouteDefinition>>()
27
+
28
+ fun addRoute(route: RouteDefinition) {
29
+ var methodMap: MutableMap<String, RouteDefinition>? = routeMap[route.method]
30
+ if (methodMap == null) {
31
+ methodMap = ConcurrentHashMap()
32
+ routeMap[route.method] = methodMap
33
+ }
34
+ if (methodMap.containsKey(route.routeUri)) {
35
+ throw DuplicateRouteException()
36
+ }
37
+ methodMap[route.routeUri] = route
38
+ }
39
+
40
+ fun findMatchingRoute(method: Method, uri: String): RouteDefinition? {
41
+ val methodMap = routeMap[method] ?: return null
42
+ for ((_, routeDefinition) in methodMap) {
43
+ if (routeDefinition.isMatch(uri)) {
44
+ return routeDefinition
45
+ }
46
+ }
47
+
48
+ return null
49
+ }
50
+
51
+ }
@@ -0,0 +1,250 @@
1
+ /*
2
+ * Licensed under the Apache License, Version 2.0 (the "License");
3
+ * you may not use this file except in compliance with the License.
4
+ * See the NOTICE file distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ package io.appium.espressoserver.lib.http
18
+
19
+ import com.google.gson.Gson
20
+ import com.google.gson.JsonParseException
21
+ import fi.iki.elonen.NanoHTTPD.Method
22
+ import io.appium.espressoserver.lib.handlers.*
23
+ import io.appium.espressoserver.lib.handlers.PointerEventHandler.TouchType.*
24
+ import io.appium.espressoserver.lib.handlers.TouchAction
25
+ import io.appium.espressoserver.lib.handlers.exceptions.*
26
+ import io.appium.espressoserver.lib.helpers.AndroidLogger
27
+ import io.appium.espressoserver.lib.helpers.StringHelpers.abbreviate
28
+ import io.appium.espressoserver.lib.helpers.w3c.models.Actions
29
+ import io.appium.espressoserver.lib.http.response.AppiumResponse
30
+ import io.appium.espressoserver.lib.http.response.BaseResponse
31
+ import io.appium.espressoserver.lib.model.*
32
+ import io.appium.espressoserver.lib.model.web.WebAtomsParams
33
+
34
+ internal class Router {
35
+ private val routeMap: RouteMap
36
+
37
+ init {
38
+ AndroidLogger.debug("Generating routes")
39
+ routeMap = RouteMap()
40
+
41
+ routeMap.addRoute(RouteDefinition(Method.GET, "/status", Status(), AppiumParams::class.java))
42
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session", CreateSession(), SessionParams::class.java))
43
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId", GetSession(), AppiumParams::class.java))
44
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/actions", PerformAction(), Actions::class.java))
45
+ routeMap.addRoute(RouteDefinition(Method.DELETE, "/session/:sessionId/actions", ReleaseActions(), Actions::class.java))
46
+ routeMap.addRoute(RouteDefinition(Method.DELETE, "/session/:sessionId", DeleteSession(), AppiumParams::class.java))
47
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/back", Back(), AppiumParams::class.java))
48
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/accept_alert", AcceptAlert(), AlertParams::class.java))
49
+ // alias
50
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/alert/accept", AcceptAlert(), AlertParams::class.java))
51
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/dismiss_alert", DismissAlert(), AlertParams::class.java))
52
+ // alias
53
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/alert/dismiss", DismissAlert(), AlertParams::class.java))
54
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/alert_text", GetAlertText(), AppiumParams::class.java))
55
+ // alias
56
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/alert/text", GetAlertText(), AppiumParams::class.java))
57
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/orientation", SetOrientation(), OrientationParams::class.java))
58
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/orientation", GetOrientation(), AppiumParams::class.java))
59
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/rotation", SetRotation(), RotationParams::class.java))
60
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/rotation", GetRotation(), AppiumParams::class.java))
61
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/source", Source(), AppiumParams::class.java))
62
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/screenshot", ScreenshotHandler(), AppiumParams::class.java))
63
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/element", FindElement(), Locator::class.java))
64
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/element/active", FindActive(), AppiumParams::class.java))
65
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/element/active", FindActive(), AppiumParams::class.java))
66
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/element/:elementId/attribute/:name", GetAttribute(), AppiumParams::class.java))
67
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/element/:elementId/clear", Clear(), AppiumParams::class.java))
68
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/element/:elementId/click", Click(), AppiumParams::class.java))
69
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/element/:elementId/displayed", GetDisplayed(), AppiumParams::class.java))
70
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/element/:elementId/element", FindElement(), Locator::class.java))
71
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/element/:elementId/elements", FindElements(), Locator::class.java))
72
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/element/:elementId/enabled", GetEnabled(), AppiumParams::class.java))
73
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/element/:elementId/location", GetLocation(), AppiumParams::class.java))
74
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/element/:elementId/location_in_view", GetLocationInView(), AppiumParams::class.java))
75
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/element/:elementId/name", GetName(), AppiumParams::class.java))
76
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/element/:elementId/rect", GetRect(), AppiumParams::class.java))
77
+ // W3C endpoint
78
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/element/:elementId/screenshot", ElementScreenshot(), AppiumParams::class.java))
79
+ // JSONWP endpoint
80
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/screenshot/:elementId", ElementScreenshot(), AppiumParams::class.java))
81
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/element/:elementId/selected", GetSelected(), AppiumParams::class.java))
82
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/element/:elementId/size", GetSize(), AppiumParams::class.java))
83
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/element/:elementId/text", Text(), AppiumParams::class.java))
84
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/element/:elementId/value", ElementValue(false), TextValueParams::class.java))
85
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/keys", Keys(), TextValueParams::class.java))
86
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/window/:windowHandle/size", GetWindowSize(), AppiumParams::class.java))
87
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/window/rect", GetWindowRect(), AppiumParams::class.java))
88
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/elements", FindElements(), Locator::class.java))
89
+ routeMap.addRoute(RouteDefinition(Method.GET, "/sessions", GetSessions(), AppiumParams::class.java))
90
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/appium/device/info", GetDeviceInfo(), AppiumParams::class.java))
91
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/device/hide_keyboard", HideKeyboard(), AppiumParams::class.java))
92
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/device/start_activity", StartActivity(), StartActivityParams::class.java))
93
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/device/press_keycode", PressKeyCode(false), KeyEventParams::class.java))
94
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/device/long_press_keycode", PressKeyCode(true), KeyEventParams::class.java))
95
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/device/perform_editor_action", PerformEditorAction(), EditorActionParams::class.java))
96
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/element/:elementId/equals/:otherId", ElementEquals(), AppiumParams::class.java))
97
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/element/:elementId/value", ElementValue(false), TextValueParams::class.java))
98
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/element/:elementId/replace_value", ElementValue(true), TextValueParams::class.java))
99
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/device/get_clipboard", GetClipboard(), GetClipboardParams::class.java))
100
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/device/set_clipboard", SetClipboard(), SetClipboardParams::class.java))
101
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/device/open_notifications", OpenNotifications(), AppiumParams::class.java))
102
+
103
+ // touch events
104
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/touch/click", PointerEventHandler(CLICK), MotionEventParams::class.java))
105
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/touch/longclick", PointerEventHandler(LONG_CLICK), MotionEventParams::class.java))
106
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/touch/doubleclick", PointerEventHandler(DOUBLE_CLICK), MotionEventParams::class.java))
107
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/touch/down", PointerEventHandler(TOUCH_DOWN), MotionEventParams::class.java))
108
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/touch/up", PointerEventHandler(TOUCH_UP), MotionEventParams::class.java))
109
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/touch/move", PointerEventHandler(TOUCH_MOVE), MotionEventParams::class.java))
110
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/touch/scroll", PointerEventHandler(TOUCH_SCROLL), MotionEventParams::class.java))
111
+
112
+ // mouse events
113
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/buttondown", PointerEventHandler(MOUSE_DOWN), MotionEventParams::class.java))
114
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/buttonup", PointerEventHandler(MOUSE_UP), MotionEventParams::class.java))
115
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/moveto", MoveTo(), MoveToParams::class.java))
116
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/click", PointerEventHandler(MOUSE_CLICK), AppiumParams::class.java))
117
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/doubleclick", PointerEventHandler(MOUSE_DOUBLECLICK), AppiumParams::class.java))
118
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/touch/perform", TouchAction(), TouchActionsParams::class.java))
119
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/touch/multi/perform", MultiTouchAction(), MultiTouchActionsParams::class.java))
120
+
121
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/settings", UpdateSettings(), SettingsParams::class.java))
122
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/appium/settings", GetSettings(), AppiumParams::class.java))
123
+
124
+ // 'execute mobile' commands
125
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/:elementId/swipe", MobileSwipe(), MobileSwipeParams::class.java))
126
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/is_toast_displayed", GetToastVisibility(), ToastLookupParams::class.java))
127
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/:elementId/open_drawer", DrawerActionHandler(true), DrawerActionParams::class.java))
128
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/:elementId/close_drawer", DrawerActionHandler(false), DrawerActionParams::class.java))
129
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/:elementId/set_date", SetDate(), SetDateParams::class.java))
130
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/:elementId/set_time", SetTime(), SetTimeParams::class.java))
131
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/:elementId/scroll_to_page", ScrollToPage(), ScrollToPageParams::class.java))
132
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/:elementId/navigate_to", NavigateTo(), NavigateToParams::class.java))
133
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/backdoor", MobileBackdoor(), MobileBackdoorParams::class.java))
134
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/:elementId/flash", MobileViewFlash(), ViewFlashParams::class.java))
135
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/uiautomator", Uiautomator(), UiautomatorParams::class.java))
136
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/appium/execute_mobile/uiautomator_page_source", UiautomatorPageSource(), AppiumParams::class.java))
137
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/:elementId/click_action", MobileClickAction(), MobileClickActionParams::class.java))
138
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/web_atoms", WebAtoms(), WebAtomsParams::class.java))
139
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/:elementId/dismiss_autofill", PerformAutofillDismissal(), AppiumParams::class.java))
140
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/start_service", StartService(), StartServiceParams::class.java))
141
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/stop_service", StopService(), StopServiceParams::class.java))
142
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/register_idling_resources", RegisterIdlingResources(), IdlingResourcesParams::class.java))
143
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/appium/execute_mobile/unregister_idling_resources", UnregisterIdlingResources(), IdlingResourcesParams::class.java))
144
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/appium/execute_mobile/list_idling_resources", ListIdlingResources(), AppiumParams::class.java))
145
+
146
+ // Not implemented
147
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/touch/flick", NotYetImplemented(), AppiumParams::class.java))
148
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/alert_text", NotYetImplemented(), AppiumParams::class.java))
149
+
150
+ // Probably will never implement
151
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/context", NotYetImplemented(), AppiumParams::class.java))
152
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/contexts", NotYetImplemented(), AppiumParams::class.java))
153
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/contexts", NotYetImplemented(), AppiumParams::class.java))
154
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/timeouts", NotYetImplemented(), AppiumParams::class.java))
155
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/timeouts/async_script", NotYetImplemented(), AppiumParams::class.java))
156
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/timeouts/implicit_wait", NotYetImplemented(), AppiumParams::class.java))
157
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/window_handle", NotYetImplemented(), AppiumParams::class.java))
158
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/window_handles", NotYetImplemented(), AppiumParams::class.java))
159
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/url", NotYetImplemented(), AppiumParams::class.java))
160
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/url", NotYetImplemented(), AppiumParams::class.java))
161
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/forward", NotYetImplemented(), AppiumParams::class.java))
162
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/refresh", NotYetImplemented(), AppiumParams::class.java))
163
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/execute", NotYetImplemented(), AppiumParams::class.java))
164
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/execute_async", NotYetImplemented(), AppiumParams::class.java))
165
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/ime/available_engines", NotYetImplemented(), AppiumParams::class.java))
166
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/ime/active_engine", NotYetImplemented(), AppiumParams::class.java))
167
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/ime/activated", NotYetImplemented(), AppiumParams::class.java))
168
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/ime/deactivate", NotYetImplemented(), AppiumParams::class.java))
169
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/ime/activate", NotYetImplemented(), AppiumParams::class.java))
170
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/frame", NotYetImplemented(), AppiumParams::class.java))
171
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/window", NotYetImplemented(), AppiumParams::class.java))
172
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/window/:windowhandle/maximize", NotYetImplemented(), AppiumParams::class.java))
173
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/cookie", NotYetImplemented(), AppiumParams::class.java))
174
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/cookie", NotYetImplemented(), AppiumParams::class.java))
175
+ routeMap.addRoute(RouteDefinition(Method.DELETE, "/session/:sessionId/cookie", NotYetImplemented(), AppiumParams::class.java))
176
+ routeMap.addRoute(RouteDefinition(Method.DELETE, "/session/:sessionId/cookie/:name", NotYetImplemented(), AppiumParams::class.java))
177
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/title", NotYetImplemented(), AppiumParams::class.java))
178
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/element/:elementId/submit", NotYetImplemented(), AppiumParams::class.java))
179
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/element/:elementId/css/:propertyName", NotYetImplemented(), AppiumParams::class.java))
180
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/location", NotYetImplemented(), AppiumParams::class.java))
181
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/location", NotYetImplemented(), AppiumParams::class.java))
182
+ routeMap.addRoute(RouteDefinition(Method.POST, "/session/:sessionId/log", NotYetImplemented(), AppiumParams::class.java))
183
+ routeMap.addRoute(RouteDefinition(Method.GET, "/session/:sessionId/log/types", NotYetImplemented(), AppiumParams::class.java))
184
+ }
185
+
186
+ fun route(uri: String, method: Method, files: Map<String, String>): BaseResponse {
187
+ AndroidLogger.debug("Started processing $method request for '$uri'")
188
+
189
+ // Look for a route that matches this URL
190
+ val matchingRoute = routeMap.findMatchingRoute(method, uri)
191
+ ?: return AppiumResponse(AppiumException("No such route: $uri"))
192
+
193
+ // If no route found, return a 404 Error Response
194
+ AndroidLogger.debug("Matched route definition: ${matchingRoute.javaClass}")
195
+
196
+ // Get the handler, parameter class and URI parameters
197
+ val handler = matchingRoute.handler
198
+ AndroidLogger.debug("Matched route handler: ${handler.javaClass}")
199
+ val paramClass = matchingRoute.paramClass
200
+ val uriParams = matchingRoute.getUriParams(uri)
201
+
202
+ // Get the appium params
203
+ val postJson = files["postData"]
204
+
205
+ var sessionId: String? = null
206
+ try {
207
+ // Parse the parameters
208
+ val appiumParams: AppiumParams = postJson?.let {
209
+ AndroidLogger.debug("Got raw post data: ${abbreviate(it, 300)}")
210
+ try {
211
+ paramClass.cast(Gson().fromJson<AppiumParams>(it, paramClass))
212
+ ?: return AppiumResponse(InvalidArgumentException("Could not parse JSON: $it"))
213
+ } catch (e: JsonParseException) {
214
+ // If failed to parse params, throw an invalid argument exception
215
+ return AppiumResponse(InvalidArgumentException(e))
216
+ }
217
+ } ?: AppiumParams()
218
+ appiumParams.initUriMapping(uriParams)
219
+
220
+ // Validate the sessionId
221
+ if (appiumParams.sessionId != null
222
+ && GlobalSession.exists && appiumParams.sessionId != GlobalSession.sessionId) {
223
+ return AppiumResponse(NoSuchDriverException("Invalid session ID ${appiumParams.sessionId!!}"))
224
+ }
225
+
226
+ // Execute the matching handler
227
+ sessionId = appiumParams.sessionId
228
+ val handlerResult = handler.handle(appiumParams)
229
+
230
+ // If it's a new session, pull out the newly created Session ID
231
+ if (handlerResult is GlobalSession) {
232
+ sessionId = handlerResult.sessionId
233
+ }
234
+
235
+ // Construct the response and serve it
236
+ val appiumResponse = AppiumResponse(handlerResult, sessionId)
237
+ AndroidLogger.debug("Finished processing $method request for '$uri'")
238
+ return appiumResponse
239
+ } catch (e: Throwable) {
240
+ var err = e
241
+ if (e is NoClassDefFoundError) {
242
+ err = IllegalStateException("${e.message} " +
243
+ "Consider adding the appropriate dependency containing the missing class into " +
244
+ "'additionalAndroidTestDependencies' and/or 'additionalAppDependencies' property values of " +
245
+ "'espressoBuildConfig' capability", e)
246
+ }
247
+ return AppiumResponse(err, sessionId)
248
+ }
249
+ }
250
+ }
@@ -0,0 +1,109 @@
1
+ /*
2
+ * Licensed under the Apache License, Version 2.0 (the "License");
3
+ * you may not use this file except in compliance with the License.
4
+ * See the NOTICE file distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ package io.appium.espressoserver.lib.http
18
+
19
+ import com.google.gson.GsonBuilder
20
+ import fi.iki.elonen.NanoHTTPD
21
+ import io.appium.espressoserver.lib.helpers.AndroidLogger
22
+ import io.appium.espressoserver.lib.helpers.StringHelpers
23
+ import io.appium.espressoserver.lib.helpers.setAccessibilityServiceState
24
+ import io.appium.espressoserver.lib.http.response.AppiumResponse
25
+ import io.appium.espressoserver.lib.http.response.BaseResponse
26
+ import java.io.IOException
27
+ import java.net.SocketException
28
+ import java.util.*
29
+
30
+ const val DEFAULT_PORT = 6791
31
+
32
+ object Server : NanoHTTPD(DEFAULT_PORT) {
33
+
34
+ private var router: Router? = null
35
+
36
+ @Volatile
37
+ var isStopRequestReceived: Boolean = false
38
+ private set
39
+
40
+ private fun buildFixedLengthResponse(response: BaseResponse): Response {
41
+ val gsonBuilder = GsonBuilder()
42
+ .serializeNulls()
43
+ return newFixedLengthResponse(response.httpStatus,
44
+ "application/json", gsonBuilder.create().toJson(response))
45
+ }
46
+
47
+ override fun serve(session: IHTTPSession): Response {
48
+ val files = LinkedHashMap<String, String>()
49
+ val response = try {
50
+ session.parseBody(files)
51
+ router!!.route(session.uri, session.method, files)
52
+ } catch (e: Exception) {
53
+ when (e) {
54
+ is RuntimeException, is IOException, is ResponseException ->
55
+ AppiumResponse(e)
56
+ else -> throw e
57
+ }
58
+ }
59
+
60
+ if (response is AppiumResponse) {
61
+ if (response.httpStatus === Response.Status.OK) {
62
+ AndroidLogger.info("Responding to server with value: " +
63
+ StringHelpers.abbreviate(response.value?.toString(), 300))
64
+ } else {
65
+ AndroidLogger.info("Responding to server with error: ${response.value}")
66
+ }
67
+ }
68
+
69
+ return try {
70
+ buildFixedLengthResponse(response)
71
+ } catch (e: RuntimeException) {
72
+ buildFixedLengthResponse(AppiumResponse(e))
73
+ }
74
+
75
+ }
76
+
77
+ @Throws(IOException::class)
78
+ override fun start() {
79
+ if (super.isAlive()) {
80
+ //kill the server if its already running
81
+ try {
82
+ super.stop()
83
+ } catch (e: Exception) {
84
+ //ignore the exception
85
+ }
86
+ }
87
+
88
+ setAccessibilityServiceState()
89
+
90
+ try {
91
+ super.start(SOCKET_READ_TIMEOUT, false)
92
+ } catch (e: SocketException) {
93
+ throw IllegalStateException("The application under test must require android.permission.INTERNET " +
94
+ "permission in its manifest", e)
95
+ }
96
+
97
+ AndroidLogger.info("\nRunning Appium Espresso Server at port $DEFAULT_PORT\n")
98
+ router = Router()
99
+ }
100
+
101
+ override fun stop() {
102
+ super.stop()
103
+ AndroidLogger.info("\nStopping Appium Espresso at port $DEFAULT_PORT\n")
104
+ }
105
+
106
+ fun makeRequestForServerToStop() {
107
+ isStopRequestReceived = true
108
+ }
109
+ }
@@ -0,0 +1,61 @@
1
+ /*
2
+ * Licensed under the Apache License, Version 2.0 (the "License");
3
+ * you may not use this file except in compliance with the License.
4
+ * See the NOTICE file distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ package io.appium.espressoserver.lib.http.response
18
+
19
+ import android.util.Log
20
+ import java.util.UUID
21
+ import fi.iki.elonen.NanoHTTPD.Response.Status
22
+ import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
23
+ import io.appium.espressoserver.lib.handlers.exceptions.MESSAGE_UNKNOWN_ERROR
24
+
25
+ class AppiumResponse : BaseResponse {
26
+ internal var value: Any? = null
27
+ var sessionId: String? = null
28
+ private set
29
+ // Unique Appium transaction ID
30
+ var id: String? = null
31
+ private set
32
+
33
+ constructor(value: Any?) {
34
+ init(value, null)
35
+ }
36
+
37
+ constructor(value: Any?, sessionId: String?) {
38
+ init(value, sessionId)
39
+ }
40
+
41
+ private fun formatError(e: AppiumException,
42
+ originalStacktrace: String): Map<String, String> = mapOf(
43
+ "error" to e.error(),
44
+ "message" to (e.message ?: MESSAGE_UNKNOWN_ERROR),
45
+ "stacktrace" to originalStacktrace
46
+ )
47
+
48
+ private fun init(value: Any?, sessionId: String?) {
49
+ if (value is Throwable) {
50
+ val e = if (value is AppiumException) value else AppiumException(value)
51
+ this.value = formatError(e, Log.getStackTraceString(value))
52
+ this.httpStatus = e.status()
53
+ } else {
54
+ this.value = value
55
+ this.httpStatus = Status.OK
56
+ }
57
+ this.sessionId = sessionId
58
+ this.id = UUID.randomUUID().toString()
59
+ }
60
+ }
61
+
@@ -0,0 +1,25 @@
1
+ /*
2
+ * Licensed under the Apache License, Version 2.0 (the "License");
3
+ * you may not use this file except in compliance with the License.
4
+ * See the NOTICE file distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ package io.appium.espressoserver.lib.http.response
18
+
19
+ import fi.iki.elonen.NanoHTTPD.Response.Status
20
+
21
+ abstract class BaseResponse {
22
+ @Transient
23
+ var httpStatus: Status? = null
24
+ protected set
25
+ }
@@ -0,0 +1,21 @@
1
+ /*
2
+ * Licensed under the Apache License, Version 2.0 (the "License");
3
+ * you may not use this file except in compliance with the License.
4
+ * See the NOTICE file distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ package io.appium.espressoserver.lib.model
18
+
19
+ data class AlertParams(
20
+ var buttonLabel: String? = null
21
+ ) : AppiumParams()
@@ -0,0 +1,55 @@
1
+ /*
2
+ * Licensed under the Apache License, Version 2.0 (the "License");
3
+ * you may not use this file except in compliance with the License.
4
+ * See the NOTICE file distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ package io.appium.espressoserver.lib.model
18
+
19
+ import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
20
+
21
+
22
+ const val SESSION_ID_PARAM_NAME = "sessionId"
23
+ const val ELEMENT_ID_PARAM_NAME = "elementId"
24
+
25
+ open class AppiumParams {
26
+ var uriParams:MutableMap<String, String>? = null
27
+
28
+ val sessionId: String?
29
+ get() = getUriParameterValue(SESSION_ID_PARAM_NAME)
30
+
31
+ var elementId: String?
32
+ get() = getUriParameterValue(ELEMENT_ID_PARAM_NAME)
33
+ set(elementId) = setUriParameterValue(ELEMENT_ID_PARAM_NAME, elementId ?:
34
+ throw AppiumException("Cannot set 'elementId' to null"))
35
+
36
+ fun initUriMapping(params: Map<String, String>) {
37
+ uriParams = params.toMutableMap()
38
+ }
39
+
40
+ fun getUriParameterValue(name: String): String? {
41
+ uriParams?.let {
42
+ return it[name]
43
+ }
44
+ return null
45
+ }
46
+
47
+ private fun setUriParameterValue(name: String, value: String) {
48
+ uriParams?.let {
49
+ it[name] = value
50
+ } ?: run {
51
+ uriParams = mutableMapOf(Pair(name, value))
52
+ }
53
+
54
+ }
55
+ }