Jest is a delightful JavaScript Testing Framework with a focus on simplicity. And it is more and more popular because of simple and better engineer producitivity.
Compared to the conventional Javascript test runner Karma + Jasmine, Jest is much more lightweight and faster. It has the following benifits:
- Headless browser environment: No need to open the real browsers as what Karma does, it saves much more time.
- Possible to rum multiple tests in parallel: benefit from the lightweight of the headless browser environment.
- Snapshot testing, a useful feature which is not available in Jasmine
- Easier to use
- CLI: filter by a filename or test name regex pattern (reducing the need for fdescribe) and rerun tests
- Low configuration needed to get started
- Clear documentation which makes it easy to adjust Jest to your needs
- Testing is stable: no more sudden test runner failures while writing tests
So we want to migrate our tests from Karma + Jasmine to Jest.
However, the headless browser of Jest is not the real browser, it is based on the JSDOM, and it has still some compatibility issues. In this project, we explored all the compatibility issues and summarize them as a comparison Matrix. It will be a good reference for anyone who wants to migrate tests to Jest.
In this project, we provided 65 test cases, each test case provides a stand-alone in Angular 7 to demonstrate the compatibility issues of JSDOM.
- Node 8+
- NPM or yarn
- Git
- Safari, Chrome, Firefox
- Click the link in the following comparison matrix to see the source code of each test case.
- Follow the README of the test case source code to run the test.
Test Case | Description | Jest (JSDOM) | Karma (Chrome (R)) | Karma (Safari (R)) | Karma (Firefox (R)) | References |
---|---|---|---|---|---|---|
Test case 1 | In Jest document.activeElement is incorrect after the contenteditable element is focused | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/2 - jsdom/jsdom#2472 |
Test case 2 | In Jest, selector is not working same as in browsers | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/3 - jsdom/jsdom#2528 |
Test case 3 | Style property does not change when assign empty string in Jest | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/4 - jsdom/jsdom#2504 |
Test case 4 | Notification API missing in Jest | ❌ Failed | ✔️ Successful | ✔️ Successful (will show ERROR: 'ERROR CONTEXT', DebugContext_ in console ) |
✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/5 - jsdom/jsdom#1862 |
Test case 5 | Jest doesn't support Cryto API | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/6 - jsdom/jsdom#1612 - https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API - https://www.w3.org/TR/WebCryptoAPI/ |
Test case 6 | Jest doesn't support TextEncoder | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/7 - jsdom/jsdom#2524 - https://developer.mozilla.org/en-US/docs/Web/API/Encoding_API |
Test case 7 | JSDOM selector doesn't support innerText | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/9 - jsdom/jsdom#1245 |
Test case 8 | SVGElement style values are empty in JSDOM | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/10 - jsdom/jsdom#2384 |
Test case 9 | JSDOM silently eats 'calc' and viewport units | ❌ Failed | ✔️ Successful | ✔️ Successful | ❌ Failed Firefox is failed due to getting calc(20% + 10px) when assigned calc(10px + 20%) |
- https://gitlab.com/jest-risk-discovery/test-cases-design/issues/11 - jsdom/jsdom#1332 |
Test case 10 | JSDOM doesn't apply CSS custom properties | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/12 - jsdom/jsdom#1895 |
Test case 11 | JSDOM unsets style.border when it is set to 'none' | ❌ Failed | ✔️ Successful | ❌ Failed | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/13 - jsdom/jsdom#1910 |
Test case 12 | JSDOM doesn't implement offsetTop & offsetLeft & offsetBottom & offsetRight | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/14 - jsdom/jsdom#135 - https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetLeft |
Test case 13 | JSDOM can't get transform property of SVG | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/15 - jsdom/jsdom#2531 |
Test case 14 | JSDOM parsed XML doc's XPath queries fail with upper case attributes | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/16 - jsdom/jsdom#2530 - JSDOM use a different XPath parser that is not well implemented and buggy. But they are considering switching to a well-maintained 3rd one. |
Test case 15 | PointerEvent is not available in JSDOM | ❌ Failed | ✔️ Successful | ❌ Failed | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/17 - jsdom/jsdom#2527 - https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent |
Test case 16 | JSDOM bug - Creating FormData from form fails on input with no value set | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/18 - jsdom/jsdom#2523 - https://github.com/jsdom/jsdom/blob/16d3913eea0360c7757e75f7e266c3873c85b7dd/lib/jsdom/living/xhr/FormData-impl.js#L149 - https://github.com/jsdom/jsdom/blob/16d3913eea0360c7757e75f7e266c3873c85b7dd/lib/jsdom/living/xhr/FormData-impl.js#L163 - This is a bug in JSDOM FormData implementation, see line 149 and 163 |
Test case 17 | JSDOM, CssStyleDeclaration doesn't apply color style when using keywords | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/19 - jsdom/jsdom#2516 - https://github.com/jsakas/CSSStyleDeclaration - This is a bug of cssstyle project, which is a dependency of JSDOM |
Test case 18 | JSDOM doesn't ignore invalid style properties | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/20 - jsdom/jsdom#2513 - jestjs/jest#7920 - This is inappropriate implementation of JSDOM |
Test case 19 | JSDOM, 'as' attribute is not implemented in Link tag | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/22 - jsdom/jsdom#2471 - Link tag in JSDOM is not implemented appropriately, as attribute is ignored |
Test case 20 | JSDOM doesn't implement MessageChannel | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/23 - jsdom/jsdom#2448 - https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel - MessageChannel API is a common feature implemented in mainstream browsers |
Test case 21 | JSDOM doesn't support Cache api | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/24 - jsdom/jsdom#2422 - jestjs/jest#7365 |
Test case 22 | JSDOM, inline background-position with 0 value wil be accidentally stripped | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/25 - jsdom/jsdom#2328 - JSDOM stripped background-position with 0 value, but works for background-position: 50% 30% with none-zero value |
Test case 23 | JSDOM doesn't support layout property like clientWidth, clientHeight, getBoundingClientRect due to lacking in layout engine | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/26 - jsdom/jsdom#2310 - jsdom/jsdom#1322 |
Test case 24 | JSDOM doesn't support Image.decode method | ❌ Failed | ✔️ Successful | ✔️ Successful | ❌ Failed | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/28 - jsdom/jsdom#2154 - https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-decode - jsdom/jsdom#2154 - Both JSDOM anf Firefox doesn't support Image.decode method, But it's supported in Chrome and Safari |
Test case 25 | Text.textContent doesn't inherit from Node.textContent in JSDOM | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/29 - jsdom/jsdom#2144 - https://github.com/jsdom/jsdom#shared-constructors-and-prototypes |
Test case 26 | JSDOM doesn't support for window.performance.navigation | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/30 - jsdom/jsdom#2136 - Missing api, it's not likely the JSDOM team is going to support it |
Test case 27 | In JSDOM, querySelectorAll doesn't support namespaced attributes | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/31 - jsdom/jsdom#2028 |
Test case 28 | JSDOM doesn't support the pseudo-element of CSS | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/32 - jsdom/jsdom#1928 |
Test case 29 | JSDOM doesn't implement Selection API (window.getSelection()) | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/33 - Since JSDOM doesn't implement Selection API, that means jest is not suitable for testing web editors |
Test case 30 | In JSDOM, HSL Color Assign effect is different in browers | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/34 - jsdom/jsdom#825 |
Test case 31 | JSDOM doesn't get current textTracks of video node | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/35 - jsdom/jsdom#2541 |
Test case 32 | JSDOM doesn't support worker thread API |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/36 - jsdom/jsdom#2020 |
Test case 33 | In JSDOM, window.getComputedStyle doesn't work | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/37 - jsdom/jsdom#2363 |
Test case 34 | JSDOM dosn't support queueMicrotask API | ❌ Failed | ✔️ Successful | ❌ Failed | ❌ Failed | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/38 - jsdom/jsdom#2518 - https://github.com/whatwg/html/commit/9d7cf125f960e6bb8d9b7c9456595f505f2e9d4b |
Test case 35 | ValidityState patternMismatch is incorrectly implemented in JSDOM | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/39 - jsdom/jsdom#2494 - queueMicrotask is a new HTML spec proposal (proposed on Aug 2018) and not supported in most modern browsers, so currently, it's not commonly used in practice. |
Test case 36 | JSDOM does not support PromiseRejectionEvent | ❌ Failed | ✔️ Successful | ✔️ Successful | ❌ Failed | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/39 - jsdom/jsdom#2494 |
Test case 37 | JSDOM failed to report "illegal invocation" when using nodes' proxies | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/42 - jsdom/jsdom#2265 - This could probably be fixed by using WeakMaps instead of symbols in webidl2js. |
Test case 38 | JSDOM doesn't implement Comment interface correctly | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/43 - https://developer.mozilla.org/en-US/docs/Web/API/Comment |
Test case 39 | JSDOM Node.replacechild removes identical elements |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/44 - https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore - (Potential fix)https://github.com/yefremov/jsdom/commit/8708d4144b66cc03b870840251e9fe36cc806ebd |
Test case 40 | JSDOM maxLength property value is incorrect when it is not set |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/45 - jsdom/jsdom#522 - https://html.spec.whatwg.org/#the-maxlength-and-minlength-attributes |
Test case 41 | JSDOM doesn't support XMLSerializer |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/46 - https://developer.mozilla.org/en-US/docs/Web/API/XMLSerializer - jsdom/jsdom#1368 - jsdom/jsdom#2282 - https://github.com/theneva/jest-environment-jsdom-thirteen |
Test case 42 | JSDOM only supports subset of performance apis |
❌ Failed Not support clearMarks clearMeasures clearResourceTimings getEntries getEntriesByName getEntriesByType mark measure setResourceTimingBufferSize |
✔️ Successful | ❌ Failed (misses toJSON and timeOrigin) |
✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/47 - https://developer.mozilla.org/en-US/docs/Web/API/Performance |
Test case 43 | JSDOM doesn't support Pointer Lock API |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/48 - https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API |
Test case 44 | JSDOM only supports subsets of Navigator API |
❌ Failed Not support navigator.doNotTrack navigator.geolocation navigator.getGamepads navigator.maxTouchPoints navigator.mediaDevice snavigator.serviceWorker navigator.sendBeacon navigator.requestMediaKeySystemAccess |
✔️ Successful | ❌ Failed Not support navigator.hardwareConcurrency navigator.maxTouchPoints navigator.requestMediaKeySystemAccess |
✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/49 - https://developer.mozilla.org/en-US/docs/Web/API/Navigator - https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/navigator/Navigator-impl.js |
Test case 45 | JSDOM NodeList doesn't support entries, forEach, keys, values method |
❌ Failed Not support NodeList.item NodeList.entries NodeList.forEach NodeList.keys NodeList.values |
✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/50 - https://developer.mozilla.org/en-US/docs/Web/API/NodeList - https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/nodes/NodeList-impl.js#L23 |
Test case 46 | JSDOM only supports subsets of events for Document.createEvent |
❌ Failed Not support beforeunloadevent compositionevent devicemotionevent deviceorientationevent dragevent storageevent textevent |
✔️ Successful Not support touchEvent (Desktop version) |
❌ Failed Not support: touchevent (Desktop version)devicemotionevent (Desktop version)deviceorientationevent (Desktop version)dragevent |
✔️ Successful Not support touchEvent (Desktop version) |
- https://gitlab.com/jest-risk-discovery/test-cases-design/issues/51 - https://dom.spec.whatwg.org/#dom-document-createevent - https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/nodes/Document-impl.js#L89 |
Test case 47 | JSDOM doesn't support TransitionEvent |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/52 - jsdom/jsdom#1781 - https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent |
Test case 48 | JSDOM's iframe doesn't define sandbox attribute |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/53 - jsdom/jsdom#1892 - https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe |
Test case 49 | JSDOM doesn't support IntersectionObserver API |
❌ Failed | ✔️ Successful | ❌ Failed | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/54 - jsdom/jsdom#2032 - https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver |
Test case 50 | JSDOM SVG basic geometric shapes (such as SVGPathElement) are not implemented |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/55 - jsdom/jsdom#2128 |
Test case 51 | JSDOM doesn't support Touch interface |
❌ Failed | ✔️ Successful | ❌ Failed | ❌ Failed | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/56 - jsdom/jsdom#2152 - https://w3c.github.io/touch-events/#touch-interface |
Test case 52 | JSDOM styles don't inherit |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/59 - jsdom/jsdom#2160 - The issue is that the JSDOM implements cascading, but not inheritance. Inheritance is harder |
Test case 53 | JSDOM ImageData API is not supported globally |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/60 - jsdom/jsdom#1749 - https://developer.mozilla.org/en-US/docs/Web/API/ImageData - currently it's only defined under Canvas |
Test case 54 | JSDOM doesn't support execCommand api |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/61 - jsdom/jsdom#1742 - mattermost/mattermost-webapp#228 - nadbm/react-datasheet#123 |
Test case 55 | JSDOM doesn't support URL.createObjectURL and URL.revokeObjectURL |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/62 - jsdom/jsdom#1721 - https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL - https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL |
Test case 56 | JSDOM doesn't support scrollIntoView method |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/62 - jsdom/jsdom#1695 - https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView - Polyfill: Element.prototype.scrollIntoView = jest.fn() |
Test case 57 | JSDOM element.scrollHeight always returns 0 |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/65 - jsdom/jsdom#1013 - https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight - mui/material-ui#5015 |
Test case 58 | JSDOM HTMLInputElement is not instanceof Object |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/66 - jsdom/jsdom#1769 |
Test case 59 | JSDOM doesn't support WebRTC |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/67 - jsdom/jsdom#1746 - https://developer.mozilla.org/zh-CN/docs/Web/API/WebRTC_API - Possible solution: https://github.com/vmolsa/webrtc-native |
Test case 60 | JSDOM doesn't support IndexedDB |
❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/68 - jsdom/jsdom#1748 - denoland/deno#1699 |
Test case 61 | JSDOM doesn't support fetch API | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/69 - jsdom/jsdom#1724 - https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API |
Test case 62 | JSDOM doesn't support clipboard API | ❌ Failed | ✔️ Successful | ❌ Failed | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/70 - jsdom/jsdom#1568 - https://developer.mozilla.org/en-US/docs/Web/API/Clipboard |
Test case 63 | JSDOM does not support Range and Traversal API | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/72 - jsdom/jsdom#317 - https://developer.mozilla.org/en-US/docs/Web/API/Range - https://github.com/mui-org/material-ui/blob/57e8a88faeebba4d67aaaf6c5b178ebfe97264a6/test/utils/createDOM.js#L13 |
Test case 64 | JSDOM doesn't support webcomponents api | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/73 - jsdom/jsdom#1030 - https://developer.mozilla.org/en-US/docs/Web/Web_Components |
Test case 65 | JSDOM does not implement HTMLMediaElement.prototype.load | ❌ Failed | ✔️ Successful | ✔️ Successful | ✔️ Successful | - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/74 - jsdom/jsdom#1515 |
Jest JSDOM Browser compability result and all the test case scripts are open-sourced under Apache 2.0 and is released AS-IS WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND under the terms of Section 7 of the Apache license.
T-Mobile® has made every reasonable effort to test the code for its intended purpose, as anticipated by T-Mobile®. T-Mobile® further acknowledges that the code may be used on a wide range of platforms and in many different contexts. Accordingly, it is likely that the code will need to be modified. Please have your IT team validate the code prior to any production use.