You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metron.apache.org by ni...@apache.org on 2018/06/26 14:45:55 UTC
[3/5] metron git commit: METRON-1489 Retrofit UI tests to run
reliably during nightly QE runs (sardell via nickwallen) closes
apache/metron#1004
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