http://git-wip-us.apache.org/repos/asf/metron/blob/436cec43/metron-interface/metron-alerts/e2e/login/login.po.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/e2e/login/login.po.ts b/metron-interface/metron-alerts/e2e/login/login.po.ts index 8d37800..3e42395 100644 --- a/metron-interface/metron-alerts/e2e/login/login.po.ts +++ b/metron-interface/metron-alerts/e2e/login/login.po.ts @@ -24,43 +24,47 @@ export class LoginPage { } login() { - this.navigateToLogin(); - this.setUserNameAndPassword('admin', 'password'); - this.submitLoginForm(); - browser.waitForAngularEnabled(false); - browser.wait(function() {return element(by.css('.logout')).isPresent(); }); + return this.navigateToLogin() + .then(() => this.setUserNameAndPassword('admin', 'password')) + .then(() => this.submitLoginForm()) + .then(() => browser.waitForAngularEnabled(false)) + .then(() => waitForElementVisibility(element(by.css('.logout-link')))) + .then(() => browser.executeScript("document.body.className += ' notransition';")); } logout() { - browser.waitForAngularEnabled(false); - element.all(by.css('.alert .close')).click(); - element.all(by.css('.logout-link')).click(); - waitForURL('http://localhost:4200/login'); + return browser.waitForAngularEnabled(false) + .then(() => waitForElementVisibility(element(by.css('.logout-link')))) + .then(() => element(by.css('.logout-link')).click()) + .then(() => waitForURL('http://localhost:4200/login')); } setUserNameAndPassword(userName: string, password: string) { - element.all(by.css('input.form-control')).get(0).sendKeys(userName); - element.all(by.css('input.form-control')).get(1).sendKeys(password); + return waitForElementVisibility(element(by.css('[name=user]'))) + .then(() => waitForElementVisibility(element(by.css('[name=password]')))) + .then(() => element(by.css('[name=user]')).clear()) + .then(() => element(by.css('[name=user]')).sendKeys(userName)) + .then(() => element(by.css('[name=password]')).clear()) + .then(() => element(by.css('[name=password]')).sendKeys(password)); } submitLoginForm() { - return element.all(by.buttonText('LOG IN')).click(); + return element(by.buttonText('LOG IN')).click(); } getErrorMessage() { - browser.waitForAngularEnabled(false); let errElement = element(by.css('.login-failed-msg')); - return waitForElementVisibility(errElement).then(() => { - browser.sleep(1000); - return errElement.getText().then((message) => { - return message.replace(/\n/, '').replace(/LOG\ IN$/, ''); + return browser.waitForAngularEnabled(false) + .then(() => waitForElementVisibility(errElement)) + .then(() => { + browser.sleep(1000); + return errElement.getText().then((message) => { + return message.replace(/\n/, '').replace(/LOG\ IN$/, ''); }); }); } getLocation() { - return browser.getCurrentUrl().then(url => { - return url; - }); + return browser.getCurrentUrl(); } }
http://git-wip-us.apache.org/repos/asf/metron/blob/436cec43/metron-interface/metron-alerts/e2e/utils/clean_metron_update_table.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/e2e/utils/clean_metron_update_table.ts b/metron-interface/metron-alerts/e2e/utils/clean_metron_update_table.ts new file mode 100644 index 0000000..c6e99df --- /dev/null +++ b/metron-interface/metron-alerts/e2e/utils/clean_metron_update_table.ts @@ -0,0 +1,52 @@ +declare var Promise: any; +var chalk = require('chalk'); +var Client = require('ssh2').Client; +var errorMsg = ''; + +export function cleanMetronUpdateTable() { + return new Promise( + function (resolve, reject) { + resolve(); + // cleanupTable(resolve, reject); + } + ); +} + +function cleanupTable(resolve, reject) { + var conn = new Client(); + conn.on('ready', function() { + console.log(chalk.bold.green('Connected to node1 as root')); + conn.shell(function(err, stream) { + if (err) throw err; + stream.on('close', function() { + if (errorMsg.length > 0) { + console.log(chalk.bold.red('Error is:') + errorMsg); + console.log(chalk.red.bgBlack.bold('Unable to truncate metron_update table in HBase. Most likely reason is HBase is down !!!')); + reject(); + } else { + console.log(chalk.bold.green('Truncated metron_update table in HBase')); + resolve(); + } + conn.end(); + }).on('data', function(data) { + console.log('STDOUT: ' + data); + if (data.indexOf('ERROR') !== -1) { + errorMsg = data; + } + }).stderr.on('data', function(data) { + console.log('STDERR: ' + data); + }); + var comands = [ + 'echo \'truncate "metron_update"\' | /usr/hdp/current/hbase-master/bin/hbase shell', + 'exit', + '' + ]; + stream.end(comands.join('\r\n')); + }); + }).connect({ + host: 'node1', + port: 22, + username: 'root', + password: 'vagrant' + }); +} http://git-wip-us.apache.org/repos/asf/metron/blob/436cec43/metron-interface/metron-alerts/e2e/utils/e2e_util.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/e2e/utils/e2e_util.ts b/metron-interface/metron-alerts/e2e/utils/e2e_util.ts index 8ae1de1..9f9180c 100644 --- a/metron-interface/metron-alerts/e2e/utils/e2e_util.ts +++ b/metron-interface/metron-alerts/e2e/utils/e2e_util.ts @@ -1,7 +1,18 @@ -import { browser, protractor } from 'protractor'; +import { browser, protractor, by, element, ElementFinder } from 'protractor'; import request = require('request'); import fs = require('fs'); +export class UtilFun { + public static async waitForElementPresence(element: ElementFinder): Promise<void> { + let EC = protractor.ExpectedConditions; + await browser.wait( + EC.visibilityOf(element), + 10000, + `${element.locator()} was expected to be visible` + ); + } +} + export function changeURL(url: string) { return browser.get(url).then(() => { return browser.getCurrentUrl().then((newURL) => { @@ -15,56 +26,186 @@ export function waitForURL(url: string) { return browser.wait(EC.urlIs(url)); } -export function waitForText(element, text) { +export function waitForText(selector, text) { let EC = protractor.ExpectedConditions; - return browser.wait(EC.textToBePresentInElementValue(element, text)); + return browser.wait(EC.textToBePresentInElement(element(by.css(selector)), text)).catch((error) => console.log(`waitForText:`, error));; } export function waitForTextChange(element, previousText) { let EC = protractor.ExpectedConditions; - return browser.wait(EC.not(EC.textToBePresentInElement(element, previousText))); + if (previousText.trim().length === 0) { + return waitForNonEmptyText(element); + } + return browser.wait(EC.not(EC.textToBePresentInElement(element, previousText))).catch((error) => console.log(`${element.locator()} waitForTextChange:`, error)); } export function waitForElementInVisibility (_element ) { let EC = protractor.ExpectedConditions; - return browser.wait(EC.invisibilityOf(_element)); + return browser.wait(EC.invisibilityOf(_element)).catch((error) => console.log(`${_element.locator()} waitForElementInVisibility:`, error)); } export function waitForElementPresence (_element ) { let EC = protractor.ExpectedConditions; - return browser.wait(EC.presenceOf(_element)); + return browser.wait(EC.presenceOf(_element)).catch((error) => console.log(`${_element.locator()} waitForElementPresence:`, error)); } export function waitForElementVisibility (_element ) { let EC = protractor.ExpectedConditions; - return browser.wait(EC.visibilityOf(_element)); + return browser.wait(EC.visibilityOf(_element)).catch((error) => console.log(`${_element.locator()} waitForElementVisibility:`, error)); +} + +export function waitForElementPresenceAndvisbility(selector) { + let EC = protractor.ExpectedConditions; + return browser.wait(EC.visibilityOf(element(by.css(selector)))).catch((error) => console.log(`waitForElementPresenceAndvisbility: `, error)); } export function waitForStalenessOf (_element ) { let EC = protractor.ExpectedConditions; - return browser.wait(EC.stalenessOf(_element)); + return browser.wait(EC.stalenessOf(_element)).catch((error) => console.log(`${_element.locator()} waitForStalenessOf: `, error)); +} + +export function waitForCssClass(elementFinder, desiredClass) { + function waitForCssClass$(elementFinder, desiredClass) + { + return function () { + return elementFinder.getAttribute('class').then(function (classValue) { + return classValue && classValue.indexOf(desiredClass) >= 0; + }); + } + } + return browser.wait(waitForCssClass$(elementFinder, desiredClass)).catch((error) => console.log(`waitForCssClass:`, error)); +} + +export function waitForCssClassNotToBePresent(elementFinder, desiredClass) { + function waitForCssClassNotToBePresent$(elementFinder, desiredClass) + { + return function () { + return elementFinder.getAttribute('class').then(function (classValue) { + return classValue && classValue.indexOf(desiredClass) === -1; + }).catch((error) => console.log(`waitForCssClassNotToBePresent:`, error));; + } + } + return browser.wait(waitForCssClassNotToBePresent$(elementFinder, desiredClass)).catch((error) => console.log(`waitForCssClassNotToBePresent:`, error)); +} + +export function catchNoSuchElementError() { + return (err) => { + if (err.name === 'NoSuchElementError' || err.name === 'Error') { + return null; + } + throw err; + }; +} + +export function waitForNonEmptyTextAndGetText(elementFinder) { + function waitForNonEmptyText$(elementFinder) + { + return function () { + return elementFinder.getText().then(function (text) { + return text.trim().length > 0; + }).catch(catchNoSuchElementError()); + } + } + return browser.wait(waitForNonEmptyText$(elementFinder)) + .then(() => elementFinder.getText()) + .catch( catchNoSuchElementError()); +} + +export function waitForNonEmptyText(elementFinder) { + function waitForNonEmptyText$(elementFinder) + { + return function () { + return elementFinder.getText().then(function (text) { + return text.trim().length > 0; + }).catch(catchNoSuchElementError()); + } + } + return browser.wait(waitForNonEmptyText$(elementFinder)).catch(catchNoSuchElementError()); +} + +export function waitForElementCountGreaterThan(className, expectedCount) { + function waitForElementCountGreaterThan$() + { + return function () { + return element.all(by.css(className)).count().then(function (count) { + return count >= expectedCount; + }).catch((error) => console.log(`waitForElementCountGreaterThan:`, error));; + } + } + + return browser.wait(waitForElementCountGreaterThan$()).catch((error) => console.log(`waitForElementCountGreaterThan: `, error)); +} + +export function scrollIntoView(element, eleToTopBottom){ + return browser.executeScript(function(element, eleToTopBottom) { + element.scrollIntoView(eleToTopBottom); + }, element.getWebElement(), eleToTopBottom) + .catch((error) => console.log()); +} + +function promiseHandlerWithResponse(resolve, reject) { + return (response) => { + if (response && (response.statusCode === 200 || response.statusCode === 404)) { + resolve(); + } else { + console.log(response.statusCode); + reject(); + } + }; +} + +function promiseHandlerWithResponseAndBody(resolve, reject) { + return (error, response, body) => { + if (response && (response.statusCode === 200 || response.statusCode === 404)) { + resolve(); + } else { + reject(); + } + }; } export function loadTestData() { - deleteTestData(); - - let template = fs.readFileSync('e2e/mock-data/alerts_ui_e2e_index.template', 'utf8'); - request({ - url: 'http://node1:9200/_template/alerts_ui_e2e_index', - method: 'POST', - body: template - }, function(error, response, body) { - // add logging if desired + let deleteIndex = function () { + return new Promise((resolve, reject) => { + request.delete('http://node1:9200/alerts_ui_e2e_index*') + .on('response', promiseHandlerWithResponse(resolve, reject)); + }); + }; + + let createTemplate = function () { + return new Promise((resolve, reject) => { + let template = fs.readFileSync('e2e/mock-data/alerts_ui_e2e_index.template', 'utf8'); + request({ + url: 'http://node1:9200/_template/alerts_ui_e2e_index', + method: 'POST', + body: template + },promiseHandlerWithResponseAndBody(resolve, reject)); + }); + }; + + let loadData = function () { + return new Promise((resolve, reject) => { + let data = fs.readFileSync('e2e/mock-data/alerts_ui_e2e_index.data', 'utf8'); + request({ + url: 'http://node1:9200/alerts_ui_e2e_index/alerts_ui_e2e_doc/_bulk', + method: 'POST', + body: data + }, promiseHandlerWithResponseAndBody(resolve, reject)); + }) + }; + + return deleteIndex().then(() => createTemplate()).then(() => loadData(), reason => { + console.error( 'Load test data failed ', reason ); }); +} - let data = fs.readFileSync('e2e/mock-data/alerts_ui_e2e_index.data', 'utf8'); - request({ - url: 'http://node1:9200/alerts_ui_e2e_index/alerts_ui_e2e_doc/_bulk', - method: 'POST', - body: data - }, function(error, response, body) { - // add logging if desired - }); +export function reduce_for_get_all() { + return (acc, elem) => { + return elem.getText().then(function(text) { + acc.push(text); + return acc; + }).catch(e => console.log(e)); + }; } export function deleteTestData() { @@ -72,19 +213,29 @@ export function deleteTestData() { } export function createMetaAlertsIndex() { - deleteMetaAlertsIndex(); - - let template = fs.readFileSync('./../../metron-deployment/packaging/ambari/metron-mpack/src/main/resources/common-services/METRON/CURRENT/package/files/metaalert_index.template', 'utf8'); - request({ - url: 'http://node1:9200/_template/metaalert_index', - method: 'POST', - body: template - }, function(error, response, body) { - // add logging if desired + let deleteIndex = function () { + return new Promise((resolve, reject) => { + request.delete('http://node1:9200/metaalert_index*') + .on('response', promiseHandlerWithResponse(resolve, reject)); + }); + }; + + let createIndex = function () { + return new Promise((resolve, reject) => { + let template = fs.readFileSync('./../../metron-deployment/packaging/ambari/metron-mpack/src/main/resources/common-services/METRON/CURRENT/package/files/metaalert_index.template', 'utf8'); + request({ + url: 'http://node1:9200/_template/metaalert_index', + method: 'POST', + body: template + }, promiseHandlerWithResponseAndBody(resolve, reject)); + }); + }; + + return deleteIndex().then(() => createIndex(), reason => { + console.error( 'create Meta Alerts Index failed', reason ); }); } export function deleteMetaAlertsIndex() { request.delete('http://node1:9200/metaalert_index*'); -} - +} \ No newline at end of file