summaryrefslogtreecommitdiff
path: root/deps/npm/node_modules/node-gyp/test/test-addon.js
blob: f97215c0a265282e425664deaf9c3a83519e4bac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
'use strict'

const test = require('tap').test
const path = require('path')
const fs = require('graceful-fs')
const childProcess = require('child_process')
const os = require('os')
const addonPath = path.resolve(__dirname, 'node_modules', 'hello_world')
const nodeGyp = path.resolve(__dirname, '..', 'bin', 'node-gyp.js')
const execFileSync = childProcess.execFileSync || require('./process-exec-sync')
const execFile = childProcess.execFile

function runHello (hostProcess) {
  if (!hostProcess) {
    hostProcess = process.execPath
  }
  var testCode = "console.log(require('hello_world').hello())"
  return execFileSync(hostProcess, [ '-e', testCode ], { cwd: __dirname }).toString()
}

function getEncoding () {
  var code = 'import locale;print(locale.getdefaultlocale()[1])'
  return execFileSync('python', [ '-c', code ]).toString().trim()
}

function checkCharmapValid () {
  var data
  try {
    data = execFileSync('python', [ 'fixtures/test-charmap.py' ],
      { cwd: __dirname })
  } catch (err) {
    return false
  }
  var lines = data.toString().trim().split('\n')
  return lines.pop() === 'True'
}

test('build simple addon', function (t) {
  t.plan(3)

  // Set the loglevel otherwise the output disappears when run via 'npm test'
  var cmd = [ nodeGyp, 'rebuild', '-C', addonPath, '--loglevel=verbose' ]
  var proc = execFile(process.execPath, cmd, function (err, stdout, stderr) {
    var logLines = stderr.toString().trim().split(/\r?\n/)
    var lastLine = logLines[logLines.length - 1]
    t.strictEqual(err, null)
    t.strictEqual(lastLine, 'gyp info ok', 'should end in ok')
    t.strictEqual(runHello().trim(), 'world')
  })
  proc.stdout.setEncoding('utf-8')
  proc.stderr.setEncoding('utf-8')
})

test('build simple addon in path with non-ascii characters', function (t) {
  t.plan(1)

  if (!checkCharmapValid()) {
    return t.skip('python console app can\'t encode non-ascii character.')
  }

  var testDirNames = {
    'cp936': '文件夹',
    'cp1252': 'Latīna',
    'cp932': 'フォルダ'
  }
  // Select non-ascii characters by current encoding
  var testDirName = testDirNames[getEncoding()]
  // If encoding is UTF-8 or other then no need to test
  if (!testDirName) {
    return t.skip('no need to test')
  }

  t.plan(3)

  var data
  var configPath = path.join(addonPath, 'build', 'config.gypi')
  try {
    data = fs.readFileSync(configPath, 'utf8')
  } catch (err) {
    t.error(err)
    return
  }
  var config = JSON.parse(data.replace(/#.+\n/, ''))
  var nodeDir = config.variables.nodedir
  var testNodeDir = path.join(addonPath, testDirName)
  // Create symbol link to path with non-ascii characters
  try {
    fs.symlinkSync(nodeDir, testNodeDir, 'dir')
  } catch (err) {
    switch (err.code) {
      case 'EEXIST': break
      case 'EPERM':
        t.error(err, 'Please try to running console as an administrator')
        return
      default:
        t.error(err)
        return
    }
  }

  var cmd = [
    nodeGyp,
    'rebuild',
    '-C',
    addonPath,
    '--loglevel=verbose',
    '-nodedir=' + testNodeDir
  ]
  var proc = execFile(process.execPath, cmd, function (err, stdout, stderr) {
    try {
      fs.unlink(testNodeDir)
    } catch (err) {
      t.error(err)
    }

    var logLines = stderr.toString().trim().split(/\r?\n/)
    var lastLine = logLines[logLines.length - 1]
    t.strictEqual(err, null)
    t.strictEqual(lastLine, 'gyp info ok', 'should end in ok')
    t.strictEqual(runHello().trim(), 'world')
  })
  proc.stdout.setEncoding('utf-8')
  proc.stderr.setEncoding('utf-8')
})

test('addon works with renamed host executable', function (t) {
  // No `fs.copyFileSync` before node8.
  if (process.version.substr(1).split('.')[0] < 8) {
    t.skip('skipping test for old node version')
    t.end()
    return
  }

  t.plan(3)

  var notNodePath = path.join(os.tmpdir(), 'notnode' + path.extname(process.execPath))
  fs.copyFileSync(process.execPath, notNodePath)

  var cmd = [ nodeGyp, 'rebuild', '-C', addonPath, '--loglevel=verbose' ]
  var proc = execFile(process.execPath, cmd, function (err, stdout, stderr) {
    var logLines = stderr.toString().trim().split(/\r?\n/)
    var lastLine = logLines[logLines.length - 1]
    t.strictEqual(err, null)
    t.strictEqual(lastLine, 'gyp info ok', 'should end in ok')
    t.strictEqual(runHello(notNodePath).trim(), 'world')
    fs.unlinkSync(notNodePath)
  })
  proc.stdout.setEncoding('utf-8')
  proc.stderr.setEncoding('utf-8')
})