1 | 'use strict'
|
---|
2 |
|
---|
3 | const test = require('tap').test
|
---|
4 | const path = require('path')
|
---|
5 | const fs = require('graceful-fs')
|
---|
6 | const childProcess = require('child_process')
|
---|
7 | const os = require('os')
|
---|
8 | const addonPath = path.resolve(__dirname, 'node_modules', 'hello_world')
|
---|
9 | const nodeGyp = path.resolve(__dirname, '..', 'bin', 'node-gyp.js')
|
---|
10 | const execFileSync = childProcess.execFileSync || require('./process-exec-sync')
|
---|
11 | const execFile = childProcess.execFile
|
---|
12 |
|
---|
13 | function runHello (hostProcess) {
|
---|
14 | if (!hostProcess) {
|
---|
15 | hostProcess = process.execPath
|
---|
16 | }
|
---|
17 | var testCode = "console.log(require('hello_world').hello())"
|
---|
18 | return execFileSync(hostProcess, ['-e', testCode], { cwd: __dirname }).toString()
|
---|
19 | }
|
---|
20 |
|
---|
21 | function getEncoding () {
|
---|
22 | var code = 'import locale;print(locale.getdefaultlocale()[1])'
|
---|
23 | return execFileSync('python', ['-c', code]).toString().trim()
|
---|
24 | }
|
---|
25 |
|
---|
26 | function checkCharmapValid () {
|
---|
27 | var data
|
---|
28 | try {
|
---|
29 | data = execFileSync('python', ['fixtures/test-charmap.py'],
|
---|
30 | { cwd: __dirname })
|
---|
31 | } catch (err) {
|
---|
32 | return false
|
---|
33 | }
|
---|
34 | var lines = data.toString().trim().split('\n')
|
---|
35 | return lines.pop() === 'True'
|
---|
36 | }
|
---|
37 |
|
---|
38 | test('build simple addon', function (t) {
|
---|
39 | t.plan(3)
|
---|
40 |
|
---|
41 | // Set the loglevel otherwise the output disappears when run via 'npm test'
|
---|
42 | var cmd = [nodeGyp, 'rebuild', '-C', addonPath, '--loglevel=verbose']
|
---|
43 | var proc = execFile(process.execPath, cmd, function (err, stdout, stderr) {
|
---|
44 | var logLines = stderr.toString().trim().split(/\r?\n/)
|
---|
45 | var lastLine = logLines[logLines.length - 1]
|
---|
46 | t.strictEqual(err, null)
|
---|
47 | t.strictEqual(lastLine, 'gyp info ok', 'should end in ok')
|
---|
48 | t.strictEqual(runHello().trim(), 'world')
|
---|
49 | })
|
---|
50 | proc.stdout.setEncoding('utf-8')
|
---|
51 | proc.stderr.setEncoding('utf-8')
|
---|
52 | })
|
---|
53 |
|
---|
54 | test('build simple addon in path with non-ascii characters', function (t) {
|
---|
55 | t.plan(1)
|
---|
56 |
|
---|
57 | if (!checkCharmapValid()) {
|
---|
58 | return t.skip('python console app can\'t encode non-ascii character.')
|
---|
59 | }
|
---|
60 |
|
---|
61 | var testDirNames = {
|
---|
62 | cp936: '文件夹',
|
---|
63 | cp1252: 'Latīna',
|
---|
64 | cp932: 'フォルダ'
|
---|
65 | }
|
---|
66 | // Select non-ascii characters by current encoding
|
---|
67 | var testDirName = testDirNames[getEncoding()]
|
---|
68 | // If encoding is UTF-8 or other then no need to test
|
---|
69 | if (!testDirName) {
|
---|
70 | return t.skip('no need to test')
|
---|
71 | }
|
---|
72 |
|
---|
73 | t.plan(3)
|
---|
74 |
|
---|
75 | var data
|
---|
76 | var configPath = path.join(addonPath, 'build', 'config.gypi')
|
---|
77 | try {
|
---|
78 | data = fs.readFileSync(configPath, 'utf8')
|
---|
79 | } catch (err) {
|
---|
80 | t.error(err)
|
---|
81 | return
|
---|
82 | }
|
---|
83 | var config = JSON.parse(data.replace(/#.+\n/, ''))
|
---|
84 | var nodeDir = config.variables.nodedir
|
---|
85 | var testNodeDir = path.join(addonPath, testDirName)
|
---|
86 | // Create symbol link to path with non-ascii characters
|
---|
87 | try {
|
---|
88 | fs.symlinkSync(nodeDir, testNodeDir, 'dir')
|
---|
89 | } catch (err) {
|
---|
90 | switch (err.code) {
|
---|
91 | case 'EEXIST': break
|
---|
92 | case 'EPERM':
|
---|
93 | t.error(err, 'Please try to running console as an administrator')
|
---|
94 | return
|
---|
95 | default:
|
---|
96 | t.error(err)
|
---|
97 | return
|
---|
98 | }
|
---|
99 | }
|
---|
100 |
|
---|
101 | var cmd = [
|
---|
102 | nodeGyp,
|
---|
103 | 'rebuild',
|
---|
104 | '-C',
|
---|
105 | addonPath,
|
---|
106 | '--loglevel=verbose',
|
---|
107 | '-nodedir=' + testNodeDir
|
---|
108 | ]
|
---|
109 | var proc = execFile(process.execPath, cmd, function (err, stdout, stderr) {
|
---|
110 | try {
|
---|
111 | fs.unlink(testNodeDir)
|
---|
112 | } catch (err) {
|
---|
113 | t.error(err)
|
---|
114 | }
|
---|
115 |
|
---|
116 | var logLines = stderr.toString().trim().split(/\r?\n/)
|
---|
117 | var lastLine = logLines[logLines.length - 1]
|
---|
118 | t.strictEqual(err, null)
|
---|
119 | t.strictEqual(lastLine, 'gyp info ok', 'should end in ok')
|
---|
120 | t.strictEqual(runHello().trim(), 'world')
|
---|
121 | })
|
---|
122 | proc.stdout.setEncoding('utf-8')
|
---|
123 | proc.stderr.setEncoding('utf-8')
|
---|
124 | })
|
---|
125 |
|
---|
126 | test('addon works with renamed host executable', function (t) {
|
---|
127 | // No `fs.copyFileSync` before node8.
|
---|
128 | if (process.version.substr(1).split('.')[0] < 8) {
|
---|
129 | t.skip('skipping test for old node version')
|
---|
130 | t.end()
|
---|
131 | return
|
---|
132 | }
|
---|
133 |
|
---|
134 | t.plan(3)
|
---|
135 |
|
---|
136 | var notNodePath = path.join(os.tmpdir(), 'notnode' + path.extname(process.execPath))
|
---|
137 | fs.copyFileSync(process.execPath, notNodePath)
|
---|
138 |
|
---|
139 | var cmd = [nodeGyp, 'rebuild', '-C', addonPath, '--loglevel=verbose']
|
---|
140 | var proc = execFile(process.execPath, cmd, function (err, stdout, stderr) {
|
---|
141 | var logLines = stderr.toString().trim().split(/\r?\n/)
|
---|
142 | var lastLine = logLines[logLines.length - 1]
|
---|
143 | t.strictEqual(err, null)
|
---|
144 | t.strictEqual(lastLine, 'gyp info ok', 'should end in ok')
|
---|
145 | t.strictEqual(runHello(notNodePath).trim(), 'world')
|
---|
146 | fs.unlinkSync(notNodePath)
|
---|
147 | })
|
---|
148 | proc.stdout.setEncoding('utf-8')
|
---|
149 | proc.stderr.setEncoding('utf-8')
|
---|
150 | })
|
---|