1
1
'use strict'
2
2
3
3
var test = require ( 'tape' )
4
- var execFile = require ( 'child_process' ) . execFile
5
4
var path = require ( 'path' )
5
+ var fs = require ( 'graceful-fs' )
6
+ var child_process = require ( 'child_process' )
6
7
var addonPath = path . resolve ( __dirname , 'node_modules' , 'hello_world' )
7
8
var nodeGyp = path . resolve ( __dirname , '..' , 'bin' , 'node-gyp.js' )
9
+ var execFileSync = child_process . execFileSync
10
+ var execFile = child_process . execFile
11
+
12
+ function runHello ( ) {
13
+ var testCode = "console.log(require('hello_world').hello())"
14
+ return execFileSync ( 'node' , [ '-e' , testCode ] , { cwd : __dirname } ) . toString ( )
15
+ }
16
+
17
+ function getEncoding ( ) {
18
+ var code = 'import locale;print locale.getdefaultlocale()[1]'
19
+ return execFileSync ( 'python' , [ '-c' , code ] ) . toString ( ) . trim ( )
20
+ }
21
+
22
+ function checkCharmapValid ( ) {
23
+ var data
24
+ try {
25
+ data = execFileSync ( 'python' , [ 'fixtures/test-charmap.py' ] ,
26
+ { cwd : __dirname } )
27
+ } catch ( err ) {
28
+ return false
29
+ }
30
+ var lines = data . toString ( ) . trim ( ) . split ( '\n' )
31
+ return lines . pop ( ) === 'True'
32
+ }
8
33
9
34
test ( 'build simple addon' , function ( t ) {
10
35
t . plan ( 3 )
@@ -16,12 +41,72 @@ test('build simple addon', function (t) {
16
41
var lastLine = logLines [ logLines . length - 1 ]
17
42
t . strictEqual ( err , null )
18
43
t . strictEqual ( lastLine , 'gyp info ok' , 'should end in ok' )
44
+ t . strictEqual ( runHello ( ) . trim ( ) , 'world' )
45
+ } )
46
+ proc . stdout . setEncoding ( 'utf-8' )
47
+ proc . stderr . setEncoding ( 'utf-8' )
48
+ } )
49
+
50
+ test ( 'build simple addon in path with non-ascii characters' , function ( t ) {
51
+ t . plan ( 1 )
52
+
53
+ if ( ! checkCharmapValid ( ) ) {
54
+ return t . skip ( 'python console app can\'t encode non-ascii character.' )
55
+ }
56
+
57
+ var testDirNames = {
58
+ 'cp936' : '文件夹' ,
59
+ 'cp1252' : 'Latīna' ,
60
+ 'cp932' : 'フォルダ'
61
+ }
62
+ // Select non-ascii characters by current encoding
63
+ var testDirName = testDirNames [ getEncoding ( ) ]
64
+ // If encoding is UTF-8 or other then no need to test
65
+ if ( ! testDirName ) {
66
+ return t . skip ( 'no need to test' )
67
+ }
68
+
69
+ t . plan ( 3 )
70
+
71
+ var data , configPath = path . join ( addonPath , 'build' , 'config.gypi' )
72
+ try {
73
+ data = fs . readFileSync ( configPath , 'utf8' )
74
+ } catch ( err ) {
75
+ t . error ( err )
76
+ return
77
+ }
78
+ var config = JSON . parse ( data . replace ( / \# .+ \n / , '' ) )
79
+ var nodeDir = config . variables . nodedir
80
+ var testNodeDir = path . join ( addonPath , testDirName )
81
+ // Create symbol link to path with non-ascii characters
82
+ try {
83
+ fs . symlinkSync ( nodeDir , testNodeDir , 'dir' )
84
+ } catch ( err ) {
85
+ switch ( err . code ) {
86
+ case 'EEXIST' : break
87
+ case 'EPERM' :
88
+ t . error ( err , 'Please try to running console as an administrator' )
89
+ return
90
+ default :
91
+ t . error ( err )
92
+ return
93
+ }
94
+ }
95
+
96
+ var cmd = [ nodeGyp , 'rebuild' , '-C' , addonPath ,
97
+ '--loglevel=verbose' , '-nodedir=' + testNodeDir ]
98
+ var proc = execFile ( process . execPath , cmd , function ( err , stdout , stderr ) {
19
99
try {
20
- var binding = require ( 'hello_world' )
21
- t . strictEqual ( binding . hello ( ) , 'world' )
22
- } catch ( error ) {
23
- t . error ( error , 'load module' )
100
+ fs . unlink ( testNodeDir )
101
+ } catch ( err ) {
102
+ t . error ( err )
24
103
}
104
+
105
+ var logLines = stderr . toString ( ) . trim ( ) . split ( / \r ? \n / )
106
+ var lastLine = logLines [ logLines . length - 1 ]
107
+ t . strictEqual ( err , null )
108
+ t . strictEqual ( lastLine , 'gyp info ok' , 'should end in ok' )
109
+ t . strictEqual ( runHello ( ) . trim ( ) , 'world' )
25
110
} )
26
111
proc . stdout . setEncoding ( 'utf-8' )
27
112
proc . stderr . setEncoding ( 'utf-8' )
0 commit comments