class test_run_command(Test_Helper): def setUp(self): super().setUp() self.lambda_name = 'osbot_aws.lambdas.dev.lambda_layer' self.aws_lambda = Lambda(self.lambda_name) ## helpers def layer_version_arn(self): package_name = 'requests' layer_name = package_name layer = Lambda_Layer(layer_name) if layer.exists() is False: self.result = layer.create_from_pip(package_name) return layer.latest().get('LayerVersionArn') ## tests def test_update(self): Deploy().deploy_lambda__gw_bot(self.lambda_name) def test_update_and_invoke(self): self.test_update() self.result = self.aws_lambda.invoke() def test_set_layers(self): layer_version_arn = self.layer_version_arn() self.aws_lambda.set_layers([layer_version_arn]) self.result = self.aws_lambda.update_lambda_configuration() #self.result = self.aws_lambda.info() def test_install_layer(self): self.aws_lambda.delete() self.test_update() self.test_set_layers() shell = self.aws_lambda.shell() self.result = shell.ls('/opt') def test_execute_command(self): code = """ import sys #sys.path.append('/opt') import requests result = requests.get('https://www.google.com/404').text """ shell = self.aws_lambda.shell() self.result = shell.python_exec(code)
class Test_Lambda_lambda_browser(Test_Helper): def setUp(self): super().setUp() self.lambda_name = 'osbot_browser.lambdas.lambda_browser' self.lambda_browser = Lambda(self.lambda_name) self.png_data = None def tearDown(self): super().tearDown() def _save_png_file(self, png_data): try: png_file = '/tmp/lambda_png_file.png' if png_data: with open(png_file, "wb") as fh: fh.write(base64.decodebytes(png_data.encode())) Dev.pprint("Png data with size {0} saved to {1}".format(len(png_data),png_file)) except Exception as error: Dev.print("[_save_png_file][Error] {0}".format(error)) Dev.print(png_data) def test_update_lambda(self): Deploy().setup().deploy_lambda__browser() def test_invoke_directly(self): result = run({},{}) assert result == '*Here are the `Browser_Commands` commands available:*' def test_invoke_directly_version(self): result = run({"params": ['version']},{}) assert result == Browser_Commands.current_version def test_invoke(self): payload ={ "params" : []} result = self.lambda_browser.invoke(payload) assert result == '*Here are the `Browser_Commands` commands available:*' def test_markdown(self): markdown = Misc.random_string_and_numbers(prefix='# Created from Lambda ... ') payload = {"params": ['markdown', markdown, " \n normal text"]} png_data = self.lambda_browser.invoke(payload) self._save_png_file(png_data) def test_screenshot(self): self.test_update_lambda() channel = None #'DRE51D4EM' url = 'https://www.google.co.uk' #url = 'https://news.bbc.co.uk/aaa' #url = 'https://www.whatismybrowser.com/' payload = {"params": ['screenshot','_'], 'data': {'channel':channel}} self.result = self.lambda_browser.invoke(payload) #print(self.lambda_browser.shell().reset()) print(self.lambda_browser.shell().list_processes()) #Dev.pprint(result) def test_invoke_shell_get_processes(self): shell = self.lambda_browser.shell() print() print(shell.list_processes()) def test_invoke_shell_get_event_logs(self): log_folder= '/tmp/event_logs' log_file = '2020-04-12__02-41-15__142417.json' shell = self.lambda_browser.shell() print() print(shell.ls(log_folder)) for log_file in shell.ls(log_folder).split('\n'): print() print(f'*****{log_file}*****') print(shell.file_contents(f'{log_folder}/{log_file}')) print() #print(shell.ls('/tmp/lambdas-dependencies')) #print(shell.ls('/tmp/lambdas-dependencies')) #"browser screenshot <https://www.google.com>", def test_invoke_shell_code(self): #self.test_update_lambda() code = """ from osbot_browser.browser.Browser_Lamdba_Helper import Browser_Lamdba_Helper from osbot_aws.Dependencies import load_dependencies from osbot_utils.utils.Files import Files browser_helper = Browser_Lamdba_Helper().setup() browser_helper.api_browser.sync__browser_width(1500) result = browser_helper.get_screenshot_png() """ shell = self.lambda_browser.shell() self.png_data = shell.python_exec(code) #print(shell.ls('/tmp')) #print(shell.file_contents('/tmp/browser-last_chrome_session.json')) #print(shell.list_processes()) def test_list(self): payload = {"params": ['list']} result = self.lambda_browser.invoke(payload) assert result == 'Here are the current examples files:' def test_lambda_status(self): payload = {"params": ['lambda_status']} result = self.lambda_browser.invoke(payload) assert result == 'Here are the current status of the `graph` lambda function' def test_render__bootstrap_cdn(self): payload = {"params": ['render','/examples/bootstrap-cdn.html',0,0,600,50]} png_data = self.lambda_browser.invoke(payload) self._save_png_file(png_data) def test_render__cup_of_tea(self): payload = {"params": ['render','examples/wardley_map/cup-of-tea.html']} png_data = self.lambda_browser.invoke(payload) self._save_png_file(png_data) # def test_invoke_directly_render(self): # png_data = run({"params": ['render','/']},{}) # self._save_png_file(png_data) def test_elk(self): payload = {"params": ['elk','dashboards']} png_data = self.lambda_browser.invoke(payload) #Dev.pprint(png_data) self._save_png_file(png_data) @unittest.skip('hangs on request') def test_elk__dashboard_project(self): payload = {"params": ['elk', 'dashboard_project','GSSP-126']} png_data = self.lambda_browser.invoke(payload) # Dev.pprint(png_data) self._save_png_file(png_data) def test_risks(self): #payload = {"params": ['render','gs/risk/risks-dashboard.html']} payload = { "params" : ['risks' , 'GSSP-115']} png_data = self.lambda_browser.invoke(payload) Dev.pprint(png_data) self._save_png_file(png_data) def test_go_js(self): #self.test_update_lambda() payload = {"params": ['go_js', 'graph_J2O', 'default']} png_data = self.lambda_browser.invoke(payload) Dev.pprint(png_data) def test_sow_view(self): #self.test_update_lambda() payload = {"params": ['sow', 'view', 'SOW-135']} png_data = self.lambda_browser.invoke(payload) Dev.pprint(png_data) @unittest.skip('needs fixing (api has moved since this test)') def test_graph(self): graph_name = 'graph_XKW' # 7 nodes graph_name = 'graph_MKF' # 20 nodes view_name = 'default' payload = {"params": ['graph', graph_name, view_name]} png_data = self.lambda_browser.update_with_src().invoke(payload) #Dev.pprint(png_data) self._save_png_file(png_data) def test_graph__view__node_label(self): graph_name = 'graph_XKW' # 7 nodes #graph_name = 'graph_VKN' # 20 nodes #graph_name = 'graph_YT4' # (199 nodes, 236 edges) #graph_name = 'graph_VZ5' # (367 nodes, 653 edges) view_name = 'node_label' label_key = 'Status' payload = {"params": ['graph', graph_name, view_name,label_key]} png_data = self.lambda_browser.invoke(payload) #Dev.pprint(png_data) self._save_png_file(png_data) def test_graph__graph_default(self): self.test_deploy() graph_name = 'graph_J2O' # 7 nodes view_name = 'default' payload = {"params": ['graph', graph_name, view_name]} #png_data = run(payload, {}) png_data = self.lambda_browser.invoke(payload) #Dev.pprint(png_data) self.result = png_data #self._save_png_file(png_data) # todo: fix: it is throwing '_AttributeError("\'NoneType\' object has no attribute \'get\'",)_') def test_table(self): payload = {"params": ['table','graph_MKF', 'graph']} png_data = self.lambda_browser.invoke(payload) Dev.pprint(png_data) self._save_png_file(png_data) def test_issue(self): payload = {"params": ['table','graph_MKF', 'issue']} png_data = self.lambda_browser.invoke(payload) Dev.pprint(png_data) self._save_png_file(png_data) def test_am_chars_time_line_via_lambda(self): data = [{"x": "1", "y": 1, "text": "[bold]2018 Q1[/]\nThere seems to be some furry animal living in the neighborhood.", "center": "bottom"}, { "x": "2", "y": 1, "text": "[bold]2018 Q2[/]\nWe're now mostly certain it's a fox.", "center": "top" }, { "x": "3", "y": 1, "text": "[bold]2018 Q3[/]\nOur dog does not seem to mind the newcomer at all.", "center": "bottom" }, { "x": "4", "y": 1, "text": "[bold]2018 Q4[/]\nThe quick brown fox jumps over the lazy dog.", "center": "top" }]; data = json.dumps(data).split(' ') payload = {'params': ['am_charts','aaa', 'timeline'] } payload.get('params').extend(data) #Deploy(self.lambda_name).deploy() self.png_data = self.lambda_browser.invoke(payload) def test_screenshot__settings_help(self): #self.test_update_lambda() #url = 'https://www.google.co.uk/aaaa' url = 'https://www.whatismybrowser.com/' url = 'http://glasswall.atlassian.net/' #url = 'chrome://settings/help' payload = {"params": ['screenshot', url,], 'data': {}} self.png_data = self.lambda_browser.invoke(payload) def test_viva_graph(self): self.test_update_lambda() payload = {"params": ['viva_graph','graph_5QQ', 'default']} self.result = self.lambda_browser.invoke(payload) def test_invoke_directly__screenshot___settings_help(self): url = 'https://www.whatismybrowser.com/' url = 'https://glasswall.atlassian.net' payload = {"params": ['screenshot', url, ], 'data': {}} self.png_data = run(payload, {}) #def use_upgraded_chromium_version(self): # updating this programatically didn't work, using the code below # # original version is 575458 # new_revision = '664010' # new_revision = '77812' # import pyppeteer # import pyppeteer.chromium_downloader # import os # original_version = pyppeteer.__chromium_revision__ # # os.environ['PYPPETEER_CHROMIUM_REVISION'] = new_revision # pyppeteer.__chromium_revision__ = new_revision # pyppeteer.chromium_downloader.REVISION = new_revision # #pyppeteer.chromium_downloader.downloadURLs = { # # 'linux': f'{downloads_folder}/{new_revision}/chrome-linux/chrome', # # 'mac' : f'{downloads_folder}/{new_revision}/chrome-mac/Chromium.app/Contents/MacOS/Chromium', # # 'win32': f'{downloads_folder}/{new_revision}/chrome-win32/chrome.exe', # # 'win64': f'{downloads_folder}/{new_revision}/chrome-win32/chrome.exe', # # } # from pathlib import Path # pyppeteer.chromium_downloader.chromiumExecutable["mac"] = Path(str(pyppeteer.chromium_downloader.chromiumExecutable["mac"]).replace(original_version, new_revision)) # pyppeteer.chromium_downloader.downloadURLs["mac"] = Path(str(pyppeteer.chromium_downloader.downloadURLs["mac"]).replace(original_version, new_revision)) # # so ended up changing these values directly on the source code # __chromium_revision__ = '575458' # v69 original one # __chromium_revision__ = '628590' # v74 # __chromium_revision__ = '664010' # v76 # __chromium_revision__ = '701274' # 79.0.3929 #__chromium_revision__ = '737645' # v82 latest def test_update_dependency(self): from osbot_aws.Dependencies import upload_dependency #pip_install_dependency('pyppeteer2') upload_dependency('pyppeteer2')
class test_browser_test(Test_Helper): def setUp(self): super().setUp() self.headless = True self.lambda_name = 'osbot_browser.lambdas.dev.browser_test' self.handler = run self.aws_lambda = Lambda(self.lambda_name) def test_invoke_directly(self): # confirm 'lambda_sheel is working ok assert run({ 'lambda_shell': { 'method_name': 'ping', 'auth_key': Lambda_Shell().get_lambda_shell_auth() } }) == 'pong' def test_lambda_invoke(self): params = { 'lambda_shell': { 'method_name': 'ping', 'auth_key': Lambda_Shell().get_lambda_shell_auth() } } self.result = self.aws_lambda.invoke(params) def test_update_lambda(self): # note this lambda needs python 3.7 , with 3.8 it fails with error: "while loading shared libraries: libnss3.so" self.result = Deploy(self.handler).deploy_lambda__browser_dev() def test_update_and_invoke(self): self.test_update_lambda() self.result = self.aws_lambda.invoke( {'url': 'https://www.google.com/'}) #self.png_data = self._lambda.invoke({}) def test_just_invoke(self): #payload = {'url': 'http://localhost:42195'} #payload = {'url': 'https://news.bbc.co.uk'} #payload = {} payload = {'url': 'https://www.google.com'} self.png_data = self.aws_lambda.invoke(payload) def test_invoke_shell_get_event_logs(self): print() print(self.aws_lambda.shell().ls('/tmp/event_log')) print(self.aws_lambda.shell().file_contents( '/tmp/event_log/2020-04-12__00-20-34__258152.json')) def test_invoke_shell_list_processes(self): print(self.aws_lambda.shell().list_processes()) print(self.aws_lambda.shell().disk_space()) print(self.aws_lambda.shell().ls('/tmp -la')) # for this to work run this command on the tests folder # pip3 install -t _lambda_dependencies/websocket websocket # GW-Bot/modules/OSBot-browser/_lambda_dependencies def test_upload_dependency(self): from osbot_aws.Dependencies import upload_dependency from osbot_aws.Dependencies import pip_install_dependency dependencies = ['websocket-client', 'syncer'] for dependency in dependencies: pip_install_dependency(dependency) result = upload_dependency(dependency) pprint(result)
class test_browser_test(Test_Helper): def setUp(self): super().setUp() self.headless = True self.lambda_name = 'osbot_browser.lambdas.dev.browser_test' self.handler = run self.aws_lambda = Lambda(self.lambda_name) def test_invoke_directly__lambda_shell(self): # confirm 'lambda_sheel is working ok assert run({ 'lambda_shell': { 'method_name': 'ping', 'auth_key': Lambda_Shell().get_lambda_shell_auth() } }) == 'pong' def test_invoke_directly__open_page(self): payload = { 'url': 'https://news.bbc.co.uk', 'headless': False, 'delay': 0, 'js_code': "document.querySelectorAll('a') " " .forEach((a)=> " " { " " a.outerHTML = '<h2>CHANGED via JS<h2>'" " })" } #payload = {'url': 'https://www.google.com/', 'headless' : False } self.png_data = run(payload) def test_lambda_invoke(self): params = { 'lambda_shell': { 'method_name': 'ping', 'auth_key': Lambda_Shell().get_lambda_shell_auth() } } self.result = self.aws_lambda.invoke(params) def test_update_lambda(self): # note this lambda needs python 3.7 , with 3.8 it fails with error: "while loading shared libraries: libnss3.so" self.result = Deploy(self.handler).deploy_lambda__browser_dev() def test_update_and_invoke(self): self.test_update_lambda() self.png_data = self.aws_lambda.invoke( {'url': 'https://www.google.com/'}) def test_just_invoke(self): payload = {'url': 'https://news.bbc.co.uk', 'delay': 2} #payload = {'url': 'https://www.google.com/404'} self.png_data = self.aws_lambda.invoke(payload) def test_invoke_on_lambda__exec_js(self): payload = { 'url': 'https://news.bbc.co.uk', 'headless': True, 'delay': 0, 'js_code': "document.querySelectorAll('a') " " .forEach((a)=> " " { " " a.outerHTML = '<h2>CHANGED via JS<h2>'" " })" } self.png_data = self.aws_lambda.invoke(payload) def test_invoke_shell_get_event_logs(self): print() print(self.aws_lambda.shell().ls('/tmp/event_log')) print(self.aws_lambda.shell().file_contents( '/tmp/event_log/2020-04-12__00-20-34__258152.json')) def test_invoke_shell_list_processes(self): print(self.aws_lambda.shell().list_processes()) print(self.aws_lambda.shell().disk_space()) print(self.aws_lambda.shell().ls('/tmp -la')) # for this to work run this command on the tests folder # pip3 install -t _lambda_dependencies/websocket websocket # GW-Bot/modules/OSBot-browser/_lambda_dependencies def test_upload_dependency(self): from osbot_aws.Dependencies import upload_dependency from osbot_aws.Dependencies import pip_install_dependency dependencies = ['websocket-client', 'syncer'] for dependency in dependencies: pip_install_dependency(dependency) result = upload_dependency(dependency) pprint(result)
class test_Chrome_in_Lambda(Test_Helper): def setUp(self): super().setUp() self.lambda_name = 'osbot_browser.lambdas.dev.lambda_shell' self._lambda = Lambda(self.lambda_name) def test_update_lambda(self): self.result = Deploy().deploy_lambda__browser_dev(self.lambda_name) #@trace(include=['osbot*', 'boto*']) def test_reset_lambda(self): self.result = self._lambda.shell().reset() def test_update_and_invoke(self): code = """ from osbot_aws.Dependencies import load_dependencies load_dependencies('pyppeteer2') from osbot_browser.chrome.Chrome_Sync import Chrome_Sync chrome = Chrome_Sync().keep_open() chrome.browser() #result = chrome.open('https://news.google.com').url() #from osbot_utils.utils.Misc import bytes_to_base64 #result = bytes_to_base64(chrome.screenshot()) result = chrome.chrome.chrome_setup.connect_method() """ self.test_update_lambda() #self.test_reset_lambda() self.result = self._lambda.shell().python_exec(code) def test_update_and_invoke__test(self): code = """ from osbot_aws.Dependencies import load_dependencies load_dependencies('pyppeteer2,websocket-client') from osbot_browser.chrome.Chrome import Chrome #chrome = Chrome().keep_open() #from osbot_utils.utils.Http import GET #result = GET('http://127.0.0.1:54433') #result = chrome.get_last_chrome_session() #browser = chrome.sync_browser() # launch it #browser = Chrome().keep_open().sync_browser() # attach #result = chrome.connect_method() from osbot_utils.decorators.Sync import sync @sync async def local_chrome(): from osbot_browser.chrome.Chrome import Chrome from pyppeteer import connect, launch from osbot_utils.utils.Http import GET chrome = Chrome().keep_open() url_chrome = chrome.get_last_chrome_session().get('url_chrome') #"ws://127.0.0.1:51059/devtools/browser/b2f81e97-78e6-417d-9487-4678b9b94121" # "ws://127.0.0.1:51059/devtools/browser/b2f81e97-78e6-417d-9487-4678b9b94121" #return url_chrome url = "http://127.0.0.1:51059/json/version" #return GET(url) await connect({'browserWSEndpoint': url_chrome}) return port_is_open(url_chrome) await chrome.browser_connect() return chrome.connect_method() chrome = Chrome()#.keep_open() chrome.sync_browser() result = chrome.connect_method() # Chrome().keep_open().sync__setup_browser() # Chrome().keep_open().sync__setup_browser() #.sync_browser() #result = local_chrome() # @sync # async def version(): # from osbot_browser.chrome.Chrome import Chrome # return await Chrome().keep_open().version() # chrome = Chrome() # await chrome.browser() # return chrome.chrome_executable() # #'HeadlessChrome/67.0.3361.0' # # result = version() """ #self.test_update_lambda() self.result = self._lambda.shell().python_exec(code) #def test_get_browser_version(self): #'https://www.whatismybrowser.com/' # test running webserver in Lambda def test_run_webserver_in_lambda(self): #self._lambda.shell().reset() #self.test_update_lambda() code = """ from osbot_aws.Dependencies import load_dependencies load_dependencies('pyppeteer,websocket-client') from osbot_browser.chrome.Chrome import Chrome chrome = Chrome() load_dependencies('requests') from osbot_browser.browser.Web_Server import Web_Server from osbot_utils.utils.Misc import bytes_to_base64 chrome.sync__setup_browser() #page = chrome.sync_page() #web_server = Web_Server() #web_server.port = 1234 #web_server.start() #with Web_Server() as web_server: #chrome.sync_open(web_server.url()) chrome.sync_open('http://localhost:1234/') result = bytes_to_base64(chrome.sync_screenshot()) # # chrome.sync_open('https://www.google.com') # bytes = chrome.sync_screenshot() # import base64 # result = base64.b64encode(bytes).decode() # #result = chrome.sync_url() """ self.png_data = self._lambda.shell().python_exec(code) def test_invoke_shell_commands(self): shell = self.result = self._lambda.shell() #self.result = shell.ls('/tmp') print('-----') print(shell.ps()) #self.result = shell.memory_usage() print(shell.list_processes())
class test_jira_web(Test_Helper): def setUp(self): super().setUp() self.png_data = None self.result = None self.aws_lambda = Lambda('osbot_browser.lambdas.jira_web') def test_update_lambda(self): Deploy().setup().deploy_lambda__browser( 'osbot_browser.lambdas.jira_web') # def test_update_lambda_code(self): # from gw_bot.setup.OSBot_Setup import OSBot_Setup # OSBot_Setup().lambda_package('osbot_browser.lambdas.jira_web').aws_lambda.reset() def test_invoke_directly(self): issue_id = 'VP-2' payload = { 'issue_id': issue_id, 'headless': False } #'channel': 'DRE51D4EM' , 'delay': 0} self.result = run(payload, {}) def test_invoke_lambda(self): self.test_update_lambda() payload = {} self.png_data = self.aws_lambda.invoke(payload) def test_invoke_lambda__screenshot(self): self.test_update_lambda() issue_id = 'VP-1' #payload = {'issue_id': issue_id, 'channel': 'DRE51D4EM', 'delay': 6} payload = { 'issue_id': issue_id, } self.png_data = self.aws_lambda.invoke(payload) def test_invoke(self): #self.test_update_lambda() issue_id = 'PERSON-42' payload = { 'issue_id': issue_id, #'channel': 'DRE51D4EM' , # gwbot 'width': 1200, 'height': 300, 'wait': 2 } self.png_data = self.aws_lambda.invoke(payload) def test_invoke_shell(self): self.test_update_lambda() shell = self.aws_lambda.shell() print(shell.list_processes()) print(shell.disk_space()) print(shell.ls('/tmp -la')) def test_invoke_shell_code(self): #self.test_update_lambda() shell = self.aws_lambda.shell() code = """ from osbot_browser.browser.sites.Web_Jira import Web_Jira web_jira = Web_Jira().setup() #path="/rest/helptips/1.0/tips" path = '/login.jsp?os_destination=/rest/helptips/1.0/tips' #web_jira.open(path) #web_jira.open("/") #web_jira.login() #web_jira.page.open('https://www.google.com') #web_jira.page.open('https://glasswall.atlassian.net/secure/Dashboard.jspa') #result=web_jira.screenshot() result=web_jira.page.url() #from osbot_browser.browser.Browser_Lamdba_Helper import Browser_Lamdba_Helper #Browser_Lamdba_Helper(headless=True).setup() #from osbot_utils.utils.Files import file_contents # Browser_Lamdba_Helper().load_browser_dependencies() # # from osbot_browser.browser.API_Browser import API_Browser # api_browser = API_Browser() # api_browser.sync__setup_browser() # api_browser.sync__open('https://www.google.com/') # # result = api_browser.sync__screenshot_base64() #result='here' """ #self.png_data = shell.python_exec(code) self.result = shell.python_exec(code) print(shell.disk_space()) print(shell.ls('/tmp -la')) def test_send_to_slack(self): team_id = None channel = 'DRE51D4EM' issue_id = 'Person-42' png_data = "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8" \ "/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" from osbot_browser.browser.Browser_Lamdba_Helper import Browser_Lamdba_Helper title = "Issue: {0}".format(issue_id) Browser_Lamdba_Helper().send_png_data_to_slack(team_id, channel, title, png_data)