summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOskar Nyberg <oskar@mullvad.net>2021-01-12 13:29:33 +0100
committerOskar Nyberg <oskar@mullvad.net>2021-01-15 13:32:09 +0100
commitef332247aa3408b2af862340cf3fe1ae4ee5054a (patch)
tree6a4680d9ad599861246053404211ec8b6d5675c5
parentfd02a14f3fad35f49cfd7b9deb3aae02fcf9dda2 (diff)
downloadmullvadvpn-ef332247aa3408b2af862340cf3fe1ae4ee5054a.tar.xz
mullvadvpn-ef332247aa3408b2af862340cf3fe1ae4ee5054a.zip
Use new logger
-rw-r--r--gui/package.json2
-rw-r--r--gui/src/main/account-data-cache.ts2
-rw-r--r--gui/src/main/autostart.ts2
-rw-r--r--gui/src/main/daemon-rpc.ts2
-rw-r--r--gui/src/main/gui-settings.ts2
-rw-r--r--gui/src/main/index.ts58
-rw-r--r--gui/src/main/linux-desktop-entry.ts2
-rw-r--r--gui/src/main/notification-controller.ts2
-rw-r--r--gui/src/renderer/app.tsx8
-rw-r--r--gui/src/renderer/components/AppButton.tsx2
-rw-r--r--gui/src/renderer/components/ClipboardLabel.tsx2
-rw-r--r--gui/src/renderer/components/ErrorBoundary.tsx2
-rw-r--r--gui/src/renderer/components/NotificationArea.tsx2
-rw-r--r--gui/src/renderer/components/WireguardKeys.tsx2
-rw-r--r--gui/src/renderer/containers/AdvancedSettingsPage.tsx2
-rw-r--r--gui/src/renderer/containers/ConnectPage.tsx2
-rw-r--r--gui/src/renderer/containers/ExpiredAccountErrorViewContainer.tsx2
-rw-r--r--gui/src/renderer/containers/PreferencesPage.tsx2
-rw-r--r--gui/src/renderer/containers/SelectLocationPage.tsx2
-rw-r--r--gui/src/renderer/redux/settings/reducers.ts2
-rw-r--r--gui/src/shared/gettext.ts2
-rw-r--r--gui/src/shared/ipc-helpers.ts2
-rw-r--r--gui/test/logging.spec.ts10
-rw-r--r--gui/test/setup/main.js4
-rw-r--r--gui/test/setup/renderer.ts4
25 files changed, 64 insertions, 60 deletions
diff --git a/gui/package.json b/gui/package.json
index 27e399f41e..0bb993f9df 100644
--- a/gui/package.json
+++ b/gui/package.json
@@ -101,7 +101,7 @@
"lint": "eslint --ext tsx,ts .",
"format": "prettier \"**/*.{js,css,ts,tsx}\" --write",
"develop": "gulp develop",
- "test": "cross-env NODE_ENV=test electron-mocha --renderer --reporter spec --require-main \"test/setup/main.js\" --require ts-node/register --require \"test/setup/renderer.ts\" \"test/**/*.{ts,tsx}\"",
+ "test": "cross-env NODE_ENV=test electron-mocha --renderer --reporter spec --require ts-node/register --require \"test/setup/renderer.ts\" \"test/**/*.{ts,tsx}\"",
"update-translations": "node scripts/extract-translations",
"pack:mac": "gulp pack-mac",
"pack:win": "gulp pack-win",
diff --git a/gui/src/main/account-data-cache.ts b/gui/src/main/account-data-cache.ts
index 5c178e83a6..a03728e004 100644
--- a/gui/src/main/account-data-cache.ts
+++ b/gui/src/main/account-data-cache.ts
@@ -1,7 +1,7 @@
-import log from 'electron-log';
import moment from 'moment';
import { hasExpired } from '../shared/account-expiry';
import { AccountToken, IAccountData } from '../shared/daemon-rpc-types';
+import log from '../shared/logging';
import consumePromise from '../shared/promise';
import { Scheduler } from '../shared/scheduler';
import { InvalidAccountError } from './errors';
diff --git a/gui/src/main/autostart.ts b/gui/src/main/autostart.ts
index a42691550c..f5369b6723 100644
--- a/gui/src/main/autostart.ts
+++ b/gui/src/main/autostart.ts
@@ -1,8 +1,8 @@
import { app } from 'electron';
-import log from 'electron-log';
import * as fs from 'fs';
import * as path from 'path';
import { promisify } from 'util';
+import log from '../shared/logging';
const DESKTOP_FILE_NAME = 'mullvad-vpn.desktop';
diff --git a/gui/src/main/daemon-rpc.ts b/gui/src/main/daemon-rpc.ts
index 7f9e6d629b..9be0fc6870 100644
--- a/gui/src/main/daemon-rpc.ts
+++ b/gui/src/main/daemon-rpc.ts
@@ -4,7 +4,6 @@ import {
StringValue,
UInt32Value,
} from 'google-protobuf/google/protobuf/wrappers_pb.js';
-import log from 'electron-log';
import { Empty } from 'google-protobuf/google/protobuf/empty_pb.js';
import { promisify } from 'util';
import {
@@ -50,6 +49,7 @@ import {
TunnelProtocol,
IDnsOptions,
} from '../shared/daemon-rpc-types';
+import log from '../shared/logging';
import * as managementInterface from './management_interface/management_interface_grpc_pb';
import * as grpcTypes from './management_interface/management_interface_pb';
diff --git a/gui/src/main/gui-settings.ts b/gui/src/main/gui-settings.ts
index e7d8a47cf1..54b51116cd 100644
--- a/gui/src/main/gui-settings.ts
+++ b/gui/src/main/gui-settings.ts
@@ -1,8 +1,8 @@
import { app } from 'electron';
-import log from 'electron-log';
import * as fs from 'fs';
import * as path from 'path';
import { IGuiSettingsState, SYSTEM_PREFERRED_LOCALE_KEY } from '../shared/gui-settings-state';
+import log from '../shared/logging';
const settingsSchema = {
preferredLocale: 'string',
diff --git a/gui/src/main/index.ts b/gui/src/main/index.ts
index efef48e033..402a0a35cb 100644
--- a/gui/src/main/index.ts
+++ b/gui/src/main/index.ts
@@ -10,8 +10,6 @@ import {
shell,
Tray,
} from 'electron';
-import log from 'electron-log';
-import mkdirp from 'mkdirp';
import moment from 'moment';
import * as path from 'path';
import { sprintf } from 'sprintf-js';
@@ -39,14 +37,8 @@ import {
import { loadTranslations, messages } from '../shared/gettext';
import { SYSTEM_PREFERRED_LOCALE_KEY } from '../shared/gui-settings-state';
import { IpcMainEventChannel } from '../shared/ipc-event-channel';
-import {
- backupLogFile,
- cleanUpLogDirectory,
- getLogsDirectory,
- getMainLogFile,
- getRendererLogFile,
- setupLogging,
-} from '../shared/logging';
+import log, { ConsoleOutput, Logger } from '../shared/logging';
+import { LogLevel } from '../shared/logging-types';
import {
AccountExpiredNotificationProvider,
CloseToAccountExpiryNotificationProvider,
@@ -63,6 +55,16 @@ import { InvalidAccountError } from './errors';
import Expectation from './expectation';
import GuiSettings from './gui-settings';
import { getAppIcon } from './linux-desktop-entry';
+import {
+ backupLogFile,
+ cleanUpLogDirectory,
+ createLoggingDirectory,
+ FileOutput,
+ getMainLogPath,
+ getRendererLogPath,
+ IpcInput,
+ OLD_LOG_FILES,
+} from './logging';
import NotificationController from './notification-controller';
import { resolveBin } from './proc';
import ReconnectionBackoff from './reconnection-backoff';
@@ -201,6 +203,8 @@ class ApplicationMain {
private autoConnectOnWireguardKeyEvent = false;
private autoConnectFallbackScheduler = new Scheduler();
+ private rendererLog?: Logger;
+
public run() {
// Remove window animations to combat window flickering when opening window. Can be removed when
// this issue has been resolved: https://github.com/electron/electron/issues/12130
@@ -252,28 +256,35 @@ class ApplicationMain {
if (appDataDir) {
app.setPath('appData', appDataDir);
app.setPath('userData', path.join(appDataDir, app.name));
+ app.setPath('logs', path.join(appDataDir, app.name, 'logs'));
} else {
throw new Error('Missing %LOCALAPPDATA% environment variable');
}
+ } else if (process.platform === 'linux') {
+ const userDataDir = app.getPath('userData');
+ app.setPath('logs', path.join(userDataDir, 'logs'));
}
}
private initLogging() {
- const logDirectory = getLogsDirectory();
- const mainLogFile = getMainLogFile();
- const logFiles = [mainLogFile, getRendererLogFile()];
+ const mainLogPath = getMainLogPath();
+ const rendererLogPath = getRendererLogPath();
if (process.env.NODE_ENV !== 'development') {
- // Ensure log directory exists
- mkdirp.sync(logDirectory);
+ createLoggingDirectory();
+ cleanUpLogDirectory(OLD_LOG_FILES);
- for (const logFile of logFiles) {
- backupLogFile(logFile);
- }
+ backupLogFile(mainLogPath);
+ backupLogFile(rendererLogPath);
+
+ log.addOutput(new FileOutput(LogLevel.debug, mainLogPath));
+
+ this.rendererLog = new Logger();
+ this.rendererLog.addInput(new IpcInput());
+ this.rendererLog.addOutput(new FileOutput(LogLevel.debug, rendererLogPath));
}
- cleanUpLogDirectory();
- setupLogging(mainLogFile);
+ log.addOutput(new ConsoleOutput(LogLevel.debug));
}
private onActivate = () => {
@@ -340,6 +351,9 @@ class ApplicationMain {
}
this.daemonRpc.disconnect();
+
+ log.dispose();
+ this.rendererLog?.dispose();
}
private detectLocale(): string {
@@ -1151,10 +1165,6 @@ class ApplicationMain {
IpcMainEventChannel.app.handleOpenUrl((url) => shell.openExternal(url));
IpcMainEventChannel.app.handleOpenPath((path) => shell.openPath(path));
IpcMainEventChannel.app.handleShowOpenDialog((options) => dialog.showOpenDialog(options));
-
- IpcMainEventChannel.logging.handleLog(({ level, data }) =>
- this.rendererLog?.log(LogLevels[level], ...data),
- );
}
private async createNewAccount(): Promise<string> {
diff --git a/gui/src/main/linux-desktop-entry.ts b/gui/src/main/linux-desktop-entry.ts
index 02edd8eb0f..dc1ae0e57b 100644
--- a/gui/src/main/linux-desktop-entry.ts
+++ b/gui/src/main/linux-desktop-entry.ts
@@ -1,8 +1,8 @@
import child_process from 'child_process';
-import log from 'electron-log';
import fs from 'fs';
import path from 'path';
import { ILinuxApplication } from '../shared/application-types';
+import log from '../shared/logging';
type DirectoryDescription = string | RegExp;
diff --git a/gui/src/main/notification-controller.ts b/gui/src/main/notification-controller.ts
index 95c1216b72..17343837d4 100644
--- a/gui/src/main/notification-controller.ts
+++ b/gui/src/main/notification-controller.ts
@@ -1,8 +1,8 @@
import { app, nativeImage, NativeImage, Notification } from 'electron';
-import log from 'electron-log';
import os from 'os';
import path from 'path';
import { TunnelState } from '../shared/daemon-rpc-types';
+import log from '../shared/logging';
import {
ConnectedNotificationProvider,
ConnectingNotificationProvider,
diff --git a/gui/src/renderer/app.tsx b/gui/src/renderer/app.tsx
index 73019b1e14..f63e03633a 100644
--- a/gui/src/renderer/app.tsx
+++ b/gui/src/renderer/app.tsx
@@ -1,4 +1,3 @@
-import log from 'electron-log';
import * as React from 'react';
import { Provider } from 'react-redux';
import { Router } from 'react-router';
@@ -21,7 +20,7 @@ import { loadTranslations, messages, relayLocations } from '../shared/gettext';
import { IGuiSettingsState, SYSTEM_PREFERRED_LOCALE_KEY } from '../shared/gui-settings-state';
import { IpcRendererEventChannel, IRelayListPair } from '../shared/ipc-event-channel';
import { ILinuxSplitTunnelingApplication } from '../shared/application-types';
-import { getRendererLogFile, setupLogging } from '../shared/logging';
+import log, { ConsoleOutput } from '../shared/logging';
import consumePromise from '../shared/promise';
import History from './lib/history';
@@ -43,6 +42,8 @@ import {
TunnelState,
VoucherResponse,
} from '../shared/daemon-rpc-types';
+import { LogLevel } from '../shared/logging-types';
+import IpcOutput from './lib/logging';
interface IPreferredLocaleDescriptor {
name: string;
@@ -94,7 +95,8 @@ export default class AppRenderer {
private loginTimer?: NodeJS.Timeout;
constructor() {
- setupLogging(getRendererLogFile());
+ log.addOutput(new ConsoleOutput(LogLevel.debug));
+ log.addOutput(new IpcOutput(LogLevel.debug));
IpcRendererEventChannel.locale.listen((locale) => {
// load translations for the new locale
diff --git a/gui/src/renderer/components/AppButton.tsx b/gui/src/renderer/components/AppButton.tsx
index 54a3039078..352d70d9e9 100644
--- a/gui/src/renderer/components/AppButton.tsx
+++ b/gui/src/renderer/components/AppButton.tsx
@@ -1,7 +1,7 @@
-import log from 'electron-log';
import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
import styled from 'styled-components';
import { colors } from '../../config.json';
+import log from '../../shared/logging';
import { useMounted } from '../lib/utilityHooks';
import { StyledButtonContent, StyledLabel, StyledLabelContainer } from './AppButtonStyles';
import ImageView from './ImageView';
diff --git a/gui/src/renderer/components/ClipboardLabel.tsx b/gui/src/renderer/components/ClipboardLabel.tsx
index 8b96b32dd3..2131e884df 100644
--- a/gui/src/renderer/components/ClipboardLabel.tsx
+++ b/gui/src/renderer/components/ClipboardLabel.tsx
@@ -1,7 +1,7 @@
-import log from 'electron-log';
import * as React from 'react';
import styled from 'styled-components';
import { messages } from '../../shared/gettext';
+import log from '../../shared/logging';
import { Scheduler } from '../../shared/scheduler';
interface IProps {
diff --git a/gui/src/renderer/components/ErrorBoundary.tsx b/gui/src/renderer/components/ErrorBoundary.tsx
index c54fe97721..040ff71826 100644
--- a/gui/src/renderer/components/ErrorBoundary.tsx
+++ b/gui/src/renderer/components/ErrorBoundary.tsx
@@ -1,8 +1,8 @@
-import log from 'electron-log';
import React from 'react';
import styled from 'styled-components';
import { colors, links } from '../../config.json';
import { messages } from '../../shared/gettext';
+import log from '../../shared/logging';
import PlatformWindowContainer from '../containers/PlatformWindowContainer';
import ImageView from './ImageView';
import { Container, Layout } from './Layout';
diff --git a/gui/src/renderer/components/NotificationArea.tsx b/gui/src/renderer/components/NotificationArea.tsx
index 35fcffdd6d..c087d9984a 100644
--- a/gui/src/renderer/components/NotificationArea.tsx
+++ b/gui/src/renderer/components/NotificationArea.tsx
@@ -1,6 +1,6 @@
-import log from 'electron-log';
import React, { useCallback } from 'react';
import { useSelector } from 'react-redux';
+import log from '../../shared/logging';
import {
BlockWhenDisconnectedNotificationProvider,
CloseToAccountExpiryNotificationProvider,
diff --git a/gui/src/renderer/components/WireguardKeys.tsx b/gui/src/renderer/components/WireguardKeys.tsx
index 9e1df9693c..5bb84c7509 100644
--- a/gui/src/renderer/components/WireguardKeys.tsx
+++ b/gui/src/renderer/components/WireguardKeys.tsx
@@ -1,9 +1,9 @@
-import log from 'electron-log';
import moment from 'moment';
import * as React from 'react';
import { sprintf } from 'sprintf-js';
import { TunnelState } from '../../shared/daemon-rpc-types';
import { messages } from '../../shared/gettext';
+import log from '../../shared/logging';
import { IWgKey, WgKeyState } from '../redux/settings/reducers';
import * as AppButton from './AppButton';
import { AriaDescribed, AriaDescription, AriaDescriptionGroup } from './AriaGroup';
diff --git a/gui/src/renderer/containers/AdvancedSettingsPage.tsx b/gui/src/renderer/containers/AdvancedSettingsPage.tsx
index 68d6899acb..0aaa4ee3f4 100644
--- a/gui/src/renderer/containers/AdvancedSettingsPage.tsx
+++ b/gui/src/renderer/containers/AdvancedSettingsPage.tsx
@@ -1,4 +1,3 @@
-import log from 'electron-log';
import { connect } from 'react-redux';
import { RouteComponentProps, withRouter } from 'react-router';
import {
@@ -7,6 +6,7 @@ import {
RelayProtocol,
TunnelProtocol,
} from '../../shared/daemon-rpc-types';
+import log from '../../shared/logging';
import RelaySettingsBuilder from '../../shared/relay-settings-builder';
import AdvancedSettings from '../components/AdvancedSettings';
diff --git a/gui/src/renderer/containers/ConnectPage.tsx b/gui/src/renderer/containers/ConnectPage.tsx
index f56bc6e160..99882bf8b1 100644
--- a/gui/src/renderer/containers/ConnectPage.tsx
+++ b/gui/src/renderer/containers/ConnectPage.tsx
@@ -1,8 +1,8 @@
-import log from 'electron-log';
import { connect } from 'react-redux';
import { RouteComponentProps, withRouter } from 'react-router';
import { sprintf } from 'sprintf-js';
import { messages } from '../../shared/gettext';
+import log from '../../shared/logging';
import Connect from '../components/Connect';
import withAppContext, { IAppContext } from '../context';
import { IRelayLocationRedux, RelaySettingsRedux } from '../redux/settings/reducers';
diff --git a/gui/src/renderer/containers/ExpiredAccountErrorViewContainer.tsx b/gui/src/renderer/containers/ExpiredAccountErrorViewContainer.tsx
index dcdc862355..8b01b5e996 100644
--- a/gui/src/renderer/containers/ExpiredAccountErrorViewContainer.tsx
+++ b/gui/src/renderer/containers/ExpiredAccountErrorViewContainer.tsx
@@ -1,6 +1,6 @@
-import log from 'electron-log';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
+import log from '../../shared/logging';
import ExpiredAccountErrorView from '../components/ExpiredAccountErrorView';
import accountActions from '../redux/account/actions';
diff --git a/gui/src/renderer/containers/PreferencesPage.tsx b/gui/src/renderer/containers/PreferencesPage.tsx
index 35d9c62f5b..571219b528 100644
--- a/gui/src/renderer/containers/PreferencesPage.tsx
+++ b/gui/src/renderer/containers/PreferencesPage.tsx
@@ -1,6 +1,6 @@
-import log from 'electron-log';
import { connect } from 'react-redux';
import { RouteComponentProps, withRouter } from 'react-router';
+import log from '../../shared/logging';
import consumePromise from '../../shared/promise';
import Preferences from '../components/Preferences';
import withAppContext, { IAppContext } from '../context';
diff --git a/gui/src/renderer/containers/SelectLocationPage.tsx b/gui/src/renderer/containers/SelectLocationPage.tsx
index 29bb468304..fbad19285b 100644
--- a/gui/src/renderer/containers/SelectLocationPage.tsx
+++ b/gui/src/renderer/containers/SelectLocationPage.tsx
@@ -1,9 +1,9 @@
-import log from 'electron-log';
import { connect } from 'react-redux';
import { RouteComponentProps, withRouter } from 'react-router';
import { bindActionCreators } from 'redux';
import BridgeSettingsBuilder from '../../shared/bridge-settings-builder';
import { LiftedConstraint, RelayLocation } from '../../shared/daemon-rpc-types';
+import log from '../../shared/logging';
import RelaySettingsBuilder from '../../shared/relay-settings-builder';
import SelectLocation from '../components/SelectLocation';
import withAppContext, { IAppContext } from '../context';
diff --git a/gui/src/renderer/redux/settings/reducers.ts b/gui/src/renderer/redux/settings/reducers.ts
index 53d19aba29..59b4c32b46 100644
--- a/gui/src/renderer/redux/settings/reducers.ts
+++ b/gui/src/renderer/redux/settings/reducers.ts
@@ -1,4 +1,3 @@
-import log from 'electron-log';
import {
BridgeState,
KeygenEvent,
@@ -9,6 +8,7 @@ import {
TunnelProtocol,
} from '../../../shared/daemon-rpc-types';
import { IGuiSettingsState } from '../../../shared/gui-settings-state';
+import log from '../../../shared/logging';
import { ReduxAction } from '../store';
export type RelaySettingsRedux =
diff --git a/gui/src/shared/gettext.ts b/gui/src/shared/gettext.ts
index df15e0c2ef..3283269c70 100644
--- a/gui/src/shared/gettext.ts
+++ b/gui/src/shared/gettext.ts
@@ -1,9 +1,9 @@
-import log from 'electron-log';
import fs from 'fs';
import { po } from 'gettext-parser';
import Gettext from 'node-gettext';
import path from 'path';
import { LocalizationContexts } from './localization-contexts';
+import log from './logging';
const SOURCE_LANGUAGE = 'en';
const LOCALES_DIR = path.resolve(__dirname, '../../locales');
diff --git a/gui/src/shared/ipc-helpers.ts b/gui/src/shared/ipc-helpers.ts
index 1c1465b09b..d1a72a2df6 100644
--- a/gui/src/shared/ipc-helpers.ts
+++ b/gui/src/shared/ipc-helpers.ts
@@ -1,6 +1,6 @@
import { ipcMain, ipcRenderer, WebContents } from 'electron';
-import log from 'electron-log';
import { capitalize } from './string-helpers';
+import log from './logging';
type Handler<T, R> = (callback: (arg: T) => R) => void;
type Sender<T, R> = (arg: T) => R;
diff --git a/gui/test/logging.spec.ts b/gui/test/logging.spec.ts
index 9572c6ed24..22c3db02fa 100644
--- a/gui/test/logging.spec.ts
+++ b/gui/test/logging.spec.ts
@@ -2,7 +2,7 @@ import { expect } from 'chai';
import fs from 'fs';
import sinon from 'sinon';
import { it, describe, before, beforeEach, after } from 'mocha';
-import * as logging from '../src/shared/logging';
+import { backupLogFile, rotateOrDeleteFile } from '../src/main/logging';
const aPath = 'log-directory/a.log';
const oldAPath = 'log-directory/a.old.log';
@@ -51,7 +51,7 @@ describe('Logging', () => {
});
it('should backup log file', () => {
- logging.backupLogFile(aPath);
+ backupLogFile(aPath);
const oldA = fs.readFileSync(oldAPath).toString();
expect(fs.accessSync.bind(null, aPath)).to.throw();
@@ -59,7 +59,7 @@ describe('Logging', () => {
});
it('should replace backup file', () => {
- logging.backupLogFile(bPath);
+ backupLogFile(bPath);
const oldB = fs.readFileSync(oldBPath).toString();
expect(fs.accessSync.bind(null, bPath)).to.throw();
@@ -67,13 +67,13 @@ describe('Logging', () => {
});
it('should clean up old log files', () => {
- logging.rotateOrDeleteFile(bPath);
+ rotateOrDeleteFile(bPath);
const oldB = fs.readFileSync(oldBPath).toString();
expect(fs.accessSync.bind(null, bPath)).to.throw();
expect(oldB).to.equal(initialFileState[bPath]);
- logging.rotateOrDeleteFile(bPath);
+ rotateOrDeleteFile(bPath);
expect(fs.accessSync.bind(null, bPath)).to.throw();
expect(fs.accessSync.bind(null, oldBPath)).to.throw();
diff --git a/gui/test/setup/main.js b/gui/test/setup/main.js
deleted file mode 100644
index dd458a30b6..0000000000
--- a/gui/test/setup/main.js
+++ /dev/null
@@ -1,4 +0,0 @@
-const log = require('electron-log');
-
-log.transports.console.level = false;
-log.transports.file.level = false;
diff --git a/gui/test/setup/renderer.ts b/gui/test/setup/renderer.ts
index b8e1c5e2a3..05c236a2da 100644
--- a/gui/test/setup/renderer.ts
+++ b/gui/test/setup/renderer.ts
@@ -1,13 +1,9 @@
-import log from 'electron-log';
import Enzyme from 'enzyme';
import ReactSixteenAdapter from 'enzyme-adapter-react-16';
import chai from 'chai';
import spies from 'chai-spies';
import chaiAsPromised from 'chai-as-promised';
-log.transports.console.level = false;
-log.transports.file.level = false;
-
chai.use(spies);
chai.use(chaiAsPromised);