Skip to content
This repository has been archived by the owner on Aug 11, 2021. It is now read-only.

Commit

Permalink
The code and tests
Browse files Browse the repository at this point in the history
  • Loading branch information
isaacs committed Jun 18, 2012
1 parent 48fd46e commit 79d3031
Show file tree
Hide file tree
Showing 3 changed files with 190 additions and 0 deletions.
71 changes: 71 additions & 0 deletions osenv.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
var isWindows = process.platform === 'win32'
console.error('isWindows = %j', isWindows, process.platform)
var windir = isWindows ? process.env.windir || 'C:\\Windows' : null
var path = require('path')
var exec = require('child_process').exec

// looking up envs is a bit costly.
// Also, sometimes we want to have a fallback
// Pass in a callback to wait for the fallback on failures
// After the first lookup, always returns the same thing.
function memo (key, lookup, fallback) {
var fell = false
var falling = false
exports[key] = function (cb) {
var val = lookup()
if (!val && !fell && !falling && fallback) {
fell = true
falling = true
exec(fallback, function (er, output, stderr) {
falling = false
if (er) return // oh well, we tried
val = output.trim()
})
}
exports[key] = function (cb) {
if (cb) process.nextTick(cb.bind(null, null, val))
return val
}
if (cb && !falling) process.nextTick(cb.bind(null, null, val))
return val
}
}

memo('user', function () {
return ( isWindows
? process.env.USERDOMAIN + '\\' + process.env.USERNAME
: process.env.USER
)
}, 'whoami')

memo('prompt', function () {
return isWindows ? process.env.PROMPT : process.env.PS1
})

memo('hostname', function () {
return isWindows ? process.env.COMPUTERNAME : process.env.HOSTNAME
}, 'hostname')

memo('tmpdir', function () {
var t = isWindows ? 'temp' : 'tmp'
return process.env.TMPDIR ||
process.env.TMP ||
process.env.TEMP ||
( exports.home() ? path.resolve(exports.home(), t)
: isWindows ? path.resolve(windir, t)
: '/tmp'
)
})

memo('home', function () {
return ( isWindows ? process.env.USERPROFILE
: process.env.HOME
)
})

memo('path', function () {
return (process.env.PATH ||
process.env.Path ||
process.env.path).split(isWindows ? ';' : ':')
})

57 changes: 57 additions & 0 deletions test/unix.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// only run this test on windows
// pretending to be another platform is too hacky, since it breaks
// how the underlying system looks up module paths and runs
// child processes, and all that stuff is cached.
if (process.platform === 'win32') {
console.log('TAP Version 13\n' +
'1..0\n' +
'# Skip unix tests, this is not unix\n')
return
}
var tap = require('tap')

// like unix, but funny
process.env.USER = 'sirUser'
process.env.HOME = '/home/sirUser'
process.env.HOSTNAME = 'my-machine'
process.env.TMPDIR = '/tmpdir'
process.env.TMP = '/tmp'
process.env.TEMP = '/temp'
process.env.PATH = '/opt/local/bin:/usr/local/bin:/usr/bin/:bin'
process.env.PS1 = '(o_o) $ '


tap.test('basic unix sanity test', function (t) {
var osenv = require('../osenv.js')

t.equal(osenv.user(), process.env.USER)
t.equal(osenv.home(), process.env.HOME)
t.equal(osenv.hostname(), process.env.HOSTNAME)
t.same(osenv.path(), process.env.PATH.split(':'))
t.equal(osenv.prompt(), process.env.PS1)
t.equal(osenv.tmpdir(), process.env.TMPDIR)

// mildly evil, but it's for a test.
process.env.TMPDIR = ''
delete require.cache[require.resolve('../osenv.js')]
var osenv = require('../osenv.js')
t.equal(osenv.tmpdir(), process.env.TMP)

process.env.TMP = ''
delete require.cache[require.resolve('../osenv.js')]
var osenv = require('../osenv.js')
t.equal(osenv.tmpdir(), process.env.TEMP)

process.env.TEMP = ''
delete require.cache[require.resolve('../osenv.js')]
var osenv = require('../osenv.js')
console.error('osenv.home', osenv.home())
t.equal(osenv.tmpdir(), '/home/sirUser/tmp')

delete require.cache[require.resolve('../osenv.js')]
var osenv = require('../osenv.js')
osenv.home = function () { return null }
t.equal(osenv.tmpdir(), '/tmp')

t.end()
})
62 changes: 62 additions & 0 deletions test/windows.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// only run this test on windows
// pretending to be another platform is too hacky, since it breaks
// how the underlying system looks up module paths and runs
// child processes, and all that stuff is cached.
if (process.platform !== 'win32') {
console.log('TAP Version 13\n' +
'1..0\n' +
'# Skip windows tests, this is not windows\n')
return
}

// load this before clubbing the platform name.
var tap = require('tap')

process.env.windir = 'C:\\windows'
process.env.USERDOMAIN = 'some-domain'
process.env.USERNAME = 'sirUser'
process.env.USERPROFILE = 'C:\\Users\\sirUser'
process.env.COMPUTERNAME = 'my-machine'
process.env.TMPDIR = 'C:\\tmpdir'
process.env.TMP = 'C:\\tmp'
process.env.TEMP = 'C:\\temp'
process.env.Path = 'C:\\Program Files\\;C:\\Binary Stuff\\bin'
process.env.PROMPT = '(o_o) $ '

tap.test('basic windows sanity test', function (t) {
var osenv = require('../osenv.js')

var osenv = require('../osenv.js')

t.equal(osenv.user(),
process.env.USERDOMAIN + '\\' + process.env.USERNAME)
t.equal(osenv.home(), process.env.USERPROFILE)
t.equal(osenv.hostname(), process.env.COMPUTERNAME)
t.same(osenv.path(), process.env.Path.split(';'))
t.equal(osenv.prompt(), process.env.PROMPT)
t.equal(osenv.tmpdir(), process.env.TMPDIR)

// mildly evil, but it's for a test.
process.env.TMPDIR = ''
delete require.cache[require.resolve('../osenv.js')]
var osenv = require('../osenv.js')
t.equal(osenv.tmpdir(), process.env.TMP)

process.env.TMP = ''
delete require.cache[require.resolve('../osenv.js')]
var osenv = require('../osenv.js')
t.equal(osenv.tmpdir(), process.env.TEMP)

process.env.TEMP = ''
delete require.cache[require.resolve('../osenv.js')]
var osenv = require('../osenv.js')
t.equal(osenv.tmpdir(), 'C:\\Users\\sirUser\\temp')

process.env.TEMP = ''
delete require.cache[require.resolve('../osenv.js')]
var osenv = require('../osenv.js')
osenv.home = function () { return null }
t.equal(osenv.tmpdir(), 'C:\\windows\\temp')

t.end()
})

0 comments on commit 79d3031

Please sign in to comment.