115 строки
2.9 KiB
JavaScript
115 строки
2.9 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
'use strict'
|
|
|
|
var crypto = require('crypto')
|
|
const EventEmitter = require('events')
|
|
var P = require('../lib/promise')
|
|
var mailbox = require('./mailbox')
|
|
var createDBServer = require('fxa-auth-db-mysql')
|
|
var createAuthServer = require('../bin/key_server')
|
|
var createMailHelper = require('./mail_helper')
|
|
var createOauthHelper = require('./oauth_helper')
|
|
|
|
let currentServer
|
|
|
|
/* eslint-disable no-console */
|
|
function TestServer(config, printLogs) {
|
|
currentServer = this
|
|
if (printLogs === undefined) {
|
|
|
|
// Issue where debugger does not attach if
|
|
// child process output is not piped to console
|
|
|
|
printLogs = (process.env.REMOTE_TEST_LOGS === 'true' || process.env.REMOTE_TEST_LOGS === '1')
|
|
}
|
|
if (printLogs) {
|
|
config.log.level = 'debug'
|
|
} else {
|
|
config.log.level = 'critical'
|
|
config.log.stdout = new EventEmitter()
|
|
config.log.stdout.write = function () {}
|
|
}
|
|
this.printLogs = printLogs
|
|
this.config = config
|
|
this.server = null
|
|
this.mail = null
|
|
this.oauth = null
|
|
this.mailbox = mailbox(config.smtp.api.host, config.smtp.api.port, this.printLogs)
|
|
}
|
|
|
|
TestServer.start = function (config, printLogs) {
|
|
return TestServer.stop().then(() => {
|
|
return createDBServer()
|
|
}).then((db) => {
|
|
db.listen(config.httpdb.url.split(':')[2])
|
|
db.on('error', function () {})
|
|
var testServer = new TestServer(config, printLogs)
|
|
testServer.db = db
|
|
return testServer.start().then(() => testServer)
|
|
})
|
|
}
|
|
|
|
TestServer.prototype.start = function () {
|
|
const promises = [
|
|
createAuthServer(this.config),
|
|
createMailHelper(this.printLogs)
|
|
]
|
|
|
|
if (this.config.oauth.url) {
|
|
promises.push(createOauthHelper())
|
|
}
|
|
return P.all(promises)
|
|
.spread((auth, mail, oauth) => {
|
|
this.server = auth
|
|
this.mail = mail
|
|
this.oauth = oauth
|
|
})
|
|
}
|
|
|
|
TestServer.stop = function (maybeServer) {
|
|
if (maybeServer) {
|
|
return maybeServer.stop()
|
|
} else if (currentServer) {
|
|
return currentServer.stop()
|
|
} else {
|
|
return P.resolve()
|
|
}
|
|
}
|
|
|
|
TestServer.prototype.stop = function () {
|
|
currentServer = undefined
|
|
try { this.db.close() } catch (e) {}
|
|
if (this.server) {
|
|
const doomed = [
|
|
this.server.close(),
|
|
this.mail.close()
|
|
]
|
|
if (this.oauth) {
|
|
doomed.push(this.oauth.close())
|
|
}
|
|
return P.all(doomed)
|
|
} else {
|
|
return P.resolve()
|
|
}
|
|
}
|
|
|
|
TestServer.prototype.uniqueEmail = function (domain) {
|
|
if (! domain) {
|
|
domain = '@restmail.net'
|
|
}
|
|
return crypto.randomBytes(10).toString('hex') + domain
|
|
}
|
|
|
|
TestServer.prototype.uniqueUnicodeEmail = function () {
|
|
return crypto.randomBytes(10).toString('hex') +
|
|
String.fromCharCode(1234) +
|
|
'@' +
|
|
String.fromCharCode(5678) +
|
|
'restmail.net'
|
|
}
|
|
|
|
module.exports = TestServer
|