UNPKG

@itwin/presentation-testing

Version:

Testing utilities for iTwin.js Presentation library

166 lines 6.96 kB
"use strict"; /*--------------------------------------------------------------------------------------------- * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ /** @packageDocumentation * @module Helpers */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.terminate = exports.initialize = exports.HierarchyCacheMode = void 0; exports.safeDispose = safeDispose; const path_1 = require("path"); const core_backend_1 = require("@itwin/core-backend"); const core_bentley_1 = require("@itwin/core-bentley"); const core_common_1 = require("@itwin/core-common"); const core_frontend_1 = require("@itwin/core-frontend"); const presentation_backend_1 = require("@itwin/presentation-backend"); Object.defineProperty(exports, "HierarchyCacheMode", { enumerable: true, get: function () { return presentation_backend_1.HierarchyCacheMode; } }); const presentation_common_1 = require("@itwin/presentation-common"); const presentation_frontend_1 = require("@itwin/presentation-frontend"); const FilenameUtils_js_1 = require("./FilenameUtils.js"); function initializeRpcInterfaces(interfaces) { const config = class extends core_common_1.RpcDefaultConfiguration { interfaces = () => interfaces; }; for (const definition of interfaces) { // eslint-disable-next-line @itwin/no-internal core_common_1.RpcConfiguration.assign(definition, /* istanbul ignore next */ () => config); } const instance = core_common_1.RpcConfiguration.obtain(config); try { core_common_1.RpcConfiguration.initializeInterfaces(instance); /* c8 ignore start */ } catch { // this may fail with "Error: RPC interface "xxx" is already initialized." because // multiple different tests want to set up rpc interfaces } /* c8 ignore end */ } let isInitialized = false; /** * Initialize the framework for presentation testing. The function sets up backend, * frontend and RPC communication between them. * * @see `terminate` * * @public */ const initialize = async (props) => { if (isInitialized) { return; } if (!props) { props = {}; } core_bentley_1.Logger.initializeToConsole(); core_bentley_1.Logger.setLevelDefault(core_bentley_1.LogLevel.Warning); core_bentley_1.Logger.setLevel("i18n", core_bentley_1.LogLevel.Error); core_bentley_1.Logger.setLevel("SQLite", core_bentley_1.LogLevel.Error); core_bentley_1.Logger.setLevel(presentation_backend_1.PresentationBackendNativeLoggerCategory.ECObjects, core_bentley_1.LogLevel.Warning); // set up rpc interfaces initializeRpcInterfaces(props.rpcs ?? [core_common_1.IModelReadRpcInterface, presentation_common_1.PresentationRpcInterface]); // init backend // make sure backend gets assigned an id which puts its resources into a unique directory props.backendProps = props.backendProps ?? {}; if (!props.backendProps.id) { props.backendProps.id = `test-${core_bentley_1.Guid.createValue()}`; } await core_backend_1.IModelHost.startup({ cacheDir: (0, path_1.join)((0, FilenameUtils_js_1.getTestOutputDir)(), ".cache", `${process.pid}`), ...props.backendHostProps, }); presentation_backend_1.Presentation.initialize(props.backendProps); // init frontend if (!props.frontendApp) { props.frontendApp = core_frontend_1.NoRenderApp; } await props.frontendApp.startup(props.frontendAppOptions); const defaultFrontendProps = { presentation: { activeLocale: core_frontend_1.IModelApp.localization.getLanguageList()[0], }, }; await presentation_frontend_1.Presentation.initialize({ ...defaultFrontendProps, ...props.frontendProps }); (0, FilenameUtils_js_1.setTestOutputDir)(props.testOutputDir); isInitialized = true; }; exports.initialize = initialize; /** * Undoes the setup made by `initialize`. * @param frontendApp IModelApp implementation * * @see `initialize` * * @public */ const terminate = async (frontendApp = core_frontend_1.IModelApp) => { if (!isInitialized) { return; } // store directory that needs to be cleaned-up let hierarchiesCacheDirectory; const hierarchiesCacheConfig = presentation_backend_1.Presentation.initProps?.caching?.hierarchies; if (hierarchiesCacheConfig?.mode === presentation_backend_1.HierarchyCacheMode.Disk) { hierarchiesCacheDirectory = hierarchiesCacheConfig?.directory; } else if (hierarchiesCacheConfig?.mode === presentation_backend_1.HierarchyCacheMode.Hybrid) { hierarchiesCacheDirectory = hierarchiesCacheConfig?.disk?.directory; } // terminate backend presentation_backend_1.Presentation.terminate(); await core_backend_1.IModelHost.shutdown(); if (hierarchiesCacheDirectory) { const { sync: rimrafSync } = await Promise.resolve().then(() => __importStar(require("rimraf"))); rimrafSync(hierarchiesCacheDirectory); } // terminate frontend presentation_frontend_1.Presentation.terminate(); await frontendApp.shutdown(); isInitialized = false; }; exports.terminate = terminate; /** @internal */ function safeDispose(disposable) { if ("dispose" in disposable) { disposable.dispose(); } else if (Symbol.dispose in disposable) { disposable[Symbol.dispose](); } } //# sourceMappingURL=Helpers.js.map