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 |
|
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 |
|
67 | var testDirName = testDirNames[getEncoding()]
|
68 |
|
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 |
|
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 |
|
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 | })
|