diff --git a/.gitignore b/.gitignore index c2658d7..130dbd5 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ node_modules/ +package-lock.json +lib/netmask.js diff --git a/CREDITS.md b/CREDITS.md new file mode 100644 index 0000000..afd31bf --- /dev/null +++ b/CREDITS.md @@ -0,0 +1,30 @@ +Credits +======= + +These credits refer to the contributors to this repository: + +[@rs](https://github.com/rs) - maintainer + +[@ryanrolds](https://github.com/ryanrolds) - Now with 0.4.x support. #2 + +[@palmerabollo](https://github.com/palmerabollo) - Expressions "1.2.3.4/" are not valid #6 + +[@steve-jansen](https://github.com/steve-jansen) - fixes typo in readme.md #7 + +[@jksdua](https://github.com/jksdua) - Added forEach helper to allow looping through usable IP addresses #9 + +[@gmiroshnykov](https://github.com/gmiroshnykov) - Tiny typo fix #10 + +[@TooTallNate](https://github.com/TooTallNate) - package: move "coffee-script" to devDependencies #11, README: fix small typo #12 + +[@yorkie](https://github.com/yorkie) - more rigid check for Netmask.constructor #13 + +[@runk](https://github.com/runk) - fix contains method for netmasks #18 + +[@yvesago](https://github.com/yvesago) - a patch with mocha test to fix /31 and /32 block.contains #20 + +[@meteormatt](https://github.com/meteormatt) - The comment in README.md is wrong #22 + +[@dschenkelman](https://github.com/dschenkelman) - Avoid large memory allocations when doing forEach in case netmask is large (e.g. /8) #34 + +[@sickcodes](https://github.com/sickcodes), [@kaoudis](https://github.com/kaoudis), [@Koroeskohr](https://github.com/Koroeskohr), [@nicksahler](https://github.com/nicksahler) - harden error handling, add a few more tests, and include CREDITS.md #36 diff --git a/README.md b/README.md index 0b916d4..2441303 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,11 @@ Installation $ npm install netmask +Run all tests (vows plus mocha) +------------------------------- + + $ npm test + License ------- diff --git a/package.json b/package.json index 5741197..f29c786 100644 --- a/package.json +++ b/package.json @@ -23,13 +23,14 @@ "main": "./lib/netmask", "scripts": { "prepublish": "coffee -c lib/*.coffee", - "test": "vows --spec test/*" + "test": "coffee -c lib/*.coffee && vows --spec test/* && mocha tests/*" }, "engines": { "node": ">= 0.4.0" }, "devDependencies": { "coffee-script": ">=1.2.0", + "mocha": "^8.3.2", "vows": "*" } } diff --git a/tests/netmask.js b/tests/netmask.js index a3ce003..9f7c09f 100644 --- a/tests/netmask.js +++ b/tests/netmask.js @@ -1,24 +1,103 @@ -/* some troubles with vows - here is some mocha test - - npm install - mocha tests/netmask.js -*/ -var assert = require('assert'); - -var Netmask = require('../').Netmask; - -var block = new Netmask('10.1.2.0/24'); -var b1 = new Netmask('10.1.2.10/29'); -var b2 = new Netmask('10.1.2.10/31'); -var b3 = new Netmask('10.1.2.20/32'); - - console.log('first : '+b2.base); - console.log('broadcast : '+b2.broadcast); - console.log('last : ' + b2.last); - -describe("Netmask contains bug", function() { - assert.equal(block.contains(b1),true); - assert.equal(block.contains(b2),true); - assert.equal(block.contains(b3),true); -}); +/* It is important to test our Javascript output as well as our coffeescript, + * since code that is transpiled may be slightly different in effect from the + * original. + * + * Run these tests (against lib/netmask.js, not lib/netmask.coffee directly) + * using mocha, after re-generating lib/netmask.js including your changes: + * + * mocha tests/netmask.js + */ + +const assert = require('assert'); +const Netmask = require('../').Netmask; + +describe('Netmask', () => { + describe('can build a block', () => { + let block = new Netmask('10.1.2.0/24'); + + it('should contain a sub-block', () => { + let block1 = new Netmask('10.1.2.10/29'); + assert(block.contains(block1)); + }); + + it('should contain another sub-block', () => { + let block2 = new Netmask('10.1.2.10/31'); + assert(block.contains(block2)); + }); + + it('should contain a third sub-block', () => { + let block3 = new Netmask('10.1.2.20/32'); + assert(block.contains(block3)); + }); + }); + + describe('when presented with an octet which is not a number', () => { + let block = new Netmask('192.168.0.0/29') + + it('should throw', () => { + assert.throws(() => block.contains('192.168.~.4'), Error); + }); + }); + + describe('can handle hexadecimal, octal, & decimal octets in input IP', () => { + let block1 = new Netmask('31.0.0.0/19'); + let block2 = new Netmask('127.0.0.0/8'); + let block3 = new Netmask('255.0.0.1/12'); + let block4 = new Netmask('10.0.0.1/8'); + let block5 = new Netmask('1.0.0.1/4'); + + describe('octal', () => { + it('block 31.0.0.0/19 does not contain 031.0.5.5', () => { + assert(!block1.contains('031.0.5.5')); + }); + it('block 127.0.0.0/8 contains 0177.0.0.2 (127.0.0.2)', () => { + assert(block2.contains('0177.0.0.2')); + }); + it('block 255.0.0.1/12 does not contain 0255.0.0.2 (173.0.0.2)', () => { + assert(!block3.contains('0255.0.0.2')); + }); + it('block 10.0.0.1/8 contains 012.0.0.255 (10.0.0.255)', () => { + assert(block4.contains('012.0.0.255')); + }); + it('block 1.0.0.1/4 contains 01.02.03.04', () => { + assert(block5.contains('01.02.03.04')); + }); + }); + + describe('hexadecimal', () => { + it('block 31.0.0.0/19 does not contain 0x31.0.5.5', () => { + assert(!block1.contains('0x31.0.5.5')); + }); + it('block 127.0.0.0/8 contains 0x7f.0.0.0x2 (127.0.0.2)', () => { + assert(block2.contains('0x7f.0.0.0x2')); + }); + it('block 255.0.0.1/12 contains 0xff.0.0.2', () => { + assert(block3.contains('0xff.0.0.2')); + }); + it('block 10.0.0.1/8 does not contain 0x10.0.0.255', () => { + assert(!block4.contains('0x10.0.0.255')); + }); + it('block 1.0.0.1/4 contains 0x1.0x2.0x3.0x4', () => { + assert(block5.contains('0x1.0x2.0x3.0x4')); + }); + }); + + describe('decimal', () => { + it('block 31.0.0.0/19 contains 31.0.5.5', () => { + assert(block1.contains('31.0.5.5')); + }); + it('block 127.0.0.0/8 does not contain 128.0.0.2', () =>{ + assert(!block2.contains('128.0.0.2')); + }); + it('block 255.0.0.1/12 contains 255.0.0.2', () => { + assert(block3.contains('255.0.0.2')); + }); + it('block 10.0.0.1/8 contains 10.0.0.255', () => { + assert(block4.contains('10.0.0.255')); + }); + it('block 1.0.0.1/4 contains 1.2.3.4', () => { + assert(block5.contains('1.2.3.4')); + }); + }); + }); +}); \ No newline at end of file