Best JavaScript code snippet using storybook-root
port.in.jsx
Source:port.in.jsx
1import AppConfig from 'AppConfig';2import {3 FORMAT_INTERNATIONAL_SWEDISH_MOBILE_REGEX,4 FORMAT_LOCAL_SWEDISH_MOBILE_REGEX5} from '@selfcare/core/constants/subscriber';6import { addBusinessDays, subtractBusinessDays, today } from '@selfcare/core/helpers/date.helper';7import { CODES } from '@selfcare/core/redux/metadata/codes/codes.constants';8import { OFFERING_STATUS } from '@selfcare/core/redux/subscriberOfferings/subscriber.offering.constants';9import { SUPPORT_REQUEST } from '@selfcare/core/redux/supportRequest/support.request.constants';10/* eslint-disable import/no-duplicates */11import format from 'date-fns/format';12import isBefore from 'date-fns/is_before';13import addDays from 'date-fns/add_days';14import differenceInDays from 'date-fns/difference_in_days';15/* eslint-enable import/no-duplicates */16import PropTypes from 'prop-types';17import compose from 'ramda/src/compose';18import isEmpty from 'ramda/src/isEmpty';19import path from 'ramda/src/path';20import pathOr from 'ramda/src/pathOr';21import React, { useEffect, useState } from 'react';22import { withI18n } from 'react-i18next';23import { withRouter } from 'react-router';24import FilledButton from 'selfcare-ui/src/components/button/filled.button';25import OutlineButton from 'selfcare-ui/src/components/button/outline.button';26import Heading from 'selfcare-ui/src/components/heading/heading';27import Input from 'selfcare-ui/src/components/input/input';28import InputField from 'selfcare-ui/src/components/inputField/input.field';29import Link from 'selfcare-ui/src/components/link/link';30import LoadingIndicator from 'selfcare-ui/src/components/loadingIndicator/loading.indicator';31import Notice from 'selfcare-ui/src/components/notice/notice';32import Paragraph from 'selfcare-ui/src/components/paragraph/paragraph';33import { DECISION_TYPE } from '../../../../constants/order.constants';34import LocaleKeys from '../../../../locales/keys';35import DatePicker from '../../../datePicker/date.picker';36import PageContent from '../../../pageContent/page.content';37import { SetupApiDataFromForm } from '../../../supportRequest/support.request.helpers';38import { getContextPageObject } from '../../../../helpers/inaccount.help.helpers';39import { navigateToProducts } from '../manage.product.helper';40import '../manage.product.scss';41import { PortInConstants, PORTIN_VALUES } from './port.in.constants';42const PortIn = ({ cancelPortInRequest, createSupportRequest, searchSupportRequest, history, isHandlingProductAction, isPortInNumberInvalid,43 portInNumberAdditionalPropertyValueId, portInCurrentMSISDNField, portInDateField, portInIsLoading, portInNumber, portInPortToMSISDNField, portInSsn, productIdentifier,44 recentlyClosedPortInRequest, recentlyNewOrOpenPortInRequest, retrieveCodes, retrieveProductMetadata, selectedProduct,45 subscriberSSN, t, updateAttributeValue, updateCustomPortInNumber, updatePortInRequest,46 validatedPortInDateField, offeringContextsByInstanceId, activeOfferInstanceId, validatePortInDate, setContextPageData }) => {47 const [currentPortInFlow, setCurrentPortInFlow] = useState(null);48 const [portInNumberValue, setPortInNumberValue] = useState(portInNumber.value || '');49 const [portInNumberClosed, setPortInNumberValueClosed] = useState('');50 const [portInDateFromCase, setPortInDateFromCase] = useState(addBusinessDays(today(), PORTIN_VALUES.DEFAULT));51 const [portInDate, setPortInDate] = useState(addBusinessDays(today(), PORTIN_VALUES.DEFAULT));52 const [initialPortInUpdateDate, setInitialPortInUpdateDate] = useState(addBusinessDays(today(), PORTIN_VALUES.DEFAULT));53 const [portInWasUpdated, setPortInWasUpdated] = useState(false);54 const [isPortInDisabled, setIsPortInDisabled] = useState(false);55 const hasOpenPortInRequest = recentlyNewOrOpenPortInRequest && !recentlyClosedPortInRequest;56 const mobileNumberPortType = AppConfig.MOBILE_NUMBER_PORT;57 useEffect(() => {58 if (productIdentifier && !isEmpty(offeringContextsByInstanceId) && !isEmpty(offeringContextsByInstanceId[activeOfferInstanceId])) {59 retrieveProductMetadata(productIdentifier);60 }61 }, [productIdentifier, retrieveProductMetadata, offeringContextsByInstanceId, activeOfferInstanceId]);62 useEffect(() => {63 setContextPageData(getContextPageObject(3, 'portin'));64 }, [setContextPageData]);65 useEffect(() => {66 retrieveCodes(CODES.Regex);67 retrieveCodes(CODES.FormControlType);68 }, [retrieveCodes]);69 useEffect(() => {70 const isPortInWithinOneBusinessDay = !isBefore(addBusinessDays(today(), 1), portInDate);71 const portInDisabled = selectedProduct.status === OFFERING_STATUS.PENDING_ACTIVE || isPortInWithinOneBusinessDay;72 setIsPortInDisabled(portInDisabled);73 }, [portInDate, selectedProduct.status]);74 useEffect(() => {75 const foundValidatedPortInDateField = pathOr([], ['AdditionalPropertyValues'], recentlyNewOrOpenPortInRequest).filter((obj) => (76 obj.Id === validatedPortInDateField.id));77 const foundValidatedPortInDate = foundValidatedPortInDateField[0] ? foundValidatedPortInDateField[0].Value : '';78 const portInNumberFieldClosed = pathOr([], ['AdditionalPropertyValues'], recentlyClosedPortInRequest).filter((obj) => (79 obj.Id === portInNumberAdditionalPropertyValueId));80 const portInNumberClosed = portInNumberFieldClosed[0] ? portInNumberFieldClosed[0].Value : '';81 portInNumberClosed && setPortInNumberValue('');82 setPortInNumberValueClosed(portInNumberClosed);83 if (hasOpenPortInRequest && foundValidatedPortInDate === '12/30/9999') {84 setCurrentPortInFlow(PortInConstants.PORT_IN_CANCEL_PENDING);85 } else if (hasOpenPortInRequest) {86 setCurrentPortInFlow(PortInConstants.PORT_IN_RESPONSE);87 const foundPortInNumberField = recentlyNewOrOpenPortInRequest.AdditionalPropertyValues.filter((obj) => (88 obj.Id === portInPortToMSISDNField.id));89 const foundPortInDateField = recentlyNewOrOpenPortInRequest.AdditionalPropertyValues.filter((obj) => (90 obj.Id === portInDateField.id));91 const foundPortInDateFieldUpdate = recentlyNewOrOpenPortInRequest.AdditionalPropertyValues.filter((obj) => (92 obj.Id === AppConfig.PORT_IN_DATE_ATTRIBUTE_ID.toString()));93 const foundPortInNumberValue = foundPortInNumberField[0] ? foundPortInNumberField[0].Value : '';94 const foundPortInDateValue = foundPortInDateField[0] ? foundPortInDateField[0].Value : '';95 const foundPortInDateValueUpdate = foundPortInDateFieldUpdate[0] ? foundPortInDateFieldUpdate[0].Value : '';96 setPortInNumberValue(foundPortInNumberValue.replace(FORMAT_LOCAL_SWEDISH_MOBILE_REGEX.pattern, FORMAT_LOCAL_SWEDISH_MOBILE_REGEX.replace),);97 setPortInDateFromCase(foundPortInDateValue);98 const endDatepickerDate = addDays(new Date(today()), PORTIN_VALUES.MAX + PORTIN_VALUES.MIN);99 const daysToAdd = differenceInDays(endDatepickerDate, addBusinessDays(foundPortInDateValueUpdate, 1)) > 0 ? 1 : -1;100 setInitialPortInUpdateDate(addBusinessDays(foundPortInDateValueUpdate, daysToAdd));101 setPortInDate(foundPortInDateValue);102 } else {103 setCurrentPortInFlow(PortInConstants.ENTER_NUMBER);104 }105 }, [hasOpenPortInRequest, portInDateField.id, portInPortToMSISDNField.id, recentlyNewOrOpenPortInRequest, recentlyClosedPortInRequest, validatedPortInDateField.id, portInNumberAdditionalPropertyValueId]);106 const handleUpdatePortInNumber = (event) => {107 const { target: { value } } = event;108 portInNumberClosed ?109 setPortInNumberValueClosed(value):110 setPortInNumberValue(value);111 updateCustomPortInNumber(value);112 };113 const handleValidatePortInNumber = (event) => {114 updateCustomPortInNumber(event.target.value);115 };116 const submitPortIn = async () => {117 const portinNumberToSend = portInNumberClosed || portInNumberValue;118 updateAttributeValue(DECISION_TYPE.QUANTITY, portInNumber.optionId, portInNumber.id, portInNumberValue, true, portInNumber.displayOrder);119 const values = {120 [SUPPORT_REQUEST.DESCRIPTION]: selectedProduct.offeringInstanceId,121 [portInCurrentMSISDNField.id]: selectedProduct.serviceIdentifier,122 [portInPortToMSISDNField.id]: portinNumberToSend.replace(FORMAT_INTERNATIONAL_SWEDISH_MOBILE_REGEX.pattern, FORMAT_INTERNATIONAL_SWEDISH_MOBILE_REGEX.replace),123 [portInSsn.id]: subscriberSSN,124 [portInDateField.id]: format(portInDate, 'YYYY-MM-DD')125 };126 const productInventoryItem = path(['inventoryItem', 'Id'], selectedProduct);127 if (productInventoryItem) {128 values[SUPPORT_REQUEST.INVENTORY_ITEM] = productInventoryItem;129 }130 const portInRequestData = SetupApiDataFromForm(values, mobileNumberPortType, mobileNumberPortType);131 await createSupportRequest(portInRequestData);132 setCurrentPortInFlow(PortInConstants.PORT_IN_RESPONSE);133 };134 const cancelPortIn = async () => {135 await cancelPortInRequest(recentlyNewOrOpenPortInRequest.Id.Value, selectedProduct.offeringInstanceId);136 setCurrentPortInFlow(PortInConstants.PORT_IN_CANCEL_PENDING);137 };138 const updatePortIn = async () => {139 await updateAttributeValue(DECISION_TYPE.QUANTITY, portInNumber.optionId, portInNumber.id, portInNumberValue, true, portInNumber.displayOrder);140 await updatePortInRequest(recentlyNewOrOpenPortInRequest.Id.Value, selectedProduct.offeringInstanceId, portInDate);141 setPortInDateFromCase(format(portInDate, 'YYYY-MM-DD'));142 setPortInWasUpdated(true);143 setCurrentPortInFlow(PortInConstants.PORT_IN_RESPONSE);144 };145 useEffect(() => {146 searchSupportRequest();147 }, [searchSupportRequest]);148 const setupViewFromFlow = () => {149 switch (currentPortInFlow) {150 case PortInConstants.ENTER_NUMBER:151 return {152 heading: t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER),153 content: (154 <>155 {(recentlyClosedPortInRequest && !recentlyClosedPortInRequest.successful) && (156 <Notice157 className="c-manage-product__notice"158 type="error"159 heading={160 t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_RESPONSE_HEADER, {161 portFrom: portInNumberClosed || portInNumberValue162 })163 }164 >165 <Paragraph>166 {t(`${LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_RESPONSE_PREFIX}${recentlyClosedPortInRequest.messageCode}`)}167 </Paragraph>168 </Notice>169 )}170 {(recentlyClosedPortInRequest && recentlyClosedPortInRequest.successful && (recentlyClosedPortInRequest.responseMessage !== 'CANCELLED')) ? (171 <Notice172 className="c-manage-product__notice"173 type="success"174 heading={175 t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_RESPONSE_HEADER, {176 portFrom: portInNumber.value177 })178 }179 >180 <Paragraph>181 {t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_SUCCESS_BODY)}182 </Paragraph>183 </Notice>184 ) : (185 <Paragraph className="c-manage-product__description">186 {t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_DESCRIPTION)}187 </Paragraph>188 )}189 <InputField190 error={isPortInNumberInvalid ? t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_ERROR) : null}191 labelText={t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_CHOOSE)}192 info={t(LocaleKeys.SHOP.ENTER_PORT_IN_HINT)}193 required194 input={(195 <Input196 id="port-in"197 type="tel"198 onChange={handleUpdatePortInNumber}199 onBlur={handleValidatePortInNumber}200 size="full"201 value={portInNumberClosed || portInNumberValue}202 />203 )}204 />205 <DatePicker206 id="portInDate"207 initialValue={new Date(portInDate)}208 labelText={t(LocaleKeys.PRODUCTS.SETTINGS.PORT_DATE_CHOOSE)}209 onDayChange={(day) => {210 setPortInDate(day);211 }}212 maxDays={PORTIN_VALUES.MAX}213 minDays={PORTIN_VALUES.MIN}214 size="large"215 />216 <div className="c-manage-product__button-actions">217 <OutlineButton218 className="c-manage-product__primary-action c-button-double"219 onClick={() => navigateToProducts(history)}220 >221 {t(LocaleKeys.CANCEL)}222 </OutlineButton>223 <FilledButton224 className="c-manage-product__primary-action c-button-double"225 disabled={isPortInNumberInvalid}226 onClick={submitPortIn}227 >228 {t(LocaleKeys.SUBMIT)}229 </FilledButton>230 </div>231 </>232 )233 };234 case PortInConstants.PORT_IN_UPDATE:235 return {236 heading: t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER),237 content: (238 <>239 <Paragraph className="c-manage-product__description">240 {t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_UPDATE_PROMPT, {241 portInDate: portInDateFromCase242 })}243 </Paragraph>244 <div className="c-manage-product__section-data">245 <div>246 <Heading className="c-manage-product__section-header" category="minor" tone="normal">{t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_PENDING_NUMBER_LABEL)}</Heading>247 <Heading category="minor" tone="normal">{portInNumberValue}</Heading>248 </div>249 </div>250 <div className="c-manage-product__date-input">251 <DatePicker252 id="portInDate"253 initialValue={new Date(initialPortInUpdateDate)}254 isPortInUpdateDate={subtractBusinessDays(initialPortInUpdateDate, 1)}255 labelText={t(LocaleKeys.PRODUCTS.SETTINGS.PORT_DATE_CHOOSE)}256 onDayChange={(day) => {257 setPortInDate(day);258 }}259 maxDays={PORTIN_VALUES.MAX}260 minDays={PORTIN_VALUES.MIN}261 size="large"262 />263 </div>264 <div className="c-manage-product__button-actions">265 <OutlineButton266 className="c-manage-product__secondary-action c-button-double"267 onClick={() => setCurrentPortInFlow(PortInConstants.PORT_IN_RESPONSE)}268 >269 {t(LocaleKeys.CANCEL)}270 </OutlineButton>271 <FilledButton272 className="c-manage-product__primary-action c-button-double"273 disabled={isPortInNumberInvalid}274 onClick={updatePortIn}275 >276 {t(LocaleKeys.SUBMIT)}277 </FilledButton>278 </div>279 <div className="c-manage-product__update-return">280 <Link281 className="c-manage-product__secondary-action"282 onClick={() => setCurrentPortInFlow(PortInConstants.PORT_IN_CANCEL)}283 >284 {t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_PENDING_CANCEL)}285 </Link>286 </div>287 </>288 )289 };290 case PortInConstants.PORT_IN_RESPONSE:291 return {292 heading: t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER),293 content: (294 <>295 {portInWasUpdated && (296 <Notice297 className="c-manage-product__port-in-disclaimer"298 type="success"299 heading={t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_UPDATE_SUCCESS_NOTIFICATION)}300 />301 )}302 <Paragraph className="c-manage-product__pending-description">303 {t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_PENDING)}304 </Paragraph>305 <div className="c-manage-product__section-data">306 <div className="c-manage-product__section-data-container">307 <Heading className="c-manage-product__section-header" category="minor" tone="normal">{t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_PENDING_NUMBER_LABEL)}</Heading>308 <Heading category="minor" tone="normal">{portInNumberValue}</Heading>309 </div>310 <div className="c-manage-product__section-data-container">311 <Heading className="c-manage-product__section-header" category="minor" tone="normal">{t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_PENDING_DATE_LABEL)}</Heading>312 <Heading category="minor" tone="normal">{format(portInDateFromCase, 'YYYY-MM-DD')}</Heading>313 </div>314 </div>315 {(!isPortInDisabled && validatePortInDate) && (316 <div className="c-manage-product__button-actions pending-port-in">317 <div className="action">318 <FilledButton319 className="c-manage-product__primary-action"320 onClick={() => setCurrentPortInFlow(PortInConstants.PORT_IN_UPDATE)}321 >322 {t(LocaleKeys.PRODUCTS.SETTINGS.CHANGE)}323 </FilledButton>324 </div>325 <div className="action">326 <Link327 onClick={() => setCurrentPortInFlow(PortInConstants.PORT_IN_CANCEL)}328 >329 {t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_PENDING_CANCEL)}330 </Link>331 </div>332 </div>333 )}334 </>335 )336 };337 case PortInConstants.PORT_IN_CANCEL:338 return {339 heading: t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER),340 content: (341 <>342 <Paragraph className="c-manage-product__pending-description">343 {t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_CANCEL_HEADER)}344 </Paragraph>345 <div className="c-manage-product__button-actions">346 <OutlineButton347 className="c-manage-product__primary-action c-button-double"348 onClick={() => setCurrentPortInFlow(PortInConstants.PORT_IN_RESPONSE)}349 >350 {t(LocaleKeys.CANCEL)}351 </OutlineButton>352 <FilledButton353 className="c-manage-product__primary-action c-button-double"354 disabled={isPortInDisabled}355 onClick={cancelPortIn}356 >357 {t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_CANCEL_CONFIRM_LABEL)}358 </FilledButton>359 </div>360 </>361 )362 };363 case PortInConstants.PORT_IN_CANCEL_PENDING:364 return {365 heading: t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER),366 content: (367 <>368 <Paragraph className="c-manage-product__pending-description">369 {t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER_CANCEL_PENDING)}370 </Paragraph>371 <div className="c-manage-product__button-actions">372 <FilledButton373 className="c-manage-product__primary-action c-button-double"374 onClick={() => navigateToProducts(history)}375 >376 {t(LocaleKeys.BACK)}377 </FilledButton>378 </div>379 </>380 )381 };382 default:383 return {384 heading: t(LocaleKeys.PRODUCTS.SETTINGS.PORT_NUMBER),385 content: (386 <div>387 <LoadingIndicator isLoading />388 </div>389 )390 };391 }392 };393 const view = setupViewFromFlow();394 return (395 <PageContent>396 <div className="c-manage-product c-loading-indicator-containment">397 <LoadingIndicator isLoading={isHandlingProductAction || portInIsLoading} />398 <Heading category="brand" tone="normal">399 {view.heading}400 </Heading>401 {view.content}402 </div>403 </PageContent>404 );405};406PortIn.displayName = 'PortIn';407PortIn.propTypes = {408 /** Action to cancel the port-in request. */409 cancelPortInRequest: PropTypes.func.isRequired,410 /** Function to be called on submission of the support request form to create the request */411 createSupportRequest: PropTypes.func,412 /** The action to trigger when populating the list for support requests */413 searchSupportRequest: PropTypes.func.isRequired,414 /** [[IgnoreDoc]] History instance provided by react-router */415 history: PropTypes.object.isRequired,416 /** Flag for when a product action is being utilized and the loading indicator should be triggered. */417 isHandlingProductAction: PropTypes.bool.isRequired,418 /** Whether the port in number is invalid or not. */419 isPortInNumberInvalid: PropTypes.bool,420 /** Current MSISDN Field information for creation of new port in case. */421 portInCurrentMSISDNField: PropTypes.shape({422 id: PropTypes.string423 }),424 /** Port in Date Field */425 portInDateField: PropTypes.object,426 /** Port in values after an port in support request is closed */427 portInNumberAdditionalPropertyValueId: PropTypes.string,428 /** Port in number */429 portInNumber: PropTypes.object,430 /** Whether the port in actions are loading or not. */431 portInIsLoading: PropTypes.bool.isRequired,432 /** New MSISDN Field information for creation of new port in case. */433 portInPortToMSISDNField: PropTypes.object,434 /** Port in SSN */435 portInSsn: PropTypes.object,436 /** Product Identifier */437 productIdentifier: PropTypes.number,438 /** Recent Closed Port In Request */439 recentlyClosedPortInRequest: PropTypes.shape({440 /** Response message for closed port in request */441 responseMessage: PropTypes.string,442 /** Message code for closed port in request */443 messageCode: PropTypes.string,444 /** successful flag for closed port in request */445 successful: PropTypes.bool446 }),447 /** Recent Port in Request */448 recentlyNewOrOpenPortInRequest: PropTypes.shape({449 Id: PropTypes.object,450 AdditionalPropertyValues: PropTypes.arrayOf(PropTypes.object)451 }),452 /** Action to fetch metadata */453 retrieveCodes: PropTypes.func.isRequired,454 /** Retrieve Product Metadata */455 retrieveProductMetadata: PropTypes.func.isRequired,456 /** Selected product to perform actions against. */457 selectedProduct: PropTypes.shape({458 /** Offering Id */459 offeringId: PropTypes.string,460 /** Offering Instance Id */461 offeringInstanceId: PropTypes.string,462 /** Display Name */463 displayName: PropTypes.string,464 /** Flag to determine if a use can opt out of the renewal at the end of the billing cycle. */465 canOptOutOnRenew: PropTypes.bool,466 /** Currency Code */467 currencyCode: PropTypes.string,468 /** Billing object on the offer */469 billing: PropTypes.shape({470 /** Next charge date for the offer */471 nextChargeDate: PropTypes.string472 }),473 /** Bool for product having first usage */474 hasFirstUsage: PropTypes.bool,475 /** The selected option Id on the primary decision. */476 hasPrimaryOption: PropTypes.string,477 /** Bool for product being broadband */478 isBroadband: PropTypes.bool,479 /** Bool for product being penny play */480 isPennyPlay: PropTypes.bool,481 /** Flag to tell us if the product is wireless */482 isWireless: PropTypes.bool,483 /** Marketing Template object to be used to render upgrade /downgrade */484 marketingTemplate: PropTypes.shape({}),485 /** Options */486 options: PropTypes.array,487 /** Right to Return */488 rightToReturn: PropTypes.bool,489 /** Service Identifier for the product. Also called the phone number. */490 serviceIdentifier: PropTypes.string,491 /** Status of the product */492 status: PropTypes.number,493 intentToPort: PropTypes.bool494 }),495 /** SSN of subscriber */496 subscriberSSN: PropTypes.string.isRequired,497 /** [[IgnoreDoc]] Translate function provided by react-i18next */498 t: PropTypes.func.isRequired,499 /** Function to update the attribute value */500 updateAttributeValue: PropTypes.func.isRequired,501 /** Function to update the custom port in number */502 updateCustomPortInNumber: PropTypes.func.isRequired,503 /** Function to update the port in request. */504 updatePortInRequest: PropTypes.func.isRequired,505 /** Field information for validated port in date. */506 validatedPortInDateField: PropTypes.object,507 /** Validate port in date attribute present inside open support requests */508 validatePortInDate: PropTypes.bool,509 offeringContextsByInstanceId: PropTypes.object,510 activeOfferInstanceId: PropTypes.string,511 /** Action to change ui context page data */512 setContextPageData: PropTypes.func.isRequired513};514export default compose(515 withI18n(),516 withRouter...
port_testcase.py
Source:port_testcase.py
...70 os_name = None71 os_version = None72 port_maker = TestWebKitPort73 port_name = None74 def make_port(self, host=None, port_name=None, options=None, os_name=None, os_version=None, **kwargs):75 host = host or MockSystemHost(os_name=(os_name or self.os_name), os_version=(os_version or self.os_version))76 options = options or MockOptions(configuration='Release')77 port_name = port_name or self.port_name78 port_name = self.port_maker.determine_full_port_name(host, options, port_name)79 port = self.port_maker(host, port_name, options=options, **kwargs)80 port._config.build_directory = lambda configuration: '/mock-build'81 return port82 def make_wdiff_available(self, port):83 port._wdiff_available = True84 def test_check_build(self):85 port = self.make_port()86 port._check_file_exists = lambda path, desc: True87 if port._dump_reader:88 port._dump_reader.check_is_functional = lambda: True89 port._options.build = True90 port._check_driver_build_up_to_date = lambda config: True91 port.check_httpd = lambda: True92 oc = OutputCapture()93 try:94 oc.capture_output()95 self.assertEqual(port.check_build(needs_http=True, printer=FakePrinter()),96 test_run_results.OK_EXIT_STATUS)97 finally:98 out, err, logs = oc.restore_output()99 self.assertIn('pretty patches', logs) # We should get a warning about PrettyPatch being missing,100 self.assertNotIn('build requirements', logs) # but not the driver itself.101 port._check_file_exists = lambda path, desc: False102 port._check_driver_build_up_to_date = lambda config: False103 try:104 oc.capture_output()105 self.assertEqual(port.check_build(needs_http=True, printer=FakePrinter()),106 test_run_results.UNEXPECTED_ERROR_EXIT_STATUS)107 finally:108 out, err, logs = oc.restore_output()109 self.assertIn('pretty patches', logs) # And, hereere we should get warnings about both.110 self.assertIn('build requirements', logs)111 def test_default_max_locked_shards(self):112 port = self.make_port()113 port.default_child_processes = lambda: 16114 self.assertEqual(port.default_max_locked_shards(), 4)115 port.default_child_processes = lambda: 2116 self.assertEqual(port.default_max_locked_shards(), 1)117 def test_default_timeout_ms(self):118 self.assertEqual(self.make_port(options=MockOptions(configuration='Release')).default_timeout_ms(), 6000)119 self.assertEqual(self.make_port(options=MockOptions(configuration='Debug')).default_timeout_ms(), 18000)120 def test_default_pixel_tests(self):121 self.assertEqual(self.make_port().default_pixel_tests(), True)122 def test_driver_cmd_line(self):123 port = self.make_port()124 self.assertTrue(len(port.driver_cmd_line()))125 options = MockOptions(additional_drt_flag=['--foo=bar', '--foo=baz'])126 port = self.make_port(options=options)127 cmd_line = port.driver_cmd_line()128 self.assertTrue('--foo=bar' in cmd_line)129 self.assertTrue('--foo=baz' in cmd_line)130 def test_uses_apache(self):131 self.assertTrue(self.make_port().uses_apache())132 def assert_servers_are_down(self, host, ports):133 for port in ports:134 try:135 test_socket = socket.socket()136 test_socket.connect((host, port))137 self.fail()138 except IOError, e:139 self.assertTrue(e.errno in (errno.ECONNREFUSED, errno.ECONNRESET))140 finally:141 test_socket.close()142 def assert_servers_are_up(self, host, ports):143 for port in ports:144 try:145 test_socket = socket.socket()146 test_socket.connect((host, port))147 except IOError, e:148 self.fail('failed to connect to %s:%d' % (host, port))149 finally:150 test_socket.close()151 def test_diff_image__missing_both(self):152 port = self.make_port()153 self.assertEqual(port.diff_image(None, None), (None, None))154 self.assertEqual(port.diff_image(None, ''), (None, None))155 self.assertEqual(port.diff_image('', None), (None, None))156 self.assertEqual(port.diff_image('', ''), (None, None))157 def test_diff_image__missing_actual(self):158 port = self.make_port()159 self.assertEqual(port.diff_image(None, 'foo'), ('foo', None))160 self.assertEqual(port.diff_image('', 'foo'), ('foo', None))161 def test_diff_image__missing_expected(self):162 port = self.make_port()163 self.assertEqual(port.diff_image('foo', None), ('foo', None))164 self.assertEqual(port.diff_image('foo', ''), ('foo', None))165 def test_diff_image(self):166 def _path_to_image_diff():167 return "/path/to/image_diff"168 port = self.make_port()169 port._path_to_image_diff = _path_to_image_diff170 mock_image_diff = "MOCK Image Diff"171 def mock_run_command(args):172 port._filesystem.write_binary_file(args[4], mock_image_diff)173 return 1174 # Images are different.175 port._executive = MockExecutive2(run_command_fn=mock_run_command)176 self.assertEqual(mock_image_diff, port.diff_image("EXPECTED", "ACTUAL")[0])177 # Images are the same.178 port._executive = MockExecutive2(exit_code=0)179 self.assertEqual(None, port.diff_image("EXPECTED", "ACTUAL")[0])180 # There was some error running image_diff.181 port._executive = MockExecutive2(exit_code=2)182 exception_raised = False183 try:184 port.diff_image("EXPECTED", "ACTUAL")185 except ValueError, e:186 exception_raised = True187 self.assertFalse(exception_raised)188 def test_diff_image_crashed(self):189 port = self.make_port()190 port._executive = MockExecutive2(exit_code=2)191 self.assertEqual(port.diff_image("EXPECTED", "ACTUAL"), (None, 'Image diff returned an exit code of 2. See http://crbug.com/278596'))192 def test_check_wdiff(self):193 port = self.make_port()194 port.check_wdiff()195 def test_wdiff_text_fails(self):196 host = MockSystemHost(os_name=self.os_name, os_version=self.os_version)197 host.executive = MockExecutive(should_throw=True)198 port = self.make_port(host=host)199 port._executive = host.executive # AndroidPortTest.make_port sets its own executive, so reset that as well.200 # This should raise a ScriptError that gets caught and turned into the201 # error text, and also mark wdiff as not available.202 self.make_wdiff_available(port)203 self.assertTrue(port.wdiff_available())204 diff_txt = port.wdiff_text("/tmp/foo.html", "/tmp/bar.html")205 self.assertEqual(diff_txt, port._wdiff_error_html)206 self.assertFalse(port.wdiff_available())207 def test_missing_symbol_to_skipped_tests(self):208 # Test that we get the chromium skips and not the webkit default skips209 port = self.make_port()210 skip_dict = port._missing_symbol_to_skipped_tests()211 if port.PORT_HAS_AUDIO_CODECS_BUILT_IN:212 self.assertEqual(skip_dict, {})213 else:214 self.assertTrue('ff_mp3_decoder' in skip_dict)215 self.assertFalse('WebGLShader' in skip_dict)216 def test_test_configuration(self):217 port = self.make_port()218 self.assertTrue(port.test_configuration())219 def test_all_test_configurations(self):220 """Validate the complete set of configurations this port knows about."""221 port = self.make_port()222 self.assertEqual(set(port.all_test_configurations()), set([223 TestConfiguration('snowleopard', 'x86', 'debug'),224 TestConfiguration('snowleopard', 'x86', 'release'),225 TestConfiguration('lion', 'x86', 'debug'),226 TestConfiguration('lion', 'x86', 'release'),227 TestConfiguration('retina', 'x86', 'debug'),228 TestConfiguration('retina', 'x86', 'release'),229 TestConfiguration('mountainlion', 'x86', 'debug'),230 TestConfiguration('mountainlion', 'x86', 'release'),231 TestConfiguration('mavericks', 'x86', 'debug'),232 TestConfiguration('mavericks', 'x86', 'release'),233 TestConfiguration('xp', 'x86', 'debug'),234 TestConfiguration('xp', 'x86', 'release'),235 TestConfiguration('win7', 'x86', 'debug'),236 TestConfiguration('win7', 'x86', 'release'),237 TestConfiguration('lucid', 'x86', 'debug'),238 TestConfiguration('lucid', 'x86', 'release'),239 TestConfiguration('lucid', 'x86_64', 'debug'),240 TestConfiguration('lucid', 'x86_64', 'release'),241 TestConfiguration('icecreamsandwich', 'x86', 'debug'),242 TestConfiguration('icecreamsandwich', 'x86', 'release'),243 ]))244 def test_get_crash_log(self):245 port = self.make_port()246 self.assertEqual(port._get_crash_log(None, None, None, None, newer_than=None),247 (None,248 'crash log for <unknown process name> (pid <unknown>):\n'249 'STDOUT: <empty>\n'250 'STDERR: <empty>\n'))251 self.assertEqual(port._get_crash_log('foo', 1234, 'out bar\nout baz', 'err bar\nerr baz\n', newer_than=None),252 ('err bar\nerr baz\n',253 'crash log for foo (pid 1234):\n'254 'STDOUT: out bar\n'255 'STDOUT: out baz\n'256 'STDERR: err bar\n'257 'STDERR: err baz\n'))258 self.assertEqual(port._get_crash_log('foo', 1234, 'foo\xa6bar', 'foo\xa6bar', newer_than=None),259 ('foo\xa6bar',260 u'crash log for foo (pid 1234):\n'261 u'STDOUT: foo\ufffdbar\n'262 u'STDERR: foo\ufffdbar\n'))263 self.assertEqual(port._get_crash_log('foo', 1234, 'foo\xa6bar', 'foo\xa6bar', newer_than=1.0),264 ('foo\xa6bar',265 u'crash log for foo (pid 1234):\n'266 u'STDOUT: foo\ufffdbar\n'267 u'STDERR: foo\ufffdbar\n'))268 def assert_build_path(self, options, dirs, expected_path):269 port = self.make_port(options=options)270 for directory in dirs:271 port.host.filesystem.maybe_make_directory(directory)272 self.assertEqual(port._build_path(), expected_path)273 def test_expectations_files(self):274 port = self.make_port()275 generic_path = port.path_to_generic_test_expectations_file()276 chromium_overrides_path = port.path_from_chromium_base(277 'webkit', 'tools', 'layout_tests', 'test_expectations.txt')278 never_fix_tests_path = port._filesystem.join(port.layout_tests_dir(), 'NeverFixTests')279 stale_tests_path = port._filesystem.join(port.layout_tests_dir(), 'StaleTestExpectations')280 slow_tests_path = port._filesystem.join(port.layout_tests_dir(), 'SlowTests')281 flaky_tests_path = port._filesystem.join(port.layout_tests_dir(), 'FlakyTests')282 skia_overrides_path = port.path_from_chromium_base(283 'skia', 'skia_test_expectations.txt')284 port._filesystem.write_text_file(skia_overrides_path, 'dummy text')285 w3c_overrides_path = port.path_from_chromium_base(286 'webkit', 'tools', 'layout_tests', 'test_expectations_w3c.txt')287 port._filesystem.write_text_file(w3c_overrides_path, 'dummy text')288 port._options.builder_name = 'DUMMY_BUILDER_NAME'289 self.assertEqual(port.expectations_files(),290 [generic_path, skia_overrides_path, w3c_overrides_path,291 never_fix_tests_path, stale_tests_path, slow_tests_path,292 flaky_tests_path, chromium_overrides_path])293 port._options.builder_name = 'builder (deps)'294 self.assertEqual(port.expectations_files(),295 [generic_path, skia_overrides_path, w3c_overrides_path,296 never_fix_tests_path, stale_tests_path, slow_tests_path,297 flaky_tests_path, chromium_overrides_path])298 # A builder which does NOT observe the Chromium test_expectations,299 # but still observes the Skia test_expectations...300 port._options.builder_name = 'builder'301 self.assertEqual(port.expectations_files(),302 [generic_path, skia_overrides_path, w3c_overrides_path,303 never_fix_tests_path, stale_tests_path, slow_tests_path,304 flaky_tests_path])305 def test_check_sys_deps(self):306 port = self.make_port()307 port._executive = MockExecutive2(exit_code=0)308 self.assertEqual(port.check_sys_deps(needs_http=False), test_run_results.OK_EXIT_STATUS)309 port._executive = MockExecutive2(exit_code=1, output='testing output failure')310 self.assertEqual(port.check_sys_deps(needs_http=False), test_run_results.SYS_DEPS_EXIT_STATUS)311 def test_expectations_ordering(self):312 port = self.make_port()313 for path in port.expectations_files():314 port._filesystem.write_text_file(path, '')315 ordered_dict = port.expectations_dict()316 self.assertEqual(port.path_to_generic_test_expectations_file(), ordered_dict.keys()[0])317 options = MockOptions(additional_expectations=['/tmp/foo', '/tmp/bar'])318 port = self.make_port(options=options)319 for path in port.expectations_files():320 port._filesystem.write_text_file(path, '')321 port._filesystem.write_text_file('/tmp/foo', 'foo')322 port._filesystem.write_text_file('/tmp/bar', 'bar')323 ordered_dict = port.expectations_dict()324 self.assertEqual(ordered_dict.keys()[-2:], options.additional_expectations) # pylint: disable=E1101325 self.assertEqual(ordered_dict.values()[-2:], ['foo', 'bar'])326 def test_skipped_directories_for_symbols(self):327 # This first test confirms that the commonly found symbols result in the expected skipped directories.328 symbols_string = " ".join(["fooSymbol"])329 expected_directories = set([330 "webaudio/codec-tests/mp3",331 "webaudio/codec-tests/aac",332 ])333 result_directories = set(TestWebKitPort(symbols_string=symbols_string)._skipped_tests_for_unsupported_features(test_list=['webaudio/codec-tests/mp3/foo.html']))334 self.assertEqual(result_directories, expected_directories)335 # Test that the nm string parsing actually works:336 symbols_string = """337000000000124f498 s __ZZN7WebCore13ff_mp3_decoder12replaceChildEPS0_S1_E19__PRETTY_FUNCTION__338000000000124f500 s __ZZN7WebCore13ff_mp3_decoder13addChildAboveEPS0_S1_E19__PRETTY_FUNCTION__339000000000124f670 s __ZZN7WebCore13ff_mp3_decoder13addChildBelowEPS0_S1_E19__PRETTY_FUNCTION__340"""341 # Note 'compositing' is not in the list of skipped directories (hence the parsing of GraphicsLayer worked):342 expected_directories = set([343 "webaudio/codec-tests/aac",344 ])345 result_directories = set(TestWebKitPort(symbols_string=symbols_string)._skipped_tests_for_unsupported_features(test_list=['webaudio/codec-tests/mp3/foo.html']))346 self.assertEqual(result_directories, expected_directories)347 def _assert_config_file_for_platform(self, port, platform, config_file):348 self.assertEqual(port._apache_config_file_name_for_platform(platform), config_file)349 def test_linux_distro_detection(self):350 port = TestWebKitPort()351 self.assertFalse(port._is_redhat_based())352 self.assertFalse(port._is_debian_based())353 port._filesystem = MockFileSystem({'/etc/redhat-release': ''})354 self.assertTrue(port._is_redhat_based())355 self.assertFalse(port._is_debian_based())356 port._filesystem = MockFileSystem({'/etc/debian_version': ''})357 self.assertFalse(port._is_redhat_based())358 self.assertTrue(port._is_debian_based())359 def test_apache_config_file_name_for_platform(self):360 port = TestWebKitPort()361 self._assert_config_file_for_platform(port, 'cygwin', 'cygwin-httpd.conf')362 self._assert_config_file_for_platform(port, 'linux2', 'apache2-httpd.conf')363 self._assert_config_file_for_platform(port, 'linux3', 'apache2-httpd.conf')364 port._is_redhat_based = lambda: True365 port._apache_version = lambda: '2.2'366 self._assert_config_file_for_platform(port, 'linux2', 'fedora-httpd-2.2.conf')367 port = TestWebKitPort()368 port._is_debian_based = lambda: True369 port._apache_version = lambda: '2.2'370 self._assert_config_file_for_platform(port, 'linux2', 'debian-httpd-2.2.conf')371 self._assert_config_file_for_platform(port, 'mac', 'apache2-httpd.conf')372 self._assert_config_file_for_platform(port, 'win32', 'apache2-httpd.conf') # win32 isn't a supported sys.platform. AppleWin/WinCairo/WinCE ports all use cygwin.373 self._assert_config_file_for_platform(port, 'barf', 'apache2-httpd.conf')374 def test_path_to_apache_config_file(self):375 port = TestWebKitPort()376 saved_environ = os.environ.copy()377 try:378 os.environ['WEBKIT_HTTP_SERVER_CONF_PATH'] = '/path/to/httpd.conf'379 self.assertRaises(IOError, port.path_to_apache_config_file)380 port._filesystem.write_text_file('/existing/httpd.conf', 'Hello, world!')381 os.environ['WEBKIT_HTTP_SERVER_CONF_PATH'] = '/existing/httpd.conf'382 self.assertEqual(port.path_to_apache_config_file(), '/existing/httpd.conf')383 finally:384 os.environ = saved_environ.copy()385 # Mock out _apache_config_file_name_for_platform to ignore the passed sys.platform value.386 port._apache_config_file_name_for_platform = lambda platform: 'httpd.conf'387 self.assertEqual(port.path_to_apache_config_file(), '/mock-checkout/third_party/WebKit/LayoutTests/http/conf/httpd.conf')388 # Check that even if we mock out _apache_config_file_name, the environment variable takes precedence.389 saved_environ = os.environ.copy()390 try:391 os.environ['WEBKIT_HTTP_SERVER_CONF_PATH'] = '/existing/httpd.conf'392 self.assertEqual(port.path_to_apache_config_file(), '/existing/httpd.conf')393 finally:394 os.environ = saved_environ.copy()395 def test_additional_platform_directory(self):396 port = self.make_port(options=MockOptions(additional_platform_directory=['/tmp/foo']))...
miscellaneous_bindings.js
Source:miscellaneous_bindings.js
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4// This contains unprivileged javascript APIs for extensions and apps. It5// can be loaded by any extension-related context, such as content scripts or6// background pages. See user_script_slave.cc for script that is loaded by7// content scripts only.8 require('json_schema');9 require('event_bindings');10 var lastError = require('lastError');11 var miscNatives = requireNative('miscellaneous_bindings');12 var CloseChannel = miscNatives.CloseChannel;13 var PortAddRef = miscNatives.PortAddRef;14 var PortRelease = miscNatives.PortRelease;15 var PostMessage = miscNatives.PostMessage;16 var BindToGC = miscNatives.BindToGC;17 var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();18 var processNatives = requireNative('process');19 var manifestVersion = processNatives.GetManifestVersion();20 var extensionId = processNatives.GetExtensionId();21 // The reserved channel name for the sendRequest/sendMessage APIs.22 // Note: sendRequest is deprecated.23 chromeHidden.kRequestChannel = "chrome.extension.sendRequest";24 chromeHidden.kMessageChannel = "chrome.runtime.sendMessage";25 chromeHidden.kNativeMessageChannel = "chrome.runtime.sendNativeMessage";26 // Map of port IDs to port object.27 var ports = {};28 // Map of port IDs to chromeHidden.onUnload listeners. Keep track of these29 // to free the onUnload listeners when ports are closed.30 var portReleasers = {};31 // Change even to odd and vice versa, to get the other side of a given32 // channel.33 function getOppositePortId(portId) { return portId ^ 1; }34 // Port object. Represents a connection to another script context through35 // which messages can be passed.36 function PortImpl(portId, opt_name) {37 this.portId_ = portId;38 this.name = opt_name;39 this.onDisconnect = new chrome.Event();40 this.onMessage = new chrome.Event();41 }42 // Sends a message asynchronously to the context on the other end of this43 // port.44 PortImpl.prototype.postMessage = function(msg) {45 // JSON.stringify doesn't support a root object which is undefined.46 if (msg === undefined)47 msg = null;48 PostMessage(this.portId_, chromeHidden.JSON.stringify(msg));49 };50 // Disconnects the port from the other end.51 PortImpl.prototype.disconnect = function() {52 CloseChannel(this.portId_, true);53 this.destroy_();54 };55 PortImpl.prototype.destroy_ = function() {56 var portId = this.portId_;57 this.onDisconnect.destroy_();58 this.onMessage.destroy_();59 PortRelease(portId);60 chromeHidden.onUnload.removeListener(portReleasers[portId]);61 delete ports[portId];62 delete portReleasers[portId];63 };64 chromeHidden.Port = {};65 // Returns true if the specified port id is in this context. This is used by66 // the C++ to avoid creating the javascript message for all the contexts that67 // don't care about a particular message.68 chromeHidden.Port.hasPort = function(portId) {69 return portId in ports;70 };71 // Hidden port creation function. We don't want to expose an API that lets72 // people add arbitrary port IDs to the port list.73 chromeHidden.Port.createPort = function(portId, opt_name) {74 if (ports[portId]) {75 throw new Error("Port '" + portId + "' already exists.");76 }77 var port = new PortImpl(portId, opt_name);78 ports[portId] = port;79 portReleasers[portId] = PortRelease.bind(this, portId);80 chromeHidden.onUnload.addListener(portReleasers[portId]);81 PortAddRef(portId);82 return port;83 };84 // Helper function for dispatchOnRequest.85 function handleSendRequestError(isSendMessage, responseCallbackPreserved,86 sourceExtensionId, targetExtensionId) {87 var errorMsg;88 var eventName = (isSendMessage ?89 "chrome.runtime.onMessage" : "chrome.extension.onRequest");90 if (isSendMessage && !responseCallbackPreserved) {91 errorMsg =92 "The " + eventName + " listener must return true if you want to" +93 " send a response after the listener returns ";94 } else {95 errorMsg =96 "Cannot send a response more than once per " + eventName +97 " listener per document";98 }99 errorMsg += " (message was sent by extension " + sourceExtensionId;100 if (sourceExtensionId != targetExtensionId)101 errorMsg += " for extension " + targetExtensionId;102 errorMsg += ").";103 lastError.set(errorMsg);104 console.error("Could not send response: " + errorMsg);105 }106 // Helper function for dispatchOnConnect107 function dispatchOnRequest(portId, channelName, sender,108 sourceExtensionId, targetExtensionId,109 isExternal) {110 var isSendMessage = channelName == chromeHidden.kMessageChannel;111 var requestEvent = (isSendMessage ?112 (isExternal ?113 chrome.runtime.onMessageExternal : chrome.runtime.onMessage) :114 (isExternal ?115 chrome.extension.onRequestExternal : chrome.extension.onRequest));116 if (requestEvent.hasListeners()) {117 var port = chromeHidden.Port.createPort(portId, channelName);118 port.onMessage.addListener(function(request) {119 var responseCallbackPreserved = false;120 var responseCallback = function(response) {121 if (port) {122 port.postMessage(response);123 port.destroy_();124 port = null;125 } else {126 // We nulled out port when sending the response, and now the page127 // is trying to send another response for the same request.128 handleSendRequestError(isSendMessage, responseCallbackPreserved,129 sourceExtensionId, targetExtensionId);130 }131 };132 // In case the extension never invokes the responseCallback, and also133 // doesn't keep a reference to it, we need to clean up the port. Do134 // so by attaching to the garbage collection of the responseCallback135 // using some native hackery.136 BindToGC(responseCallback, function() {137 if (port) {138 port.destroy_();139 port = null;140 }141 });142 if (!isSendMessage) {143 requestEvent.dispatch(request, sender, responseCallback);144 } else {145 var rv = requestEvent.dispatch(request, sender, responseCallback);146 responseCallbackPreserved =147 rv && rv.results && rv.results.indexOf(true) > -1;148 if (!responseCallbackPreserved && port) {149 // If they didn't access the response callback, they're not150 // going to send a response, so clean up the port immediately.151 port.destroy_();152 port = null;153 }154 }155 });156 return true;157 }158 return false;159 }160 // Called by native code when a channel has been opened to this context.161 chromeHidden.Port.dispatchOnConnect = function(portId, channelName, tab,162 sourceExtensionId,163 targetExtensionId) {164 // Only create a new Port if someone is actually listening for a connection.165 // In addition to being an optimization, this also fixes a bug where if 2166 // channels were opened to and from the same process, closing one would167 // close both.168 if (targetExtensionId != extensionId)169 return false; // not for us170 if (ports[getOppositePortId(portId)])171 return false; // this channel was opened by us, so ignore it172 // Determine whether this is coming from another extension, so we can use173 // the right event.174 var isExternal = sourceExtensionId != extensionId;175 if (tab)176 tab = chromeHidden.JSON.parse(tab);177 var sender = {tab: tab, id: sourceExtensionId};178 // Special case for sendRequest/onRequest and sendMessage/onMessage.179 if (channelName == chromeHidden.kRequestChannel ||180 channelName == chromeHidden.kMessageChannel) {181 return dispatchOnRequest(portId, channelName, sender,182 sourceExtensionId, targetExtensionId,183 isExternal);184 }185 var connectEvent = (isExternal ?186 chrome.runtime.onConnectExternal : chrome.runtime.onConnect);187 if (connectEvent.hasListeners()) {188 var port = chromeHidden.Port.createPort(portId, channelName);189 port.sender = sender;190 if (manifestVersion < 2)191 port.tab = port.sender.tab;192 connectEvent.dispatch(port);193 return true;194 }195 return false;196 };197 // Called by native code when a channel has been closed.198 chromeHidden.Port.dispatchOnDisconnect = function(199 portId, connectionInvalid) {200 var port = ports[portId];201 if (port) {202 // Update the renderer's port bookkeeping, without notifying the browser.203 CloseChannel(portId, false);204 if (connectionInvalid) {205 var errorMsg =206 "Could not establish connection. Receiving end does not exist.";207 lastError.set(errorMsg);208 console.error("Port error: " + errorMsg);209 }210 try {211 port.onDisconnect.dispatch(port);212 } finally {213 port.destroy_();214 lastError.clear();215 }216 }217 };218 // Called by native code when a message has been sent to the given port.219 chromeHidden.Port.dispatchOnMessage = function(msg, portId) {220 var port = ports[portId];221 if (port) {222 if (msg) {223 msg = chromeHidden.JSON.parse(msg);224 }225 port.onMessage.dispatch(msg, port);226 }227 };228 // Shared implementation used by tabs.sendMessage and runtime.sendMessage.229 chromeHidden.Port.sendMessageImpl = function(port, request,230 responseCallback) {231 if (port.name != chromeHidden.kNativeMessageChannel)232 port.postMessage(request);233 if (port.name == chromeHidden.kMessageChannel && !responseCallback) {234 // TODO(mpcomplete): Do this for the old sendRequest API too, after235 // verifying it doesn't break anything.236 // Go ahead and disconnect immediately if the sender is not expecting237 // a response.238 port.disconnect();239 return;240 }241 // Ensure the callback exists for the older sendRequest API.242 if (!responseCallback)243 responseCallback = function() {};244 port.onDisconnect.addListener(function() {245 // For onDisconnects, we only notify the callback if there was an error246 try {247 if (chrome.runtime.lastError)248 responseCallback();249 } finally {250 port = null;251 }252 });253 port.onMessage.addListener(function(response) {254 try {255 responseCallback(response);256 } finally {257 port.disconnect();258 port = null;259 }260 });261 };262 function sendMessageUpdateArguments(functionName) {263 // Align missing (optional) function arguments with the arguments that264 // schema validation is expecting, e.g.265 // extension.sendRequest(req) -> extension.sendRequest(null, req)266 // extension.sendRequest(req, cb) -> extension.sendRequest(null, req, cb)267 var args = Array.prototype.splice.call(arguments, 1); // skip functionName268 var lastArg = args.length - 1;269 // responseCallback (last argument) is optional.270 var responseCallback = null;271 if (typeof(args[lastArg]) == 'function')272 responseCallback = args[lastArg--];273 // request (second argument) is required.274 var request = args[lastArg--];275 // targetId (first argument, extensionId in the manfiest) is optional.276 var targetId = null;277 if (lastArg >= 0)278 targetId = args[lastArg--];279 if (lastArg != -1)280 throw new Error('Invalid arguments to ' + functionName + '.');281 return [targetId, request, responseCallback];282 }...
QtSerialPort.pyi
Source:QtSerialPort.pyi
1# The PEP 484 type hints stub file for the QtSerialPort module.2#3# Generated by SIP 4.18.14#5# Copyright (c) 2016 Riverbank Computing Limited <info@riverbankcomputing.com>6# 7# This file is part of PyQt5.8# 9# This file may be used under the terms of the GNU General Public License10# version 3.0 as published by the Free Software Foundation and appearing in11# the file LICENSE included in the packaging of this file. Please review the12# following information to ensure the GNU General Public License version 3.013# requirements will be met: http://www.gnu.org/copyleft/gpl.html.14# 15# If you do not wish to use this file under the terms of the GPL version 3.016# then you may purchase a commercial license. For more information contact17# info@riverbankcomputing.com.18# 19# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE20# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.21import typing22import sip23from PyQt5 import QtCore24# Support for QDate, QDateTime and QTime.25import datetime26# Convenient type aliases.27PYQT_SIGNAL = typing.Union[QtCore.pyqtSignal, QtCore.pyqtBoundSignal]28PYQT_SLOT = typing.Union[typing.Callable[..., None], QtCore.pyqtBoundSignal]29class QSerialPort(QtCore.QIODevice):30 class SerialPortError(int): ...31 NoError = ... # type: 'QSerialPort.SerialPortError'32 DeviceNotFoundError = ... # type: 'QSerialPort.SerialPortError'33 PermissionError = ... # type: 'QSerialPort.SerialPortError'34 OpenError = ... # type: 'QSerialPort.SerialPortError'35 ParityError = ... # type: 'QSerialPort.SerialPortError'36 FramingError = ... # type: 'QSerialPort.SerialPortError'37 BreakConditionError = ... # type: 'QSerialPort.SerialPortError'38 WriteError = ... # type: 'QSerialPort.SerialPortError'39 ReadError = ... # type: 'QSerialPort.SerialPortError'40 ResourceError = ... # type: 'QSerialPort.SerialPortError'41 UnsupportedOperationError = ... # type: 'QSerialPort.SerialPortError'42 TimeoutError = ... # type: 'QSerialPort.SerialPortError'43 NotOpenError = ... # type: 'QSerialPort.SerialPortError'44 UnknownError = ... # type: 'QSerialPort.SerialPortError'45 class DataErrorPolicy(int): ...46 SkipPolicy = ... # type: 'QSerialPort.DataErrorPolicy'47 PassZeroPolicy = ... # type: 'QSerialPort.DataErrorPolicy'48 IgnorePolicy = ... # type: 'QSerialPort.DataErrorPolicy'49 StopReceivingPolicy = ... # type: 'QSerialPort.DataErrorPolicy'50 UnknownPolicy = ... # type: 'QSerialPort.DataErrorPolicy'51 class PinoutSignal(int): ...52 NoSignal = ... # type: 'QSerialPort.PinoutSignal'53 TransmittedDataSignal = ... # type: 'QSerialPort.PinoutSignal'54 ReceivedDataSignal = ... # type: 'QSerialPort.PinoutSignal'55 DataTerminalReadySignal = ... # type: 'QSerialPort.PinoutSignal'56 DataCarrierDetectSignal = ... # type: 'QSerialPort.PinoutSignal'57 DataSetReadySignal = ... # type: 'QSerialPort.PinoutSignal'58 RingIndicatorSignal = ... # type: 'QSerialPort.PinoutSignal'59 RequestToSendSignal = ... # type: 'QSerialPort.PinoutSignal'60 ClearToSendSignal = ... # type: 'QSerialPort.PinoutSignal'61 SecondaryTransmittedDataSignal = ... # type: 'QSerialPort.PinoutSignal'62 SecondaryReceivedDataSignal = ... # type: 'QSerialPort.PinoutSignal'63 class FlowControl(int): ...64 NoFlowControl = ... # type: 'QSerialPort.FlowControl'65 HardwareControl = ... # type: 'QSerialPort.FlowControl'66 SoftwareControl = ... # type: 'QSerialPort.FlowControl'67 UnknownFlowControl = ... # type: 'QSerialPort.FlowControl'68 class StopBits(int): ...69 OneStop = ... # type: 'QSerialPort.StopBits'70 OneAndHalfStop = ... # type: 'QSerialPort.StopBits'71 TwoStop = ... # type: 'QSerialPort.StopBits'72 UnknownStopBits = ... # type: 'QSerialPort.StopBits'73 class Parity(int): ...74 NoParity = ... # type: 'QSerialPort.Parity'75 EvenParity = ... # type: 'QSerialPort.Parity'76 OddParity = ... # type: 'QSerialPort.Parity'77 SpaceParity = ... # type: 'QSerialPort.Parity'78 MarkParity = ... # type: 'QSerialPort.Parity'79 UnknownParity = ... # type: 'QSerialPort.Parity'80 class DataBits(int): ...81 Data5 = ... # type: 'QSerialPort.DataBits'82 Data6 = ... # type: 'QSerialPort.DataBits'83 Data7 = ... # type: 'QSerialPort.DataBits'84 Data8 = ... # type: 'QSerialPort.DataBits'85 UnknownDataBits = ... # type: 'QSerialPort.DataBits'86 class BaudRate(int): ...87 Baud1200 = ... # type: 'QSerialPort.BaudRate'88 Baud2400 = ... # type: 'QSerialPort.BaudRate'89 Baud4800 = ... # type: 'QSerialPort.BaudRate'90 Baud9600 = ... # type: 'QSerialPort.BaudRate'91 Baud19200 = ... # type: 'QSerialPort.BaudRate'92 Baud38400 = ... # type: 'QSerialPort.BaudRate'93 Baud57600 = ... # type: 'QSerialPort.BaudRate'94 Baud115200 = ... # type: 'QSerialPort.BaudRate'95 UnknownBaud = ... # type: 'QSerialPort.BaudRate'96 class Direction(int): ...97 Input = ... # type: 'QSerialPort.Direction'98 Output = ... # type: 'QSerialPort.Direction'99 AllDirections = ... # type: 'QSerialPort.Direction'100 class Directions(sip.simplewrapper):101 @typing.overload102 def __init__(self) -> None: ...103 @typing.overload104 def __init__(self, f: typing.Union['QSerialPort.Directions', 'QSerialPort.Direction']) -> None: ...105 @typing.overload106 def __init__(self, a0: 'QSerialPort.Directions') -> None: ...107 def __bool__(self) -> int: ...108 def __invert__(self) -> 'QSerialPort.Directions': ...109 def __int__(self) -> int: ...110 class PinoutSignals(sip.simplewrapper):111 @typing.overload112 def __init__(self) -> None: ...113 @typing.overload114 def __init__(self, f: typing.Union['QSerialPort.PinoutSignals', 'QSerialPort.PinoutSignal']) -> None: ...115 @typing.overload116 def __init__(self, a0: 'QSerialPort.PinoutSignals') -> None: ...117 def __bool__(self) -> int: ...118 def __invert__(self) -> 'QSerialPort.PinoutSignals': ...119 def __int__(self) -> int: ...120 @typing.overload121 def __init__(self, parent: typing.Optional[QtCore.QObject] = ...) -> None: ...122 @typing.overload123 def __init__(self, name: str, parent: typing.Optional[QtCore.QObject] = ...) -> None: ...124 @typing.overload125 def __init__(self, info: 'QSerialPortInfo', parent: typing.Optional[QtCore.QObject] = ...) -> None: ...126 def breakEnabledChanged(self, set: bool) -> None: ...127 def isBreakEnabled(self) -> bool: ...128 def handle(self) -> sip.voidptr: ...129 def writeData(self, data: bytes) -> int: ...130 def readLineData(self, maxlen: int) -> bytes: ...131 def readData(self, maxlen: int) -> bytes: ...132 def settingsRestoredOnCloseChanged(self, restore: bool) -> None: ...133 def requestToSendChanged(self, set: bool) -> None: ...134 def dataTerminalReadyChanged(self, set: bool) -> None: ...135 def dataErrorPolicyChanged(self, policy: 'QSerialPort.DataErrorPolicy') -> None: ...136 def flowControlChanged(self, flow: 'QSerialPort.FlowControl') -> None: ...137 def stopBitsChanged(self, stopBits: 'QSerialPort.StopBits') -> None: ...138 def parityChanged(self, parity: 'QSerialPort.Parity') -> None: ...139 def dataBitsChanged(self, dataBits: 'QSerialPort.DataBits') -> None: ...140 def baudRateChanged(self, baudRate: int, directions: typing.Union['QSerialPort.Directions', 'QSerialPort.Direction']) -> None: ...141 def setBreakEnabled(self, enabled: bool = ...) -> bool: ...142 def sendBreak(self, duration: int = ...) -> bool: ...143 def waitForBytesWritten(self, msecs: int) -> bool: ...144 def waitForReadyRead(self, msecs: int) -> bool: ...145 def canReadLine(self) -> bool: ...146 def bytesToWrite(self) -> int: ...147 def bytesAvailable(self) -> int: ...148 def isSequential(self) -> bool: ...149 def setReadBufferSize(self, size: int) -> None: ...150 def readBufferSize(self) -> int: ...151 def clearError(self) -> None: ...152 @typing.overload153 def error(self) -> 'QSerialPort.SerialPortError': ...154 @typing.overload155 def error(self, serialPortError: 'QSerialPort.SerialPortError') -> None: ...156 def dataErrorPolicy(self) -> 'QSerialPort.DataErrorPolicy': ...157 def setDataErrorPolicy(self, policy: 'QSerialPort.DataErrorPolicy' = ...) -> bool: ...158 def atEnd(self) -> bool: ...159 def clear(self, dir: typing.Union['QSerialPort.Directions', 'QSerialPort.Direction'] = ...) -> bool: ...160 def flush(self) -> bool: ...161 def pinoutSignals(self) -> 'QSerialPort.PinoutSignals': ...162 def isRequestToSend(self) -> bool: ...163 def setRequestToSend(self, set: bool) -> bool: ...164 def isDataTerminalReady(self) -> bool: ...165 def setDataTerminalReady(self, set: bool) -> bool: ...166 def flowControl(self) -> 'QSerialPort.FlowControl': ...167 def setFlowControl(self, flow: 'QSerialPort.FlowControl') -> bool: ...168 def stopBits(self) -> 'QSerialPort.StopBits': ...169 def setStopBits(self, stopBits: 'QSerialPort.StopBits') -> bool: ...170 def parity(self) -> 'QSerialPort.Parity': ...171 def setParity(self, parity: 'QSerialPort.Parity') -> bool: ...172 def dataBits(self) -> 'QSerialPort.DataBits': ...173 def setDataBits(self, dataBits: 'QSerialPort.DataBits') -> bool: ...174 def baudRate(self, dir: typing.Union['QSerialPort.Directions', 'QSerialPort.Direction'] = ...) -> int: ...175 def setBaudRate(self, baudRate: int, dir: typing.Union['QSerialPort.Directions', 'QSerialPort.Direction'] = ...) -> bool: ...176 def settingsRestoredOnClose(self) -> bool: ...177 def setSettingsRestoredOnClose(self, restore: bool) -> None: ...178 def close(self) -> None: ...179 def open(self, mode: typing.Union[QtCore.QIODevice.OpenMode, QtCore.QIODevice.OpenModeFlag]) -> bool: ...180 def setPort(self, info: 'QSerialPortInfo') -> None: ...181 def portName(self) -> str: ...182 def setPortName(self, name: str) -> None: ...183class QSerialPortInfo(sip.simplewrapper):184 @typing.overload185 def __init__(self) -> None: ...186 @typing.overload187 def __init__(self, port: QSerialPort) -> None: ...188 @typing.overload189 def __init__(self, name: str) -> None: ...190 @typing.overload191 def __init__(self, other: 'QSerialPortInfo') -> None: ...192 def serialNumber(self) -> str: ...193 def isNull(self) -> bool: ...194 @staticmethod195 def availablePorts() -> typing.Any: ...196 @staticmethod197 def standardBaudRates() -> typing.List[int]: ...198 def isValid(self) -> bool: ...199 def isBusy(self) -> bool: ...200 def hasProductIdentifier(self) -> bool: ...201 def hasVendorIdentifier(self) -> bool: ...202 def productIdentifier(self) -> int: ...203 def vendorIdentifier(self) -> int: ...204 def manufacturer(self) -> str: ...205 def description(self) -> str: ...206 def systemLocation(self) -> str: ...207 def portName(self) -> str: ......
PortMappings-test.js
Source:PortMappings-test.js
1const PortMappings = require("../PortMappings");2const { ADD_ITEM } = require("#SRC/js/constants/TransactionTypes");3const Transaction = require("#SRC/js/structs/Transaction");4const { type: { BRIDGE } } = require("#SRC/js/constants/Networking");5const { type: { DOCKER } } = require("../../../constants/ContainerConstants");6describe("#JSONParser", function() {7 describe("PortMappings", function() {8 it("should add portDefinition with details", function() {9 expect(10 PortMappings.JSONParser({11 type: DOCKER,12 container: {13 docker: {14 network: BRIDGE,15 portMappings: [16 {17 name: "foo",18 hostPort: 0,19 containerPort: 80,20 protocol: "tcp"21 }22 ]23 }24 }25 })26 ).toEqual([27 new Transaction(["portDefinitions"], null, ADD_ITEM),28 new Transaction(["portDefinitions", 0, "name"], "foo"),29 new Transaction(["portDefinitions", 0, "automaticPort"], true),30 new Transaction(["portDefinitions", 0, "portMapping"], true),31 new Transaction(["portDefinitions", 0, "containerPort"], 80),32 new Transaction(["portDefinitions", 0, "protocol", "udp"], false),33 new Transaction(["portDefinitions", 0, "protocol", "tcp"], true)34 ]);35 });36 it("shouldn't add existing, but update details", function() {37 expect(38 PortMappings.JSONParser({39 type: DOCKER,40 container: {41 docker: {42 network: BRIDGE,43 portMappings: [44 {45 name: "foo",46 hostPort: 0,47 containerPort: 80,48 protocol: "tcp"49 }50 ]51 }52 },53 portDefinitions: [54 {55 name: "foo",56 port: 0,57 protocol: "tcp"58 }59 ]60 })61 ).toEqual([62 new Transaction(["portDefinitions", 0, "name"], "foo"),63 new Transaction(["portDefinitions", 0, "automaticPort"], true),64 new Transaction(["portDefinitions", 0, "portMapping"], true),65 new Transaction(["portDefinitions", 0, "containerPort"], 80),66 new Transaction(["portDefinitions", 0, "protocol", "udp"], false),67 new Transaction(["portDefinitions", 0, "protocol", "tcp"], true)68 ]);69 });70 it("should add Transaction for automaticPort and hostPort", function() {71 expect(72 PortMappings.JSONParser({73 type: DOCKER,74 container: {75 docker: {76 network: BRIDGE,77 portMappings: [78 {79 hostPort: 1080 }81 ]82 }83 }84 })85 ).toEqual([86 new Transaction(["portDefinitions"], null, ADD_ITEM),87 new Transaction(["portDefinitions", 0, "automaticPort"], false),88 new Transaction(["portDefinitions", 0, "portMapping"], true),89 new Transaction(["portDefinitions", 0, "hostPort"], 10)90 ]);91 });92 it("should add Transaction for loadBalanced ports", function() {93 expect(94 PortMappings.JSONParser({95 type: DOCKER,96 container: {97 docker: {98 network: BRIDGE,99 portMappings: [100 {101 labels: {102 VIP_0: "/:0"103 }104 }105 ]106 }107 }108 })109 ).toEqual([110 new Transaction(["portDefinitions"], null, ADD_ITEM),111 new Transaction(["portDefinitions", 0, "portMapping"], false),112 new Transaction(["portDefinitions", 0, "loadBalanced"], true),113 new Transaction(["portDefinitions", 0, "vip"], "/:0"),114 new Transaction(["portDefinitions", 0, "vipPort"], "0"),115 new Transaction(["portDefinitions", 0, "labels"], { VIP_0: "/:0" })116 ]);117 });118 it("shouldn't add loadBalanced for wrong label", function() {119 expect(120 PortMappings.JSONParser({121 type: DOCKER,122 container: {123 docker: {124 network: BRIDGE,125 portMappings: [126 {127 labels: {128 VIP_1: "/:0"129 }130 }131 ]132 }133 }134 })135 ).toEqual([136 new Transaction(["portDefinitions"], null, ADD_ITEM),137 new Transaction(["portDefinitions", 0, "portMapping"], false),138 new Transaction(["portDefinitions", 0, "labels"], { VIP_1: "/:0" })139 ]);140 });141 it("should add Transaction for protocol", function() {142 expect(143 PortMappings.JSONParser({144 type: DOCKER,145 container: {146 docker: {147 network: BRIDGE,148 portMappings: [149 {150 protocol: "udp"151 }152 ]153 }154 }155 })156 ).toEqual([157 new Transaction(["portDefinitions"], null, ADD_ITEM),158 new Transaction(["portDefinitions", 0, "portMapping"], false),159 new Transaction(["portDefinitions", 0, "protocol", "udp"], true),160 new Transaction(["portDefinitions", 0, "protocol", "tcp"], false)161 ]);162 });163 it("should merge info from portMappings and portDefinitions", function() {164 expect(165 PortMappings.JSONParser({166 type: DOCKER,167 container: {168 docker: {169 network: BRIDGE,170 portMappings: [171 {172 name: "foo",173 hostPort: 0,174 containerPort: 80,175 protocol: "tcp"176 },177 {178 name: "bar",179 hostPort: 10,180 containerPort: 81,181 protocol: "tcp",182 labels: {183 VIP_1: "/:0"184 }185 }186 ]187 }188 },189 portDefinitions: [190 {191 name: "foo",192 port: 0,193 protocol: "tcp"194 }195 ]196 })197 ).toEqual([198 new Transaction(["portDefinitions"], null, ADD_ITEM),199 new Transaction(["portDefinitions", 0, "name"], "foo"),200 new Transaction(["portDefinitions", 0, "automaticPort"], true),201 new Transaction(["portDefinitions", 0, "portMapping"], true),202 new Transaction(["portDefinitions", 0, "containerPort"], 80),203 new Transaction(["portDefinitions", 0, "protocol", "udp"], false),204 new Transaction(["portDefinitions", 0, "protocol", "tcp"], true),205 new Transaction(["portDefinitions", 1, "name"], "bar"),206 new Transaction(["portDefinitions", 1, "automaticPort"], false),207 new Transaction(["portDefinitions", 1, "portMapping"], true),208 new Transaction(["portDefinitions", 1, "hostPort"], 10),209 new Transaction(["portDefinitions", 1, "containerPort"], 81),210 new Transaction(["portDefinitions", 1, "protocol", "udp"], false),211 new Transaction(["portDefinitions", 1, "protocol", "tcp"], true),212 new Transaction(["portDefinitions", 1, "loadBalanced"], true),213 new Transaction(["portDefinitions", 1, "vip"], "/:0"),214 new Transaction(["portDefinitions", 1, "vipPort"], "0"),215 new Transaction(["portDefinitions", 1, "labels"], { VIP_1: "/:0" })216 ]);217 });218 it("should not add more from portMappings when less than portDefinitions", function() {219 expect(220 PortMappings.JSONParser({221 type: DOCKER,222 container: {223 docker: {224 network: BRIDGE,225 portMappings: [226 {227 name: "foo",228 hostPort: 0,229 containerPort: 80,230 protocol: "tcp"231 }232 ]233 }234 },235 portDefinitions: [236 {237 name: "foo",238 port: 0,239 protocol: "tcp"240 },241 {242 name: "bar",243 port: 10,244 protocol: "tcp",245 labels: {246 VIP_1: "/:0"247 }248 }249 ]250 })251 ).toEqual([252 new Transaction(["portDefinitions", 0, "name"], "foo"),253 new Transaction(["portDefinitions", 0, "automaticPort"], true),254 new Transaction(["portDefinitions", 0, "portMapping"], true),255 new Transaction(["portDefinitions", 0, "containerPort"], 80),256 new Transaction(["portDefinitions", 0, "protocol", "udp"], false),257 new Transaction(["portDefinitions", 0, "protocol", "tcp"], true)258 ]);259 });260 });...
networks.js
Source:networks.js
1/** @module networks */2module.exports = {3 /** @type {Network} */4 ark: {5 messagePrefix: '\x18Ark Signed Message:\n',6 bip32: {7 public: 0x2bf4968, // base58 will have a prefix 'apub'8 private: 0x2bf4530 // base58Priv will have a prefix 'apriv'9 },10 name: 'mainnet',11 nethash: '6e84d08bd299ed97c212c886c98a57e36545c8f5d645ca7eeae63a8bd62d8988',12 token: 'ARK',13 symbol: 'Ѧ',14 pubKeyHash: 0x17, // Addresses will begin with 'A'15 explorer: 'https://explorer.ark.io',16 wif: 0xaa, // Network prefix for wif generation17 activePeer: {18 ip: 'node1.arknet.cloud',19 port: 400120 },21 peers: [22 { ip: '5.39.9.240', port: 4001 },23 { ip: '5.39.9.241', port: 4001 },24 { ip: '5.39.9.242', port: 4001 },25 { ip: '5.39.9.243', port: 4001 },26 { ip: '5.39.9.244', port: 4001 },27 { ip: '5.39.9.250', port: 4001 },28 { ip: '5.39.9.251', port: 4001 },29 { ip: '5.39.9.252', port: 4001 },30 { ip: '5.39.9.253', port: 4001 },31 { ip: '5.39.9.254', port: 4001 },32 { ip: '5.39.9.255', port: 4001 },33 { ip: '5.39.53.48', port: 4001 },34 { ip: '5.39.53.49', port: 4001 },35 { ip: '5.39.53.50', port: 4001 },36 { ip: '5.39.53.51', port: 4001 },37 { ip: '5.39.53.52', port: 4001 },38 { ip: '5.39.53.53', port: 4001 },39 { ip: '5.39.53.54', port: 4001 },40 { ip: '5.39.53.55', port: 4001 },41 { ip: '37.59.129.160', port: 4001 },42 { ip: '37.59.129.161', port: 4001 },43 { ip: '37.59.129.162', port: 4001 },44 { ip: '37.59.129.163', port: 4001 },45 { ip: '37.59.129.164', port: 4001 },46 { ip: '37.59.129.165', port: 4001 },47 { ip: '37.59.129.166', port: 4001 },48 { ip: '37.59.129.167', port: 4001 },49 { ip: '37.59.129.168', port: 4001 },50 { ip: '37.59.129.169', port: 4001 },51 { ip: '37.59.129.170', port: 4001 },52 { ip: '37.59.129.171', port: 4001 },53 { ip: '37.59.129.172', port: 4001 },54 { ip: '37.59.129.173', port: 4001 },55 { ip: '37.59.129.174', port: 4001 },56 { ip: '37.59.129.175', port: 4001 },57 { ip: '193.70.72.80', port: 4001 },58 { ip: '193.70.72.81', port: 4001 },59 { ip: '193.70.72.82', port: 4001 },60 { ip: '193.70.72.83', port: 4001 },61 { ip: '193.70.72.84', port: 4001 },62 { ip: '193.70.72.85', port: 4001 },63 { ip: '193.70.72.86', port: 4001 },64 { ip: '193.70.72.87', port: 4001 },65 { ip: '193.70.72.88', port: 4001 },66 { ip: '193.70.72.89', port: 4001 },67 { ip: '193.70.72.90', port: 4001 }68 ],69 },70 /** @type {Network} */71 testnet: {72 messagePrefix: '\x18Ark Testnet Signed Message:\n',73 bip32: {74 public: 0x043587cf,75 private: 0x0435839476 },77 name: 'devnet',78 nethash: '578e820911f24e039733b45e4882b73e301f813a0d2c31330dafda84534ffa23',79 token: 'DARK',80 symbol: 'DѦ',81 pubKeyHash: 0x52, // Addresses will begin with 'a'82 explorer: 'https://dexplorer.ark.io',83 wif: 0xba, // Network prefix for wif generation84 activePeer: {85 ip: '104.238.165.129',86 port: 400287 },88 peers: [89 { ip: '45.63.74.5', port: 4002 },90 { ip: '167.114.29.50', port: 4002 },91 { ip: '167.114.29.45', port: 4002 },92 { ip: '167.114.43.35', port: 4002 },93 { ip: '104.129.43.144', port: 4002 },94 { ip: '167.114.29.58', port: 4002 },95 { ip: '173.253.129.20', port: 4002 },96 { ip: '62.113.246.106', port: 4002 },97 { ip: '45.76.218.117', port: 4002 },98 { ip: '158.69.193.185', port: 4002 },99 { ip: '144.217.194.188', port: 4002 },100 { ip: '167.114.29.57', port: 4002 },101 { ip: '167.114.29.40', port: 4002 },102 { ip: '167.114.29.63', port: 4002 },103 { ip: '185.177.21.65', port: 4002 },104 { ip: '167.114.29.62', port: 4002 },105 { ip: '167.114.29.54', port: 4002 },106 { ip: '45.76.139.131', port: 4002 },107 { ip: '138.68.29.19', port: 4002 },108 { ip: '216.174.63.138', port: 4002 },109 { ip: '213.32.9.98', port: 4002 },110 { ip: '137.74.168.191', port: 4002 },111 { ip: '104.236.122.76', port: 4002 },112 { ip: '167.114.29.47', port: 4002 },113 { ip: '167.114.29.37', port: 4002 },114 { ip: '45.63.42.140', port: 4002 },115 { ip: '45.33.86.168', port: 4002 },116 { ip: '108.61.209.209', port: 4002 },117 { ip: '167.114.29.33', port: 4002 },118 { ip: '107.170.196.22', port: 4002 },119 { ip: '178.62.102.209', port: 4002 },120 { ip: '145.239.88.3', port: 4002 },121 { ip: '167.114.43.37', port: 4002 },122 { ip: '145.239.88.2', port: 4002 },123 { ip: '217.182.70.37', port: 4002 },124 { ip: '185.5.54.0', port: 4002 },125 { ip: '45.76.174.177', port: 4002 },126 { ip: '216.174.63.137', port: 4002 },127 { ip: '167.114.29.59', port: 4002 },128 { ip: '104.238.165.129', port: 4002 },129 { ip: '217.182.79.88', port: 4002 },130 { ip: '167.114.29.61', port: 4002 },131 { ip: '51.255.198.137', port: 4002 },132 { ip: '167.114.29.38', port: 4002 },133 { ip: '167.114.43.33', port: 4002 },134 { ip: '45.77.117.174', port: 4002 },135 { ip: '213.32.9.97', port: 4002 },136 { ip: '193.70.1.222', port: 4002 },137 { ip: '45.76.39.61', port: 4002 },138 { ip: '204.10.184.45', port: 4002 },139 { ip: '45.76.93.4', port: 4002 },140 { ip: '167.114.29.46', port: 4002 },141 { ip: '91.121.1.174', port: 4002 },142 { ip: '165.227.59.129', port: 4002 },143 { ip: '167.114.29.44', port: 4002 },144 { ip: '139.99.156.231', port: 4002 },145 { ip: '164.8.251.90', port: 4002 },146 { ip: '167.114.29.56', port: 4002 },147 { ip: '108.61.169.37', port: 4002 },148 { ip: '104.238.189.78', port: 4002 },149 { ip: '173.254.228.67', port: 4002 },150 { ip: '204.10.184.46', port: 4002 },151 { ip: '66.70.207.89', port: 4002 },152 { ip: '172.110.20.39', port: 4002 },153 { ip: '137.74.47.141', port: 4002 },154 { ip: '167.114.29.41', port: 4002 },155 { ip: '167.114.29.52', port: 4002 },156 { ip: '167.114.43.41', port: 4002 },157 { ip: '51.254.103.18', port: 4002 },158 { ip: '167.114.43.47', port: 4002 },159 { ip: '45.76.136.154', port: 4002 },160 { ip: '167.114.29.39', port: 4002 },161 { ip: '167.114.29.34', port: 4002 },162 { ip: '138.197.165.165', port: 4002 },163 { ip: '167.114.43.34', port: 4002 },164 { ip: '145.239.88.101', port: 4002 },165 { ip: '45.76.245.155', port: 4002 },166 { ip: '167.114.43.43', port: 4002 },167 { ip: '91.134.115.30', port: 4002 },168 { ip: '46.231.204.207', port: 4002 },169 { ip: '167.114.43.46', port: 4002 },170 { ip: '138.197.29.215', port: 4002 },171 { ip: '104.238.177.174', port: 4002 },172 { ip: '109.154.47.137', port: 4002 },173 { ip: '104.207.138.122', port: 4002 },174 { ip: '138.68.21.196', port: 4002 },175 { ip: '167.114.29.36', port: 4002 },176 { ip: '165.227.150.45', port: 4002 },177 { ip: '37.59.70.165', port: 4002 },178 { ip: '94.177.218.138', port: 4002 },179 { ip: '167.114.29.55', port: 4002 },180 { ip: '51.254.201.227', port: 4002 },181 { ip: '167.114.43.48', port: 4002 },182 { ip: '104.154.82.122', port: 4002 },183 { ip: '217.182.78.226', port: 4002 },184 { ip: '207.154.220.137', port: 4002 },185 { ip: '195.181.219.91', port: 4002 },186 { ip: '192.155.91.248', port: 4002 },187 { ip: '167.114.29.53', port: 4002 },188 { ip: '43.224.34.53', port: 4002 },189 { ip: '167.114.43.40', port: 4002 },190 { ip: '138.197.206.43', port: 4002 }191 ]192 },193 /** @type {Network} */194 bitcoin: {195 messagePrefix: '\x18Bitcoin Signed Message:\n',196 bip32: {197 public: 0x0488b21e,198 private: 0x0488ade4199 },200 pubKeyHash: 0x00,201 wif: 0x80202 }...
openolt_statistics.py
Source:openolt_statistics.py
...34 # if port_stats.intf_id in [129, 130, 131]:35 # self.log.debug('those uplinks are not created')36 # return37 # # update port object stats38 # port = self.device.adapter_agent.get_port(self.device.device_id,39 # port_no=port_stats.intf_id)40 #41 # if port is None:42 # self.log.warn('port associated with this stats does not exist')43 # return44 #45 # port.rx_packets = port_stats.rx_packets46 # port.rx_bytes = port_stats.rx_bytes47 # port.rx_errors = port_stats.rx_error_packets48 # port.tx_packets = port_stats.tx_packets49 # port.tx_bytes = port_stats.tx_bytes50 # port.tx_errors = port_stats.tx_error_packets51 #52 # # Add port does an update if port exists53 # self.device.adapter_agent.add_port(self.device.device_id, port)54 def flow_statistics_indication(self, flow_stats):55 self.log.info('flow-stats-collected', stats=flow_stats)56 # TODO: send to kafka ?57 # FIXME: etcd problem, do not update objects for now58 # # UNTESTED : the openolt driver does not yet provide flow stats59 # self.device.adapter_agent.update_flow_stats(self.device.logical_device_id,60 # flow_id=flow_stats.flow_id, packet_count=flow_stats.tx_packets,61 # byte_count=flow_stats.tx_bytes)62 def ports_statistics_kpis(self, port_stats):63 pm_data = {}64 pm_data["rx_bytes"] = port_stats.rx_bytes65 pm_data["rx_packets"] = port_stats.rx_packets66 pm_data["rx_ucast_packets"] = port_stats.rx_ucast_packets67 pm_data["rx_mcast_packets"] = port_stats.rx_mcast_packets68 pm_data["rx_bcast_packets"] = port_stats.rx_bcast_packets69 pm_data["rx_error_packets"] = port_stats.rx_error_packets70 pm_data["tx_bytes"] = port_stats.tx_bytes71 pm_data["tx_packets"] = port_stats.tx_packets72 pm_data["tx_ucast_packets"] = port_stats.tx_ucast_packets73 pm_data["tx_mcast_packets"] = port_stats.tx_mcast_packets74 pm_data["tx_bcast_packets"] = port_stats.tx_bcast_packets75 pm_data["tx_error_packets"] = port_stats.tx_error_packets76 pm_data["rx_crc_errors"] = port_stats.rx_crc_errors77 pm_data["bip_errors"] = port_stats.bip_errors78 prefix = 'voltha.openolt.{}'.format(self.device.device_id)79 # FIXME80 if port_stats.intf_id < 132:81 prefixes = {82 prefix + 'nni.{}'.format(port_stats.intf_id): MetricValuePairs(83 metrics=pm_data)84 }85 else:86 prefixes = {87 prefix + '.pon.{}'.format(platform.intf_id_from_pon_port_no(88 port_stats.intf_id)): MetricValuePairs(89 metrics=pm_data)90 }91 kpi_event = KpiEvent(92 type=KpiEventType.slice,93 ts=port_stats.timestamp,94 prefixes=prefixes)95 self.device.adapter_agent.submit_kpis(kpi_event)96 def update_logical_port_stats(self, port_stats):97 # FIXME98 label = 'nni-{}'.format(port_stats.intf_id)99 try:100 logical_port = self.device.adapter_agent.get_logical_port(101 self.device.logical_device_id, label)102 except KeyError as e:103 self.log.warn('logical port was not found, it may not have been '104 'created yet', exception=e)105 return106 if logical_port is None:107 self.log.error('logical-port-is-None',108 logical_device_id=self.device.logical_device_id, label=label,109 port_stats=port_stats)110 return111 logical_port.ofp_port_stats.rx_packets = port_stats.rx_packets112 logical_port.ofp_port_stats.rx_bytes = port_stats.rx_bytes113 logical_port.ofp_port_stats.tx_packets = port_stats.tx_packets114 logical_port.ofp_port_stats.tx_bytes = port_stats.tx_bytes115 logical_port.ofp_port_stats.rx_errors = port_stats.rx_error_packets116 logical_port.ofp_port_stats.tx_errors = port_stats.tx_error_packets117 logical_port.ofp_port_stats.rx_crc_err = port_stats.rx_crc_errors118 self.log.debug('after-stats-update', port=logical_port)119 self.device.adapter_agent.update_logical_port(...
serialport-basic.js
Source:serialport-basic.js
1"use strict";2var sinon = require("sinon");3var chai = require('chai');4var expect = chai.expect;5var MockedSerialPort = require('../test_mocks/linux-hardware');6var SerialPort = MockedSerialPort.SerialPort;7var hardware = MockedSerialPort.hardware;8describe('SerialPort', function () {9 var sandbox;10 beforeEach(function () {11 sandbox = sinon.sandbox.create();12 // Create a port for fun and profit13 hardware.reset();14 hardware.createPort('/dev/exists');15 });16 afterEach(function () {17 sandbox.restore();18 });19 describe('Constructor', function () {20 it("opens the port immediately", function (done) {21 var port = new SerialPort('/dev/exists', function (err) {22 expect(err).to.not.be.ok;23 done();24 });25 });26 it('emits an error on the factory when erroring without a callback', function (done) {27 // finish the test on error28 MockedSerialPort.once('error', function (err) {29 chai.assert.isDefined(err, "didn't get an error");30 done();31 });32 var port = new SerialPort('/dev/johnJacobJingleheimerSchmidt');33 });34 it('errors with invalid databits', function (done) {35 var errorCallback = function (err) {36 chai.assert.isDefined(err, 'err is not defined');37 done();38 };39 var port = new SerialPort('/dev/exists', { databits : 19 }, false, errorCallback);40 });41 it('allows optional options', function (done) {42 var cb = function () {};43 var port = new SerialPort('/dev/exists', cb);44 expect(typeof port.options).to.eq('object');45 done();46 });47 });48 describe('reading data', function () {49 it('emits data events by default', function (done) {50 var testData = new Buffer("I am a really short string");51 var port = new SerialPort('/dev/exists', function () {52 port.once('data', function(recvData) {53 expect(recvData).to.eql(testData);54 done();55 });56 hardware.emitData('/dev/exists', testData);57 });58 });59 it('calls the dataCallback if set', function (done) {60 var testData = new Buffer("I am a really short string");61 var opt = {62 dataCallback: function (recvData) {63 expect(recvData).to.eql(testData);64 done();65 }66 };67 var port = new SerialPort('/dev/exists', opt, function () {68 hardware.emitData('/dev/exists', testData);69 });70 });71 });72 describe('#open', function () {73 it('passes the port to the bindings', function (done) {74 var openSpy = sandbox.spy(MockedSerialPort.SerialPortBinding, 'open');75 var port = new SerialPort('/dev/exists', {}, false);76 port.open(function (err) {77 expect(err).to.not.be.ok;78 expect(openSpy.calledWith('/dev/exists'));79 done();80 });81 });82 it('calls back an error when opening an invalid port', function (done) {83 var port = new SerialPort('/dev/unhappy', {}, false);84 port.open(function (err) {85 expect(err).to.be.ok;86 done();87 });88 });89 it("emits data after being reopened", function (done) {90 var data = new Buffer("Howdy!");91 var port = new SerialPort('/dev/exists', function () {92 port.close();93 port.open(function () {94 port.once('data', function (res) {95 expect(res).to.eql(data);96 done();97 });98 hardware.emitData('/dev/exists', data);99 });100 });101 });102 });103 describe('close', function () {104 it("fires a close event when it's closed", function (done) {105 var port = new SerialPort('/dev/exists', function () {106 var closeSpy = sandbox.spy();107 port.on('close', closeSpy);108 port.close();109 expect(closeSpy.calledOnce);110 done();111 });112 });113 it("fires a close event after being reopened", function (done) {114 var port = new SerialPort('/dev/exists', function () {115 var closeSpy = sandbox.spy();116 port.on('close', closeSpy);117 port.close();118 port.open();119 port.close();120 expect(closeSpy.calledTwice);121 done();122 });123 });124 });125 describe('disconnect', function () {126 it("fires a disconnect event", function (done) {127 var port = new SerialPort('/dev/exists', {128 disconnectedCallback: function (err) {129 expect(err).to.not.be.ok;130 done();131 }132 }, function () {133 hardware.disconnect('/dev/exists');134 });135 });136 });...
Using AI Code Generation
1import { render } from 'react-dom';2import { getStorybookUI, configure } from '@storybook/react-native';3import './rn-addons';4configure(() => {5 require('./stories');6}, module);7const StorybookUIRoot = getStorybookUI({ port: 7007, host: 'localhost' });8export default StorybookUIRoot;9import React from 'react';10import { View, Text, StyleSheet } from 'react-native';11import StorybookUIRoot from './test';12const App = () => {13 return (14 <View style={styles.container}>15 <Text style={styles.text}>Hello World!</Text>16 );17};18const styles = StyleSheet.create({19 container: {20 },21 text: {22 },23});24export default App;
Using AI Code Generation
1const port = require('storybook-root').port;2console.log(port);3const port = require('storybook-root').port;4console.log(port);5const port = require('storybook-root').port;6console.log(port);7const port = require('storybook-root').port;8console.log(port);9const port = require('storybook-root').port;10console.log(port);11const port = require('storybook-root').port;12console.log(port);13const port = require('storybook-root').port;14console.log(port);15const port = require('storybook-root').port;16console.log(port);17const port = require('storybook-root').port;18console.log(port);19const port = require('storybook-root').port;20console.log(port);21const port = require('storybook-root').port;22console.log(port);23const port = require('storybook-root').port;24console.log(port);25const port = require('storybook-root').port;26console.log(port);27const port = require('storybook-root').port;28console.log(port);29const port = require('storybook-root').port;30console.log(port);31const port = require('storybook-root').port;32console.log(port);
Using AI Code Generation
1import { withPort } from 'storybook-root-decorator';2import { storiesOf } from '@storybook/react';3import { withKnobs } from '@storybook/addon-knobs';4storiesOf('Port', module)5 .addDecorator(withPort())6 .addDecorator(withKnobs)7 .add('Default', () => <div>Port</div>);8@import '~storybook-root-decorator/dist/styles/port';9#port {10 background: red;11}12@import '~storybook-root-decorator/dist/styles/port';13#port {14 background: red;15}16@import '~storybook-root-decorator/dist/styles/port'17@import '~storybook-root-decorator/dist/styles/port';18#port {19 background: red;20}21@import '~storybook-root-decorator/dist/styles/port'22@import '~storybook-root-decorator/dist/styles/port'23@import '~storybook-root-decorator/dist/styles/port'24@import '~storybook-root-decorator/dist/styles/port'25@import '~storybook-root-decorator/dist/styles/port'26@import '~storybook-root-decorator/dist/styles/port'
Using AI Code Generation
1import { render } from 'react-dom'2import React from 'react'3import { storiesOf } from '@storybook/react'4import { action } from '@storybook/addon-actions'5import Button from './Button'6storiesOf('Button', module)7 .add('with text', () => (8 <Button onClick={action('clicked')}>Hello Button</Button>9 .add('with some emoji', () => (10 <Button onClick={action('clicked')}>😀 😎 👍 💯</Button>11import { render } from 'react-dom'12import React from 'react'13import { storiesOf } from 'storybook-root'14import Button from './Button'15storiesOf('Button', module)16 .add('with text', () => (17 <Button onClick={action('clicked')}>Hello Button</Button>18 .add('with some emoji', () => (19 <Button onClick={action('clicked')}>😀 😎 👍 💯</Button>20import { render } from 'react-dom'21import React from 'react'22import { storiesOf } from 'storybook-root'23import Button from './Button'24storiesOf('Button', module)25 .add('with text', () => (26 <Button onClick={action('clicked')}>Hello Button</Button>27 .add('with some emoji', () => (28 <Button onClick={action('clicked')}>😀 😎 👍 💯</Button>29import { render } from 'react-dom'30import React from 'react'31import { storiesOf } from 'storybook-root'32import Button from './Button'33storiesOf('Button', module)34 .add('with text', () => (35 <Button onClick={action('clicked')}>Hello Button</Button>36 .add('with some emoji', () => (37 <Button onClick={action('clicked')}>😀 😎 👍 💯</Button>38import { render } from 'react-dom'39import React from 'react'40import { storiesOf } from 'storybook-root'41import Button from './Button'42storiesOf('Button', module)43 .add('with text', () => (
Using AI Code Generation
1import { configure } from '@storybook/react';2function loadStories() {3 require('../stories');4}5configure(loadStories, module);6import { configure, addDecorator } from '@storybook/react';7import { setOptions } from '@storybook/addon-options';8import { withKnobs } from '@storybook/addon-knobs';9import { withInfo } from '@storybook/addon-info';10import { withOptions } from '@storybook/addon-options';11import { withA11y } from '@storybook/addon-a11y';12import { setDefaults } from '@storybook/addon-info';13import { withStorySource } from '@storybook/addon-storysource';14setDefaults({15 styles: {16 header: {17 h1: {18 },19 body: {20 },21 h2: {22 },23 },24 infoBody: {25 },26 source: {27 h1: {28 h2: {29 },30 },31 },32 },33});34addDecorator(withInfo);35setOptions({
Using AI Code Generation
1import { port } from 'storybook-root-cause';2module.exports = {3 port: () => {4 return 9001;5 }6};7import { port } from 'storybook-root-cause';8port();9module.exports = {10 port: () => {11 return 9001;12 }13};14import { port } from 'storybook-root-cause';15port();16module.exports = {17 port: () => {18 return 9001;19 }20};21import { port } from 'storybook-root-cause';22port();23module.exports = {24 port: () => {25 return 9001;26 }27};28import { port } from 'storybook-root-cause';29port();30module.exports = {31 port: () => {32 return 9001;33 }34};
Using AI Code Generation
1import { port } from "storybook-root";2port("test.js");3import { port } from "storybook-root";4port("test.js");5import { port } from "storybook-root";6port("test.js");7import { port } from "storybook-root";8port("test.js");9import { port } from "storybook-root";10port("test.js");11import { port } from "storybook-root";12port("test.js");13import { port } from "storybook-root";14port("test.js");15import { port } from "storybook-root";16port("test.js");17import { port } from "storybook-root";18port("test.js");19import { port } from "storybook-root";20port("test.js");21import { port } from "storybook-root";22port("test.js");23import { port } from "storybook-root";24port("test.js");25import { port } from "storybook-root";26port("test.js");27import { port } from "storybook-root";28port("test.js");29import { port } from "storybook-root";30port("test.js");31import { port } from "storybook-root";32port("test.js");33import { port } from "storybook-root";34port("test.js");35import { port } from "storybook-root";36port("test.js");
Using AI Code Generation
1const { createPort } = require("storybook-root-cause");2const { withStorybookRootCause } = require("storybook-root-cause/dist/withStorybookRootCause");3const { configure } = require("@storybook/react");4const { getStorybook } = require("@storybook/react");5const port = createPort();6const stories = getStorybook();7const config = {8 stories: stories.map((story) => ({9 kind: story.kind.replace(" ", "-"),10 })),11};12withStorybookRootCause(config);13import { withStorybookRootCause } from "storybook-root-cause";14import { configure } from "@storybook/react";15import { getStorybook } from "@storybook/react";16const stories = getStorybook();17const config = {18 stories: stories.map((story) => ({19 kind: story.kind.replace(" ", "-"),20 })),21};22configure(() => stories.forEach((story) => withStorybookRootCause(story, config)), module);23const { withStorybookRootCause } = require("storybook-root-cause");24const { getStorybook } = require("@storybook/react");25const stories = getStorybook();26const config = {27 stories: stories.map((story) => ({28 kind: story.kind.replace(" ", "-"),29 })),30};31module.exports = {32 process(src, path) {33 if (path.includes(".stories.")) {34 return withStorybookRootCause(src, config);35 }36 return src;37 },38};39module.exports = {40 transform: {41 },42};
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!