@@ -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 ( ) }  ) 
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