@@ -6,8 +6,13 @@ const path = require('path')
66const http = require ( 'http' )
77const https = require ( 'https' )
88const install = require ( '../lib/install' )
9+ const semver = require ( 'semver' )
10+ const devDir = require ( './common' ) . devDir ( )
11+ const rimraf = require ( 'rimraf' )
12+ const gyp = require ( '../lib/node-gyp' )
13+ const log = require ( 'npmlog' )
914
10- require ( 'npmlog' ) . level = 'warn'
15+ log . level = 'warn'
1116
1217test ( 'download over http' , function ( t ) {
1318 t . plan ( 2 )
@@ -103,3 +108,66 @@ test('check certificate splitting', function (t) {
103108 t . strictEqual ( cas . length , 2 )
104109 t . notStrictEqual ( cas [ 0 ] , cas [ 1 ] )
105110} )
111+
112+ // only run this test if we are running a version of Node with predictable version path behavior
113+
114+ test ( 'download headers (actual)' , function ( t ) {
115+ if ( process . env . FAST_TEST ||
116+ process . release . name !== 'node' ||
117+ semver . prerelease ( process . version ) !== null ||
118+ semver . satisfies ( process . version , '<10' ) ) {
119+ return t . skip ( 'Skipping acutal download of headers due to test environment configuration' )
120+ }
121+
122+ t . plan ( 17 )
123+
124+ const expectedDir = path . join ( devDir , process . version . replace ( / ^ v / , '' ) )
125+ rimraf ( expectedDir , ( err ) => {
126+ t . ifError ( err )
127+
128+ const prog = gyp ( )
129+ prog . parseArgv ( [ ] )
130+ prog . devDir = devDir
131+ log . level = 'warn'
132+ install ( prog , [ ] , ( err ) => {
133+ t . ifError ( err )
134+
135+ fs . readFile ( path . join ( expectedDir , 'installVersion' ) , 'utf8' , ( err , data ) => {
136+ t . ifError ( err )
137+ t . strictEqual ( data , '9\n' , 'correct installVersion' )
138+ } )
139+
140+ fs . readdir ( path . join ( expectedDir , 'include/node' ) , ( err , list ) => {
141+ t . ifError ( err )
142+
143+ t . ok ( list . includes ( 'common.gypi' ) )
144+ t . ok ( list . includes ( 'config.gypi' ) )
145+ t . ok ( list . includes ( 'node.h' ) )
146+ t . ok ( list . includes ( 'node_version.h' ) )
147+ t . ok ( list . includes ( 'openssl' ) )
148+ t . ok ( list . includes ( 'uv' ) )
149+ t . ok ( list . includes ( 'uv.h' ) )
150+ t . ok ( list . includes ( 'v8-platform.h' ) )
151+ t . ok ( list . includes ( 'v8.h' ) )
152+ t . ok ( list . includes ( 'zlib.h' ) )
153+ } )
154+
155+ fs . readFile ( path . join ( expectedDir , 'include/node/node_version.h' ) , 'utf8' , ( err , contents ) => {
156+ t . ifError ( err )
157+
158+ const lines = contents . split ( '\n' )
159+
160+ // extract the 3 version parts from the defines to build a valid version string and
161+ // and check them against our current env version
162+ const version = [ 'major' , 'minor' , 'patch' ] . reduce ( ( version , type ) => {
163+ const re = new RegExp ( `^#define\\sNODE_${ type . toUpperCase ( ) } _VERSION` )
164+ const line = lines . find ( ( l ) => re . test ( l ) )
165+ const i = line ? parseInt ( line . replace ( / ^ [ ^ 0 - 9 ] + ( [ 0 - 9 ] + ) .* $ / , '$1' ) , 10 ) : 'ERROR'
166+ return `${ version } ${ type !== 'major' ? '.' : 'v' } ${ i } `
167+ } , '' )
168+
169+ t . strictEqual ( version , process . version )
170+ } )
171+ } )
172+ } )
173+ } )
0 commit comments