tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

api-test.js (14160B)


      1 'use strict';
      2 
      3 var ip = require('..');
      4 var assert = require('assert');
      5 var net = require('net');
      6 var os = require('os');
      7 
      8 describe('IP library for node.js', function() {
      9  describe('toBuffer()/toString() methods', function() {
     10    it('should convert to buffer IPv4 address', function() {
     11      var buf = ip.toBuffer('127.0.0.1');
     12      assert.equal(buf.toString('hex'), '7f000001');
     13      assert.equal(ip.toString(buf), '127.0.0.1');
     14    });
     15 
     16    it('should convert to buffer IPv4 address in-place', function() {
     17      var buf = Buffer.alloc(128);
     18      var offset = 64;
     19      ip.toBuffer('127.0.0.1', buf, offset);
     20      assert.equal(buf.toString('hex', offset, offset + 4), '7f000001');
     21      assert.equal(ip.toString(buf, offset, 4), '127.0.0.1');
     22    });
     23 
     24    it('should convert to buffer IPv6 address', function() {
     25      var buf = ip.toBuffer('::1');
     26      assert(/(00){15,15}01/.test(buf.toString('hex')));
     27      assert.equal(ip.toString(buf), '::1');
     28      assert.equal(ip.toString(ip.toBuffer('1::')), '1::');
     29      assert.equal(ip.toString(ip.toBuffer('abcd::dcba')), 'abcd::dcba');
     30    });
     31 
     32    it('should convert to buffer IPv6 address in-place', function() {
     33      var buf = Buffer.alloc(128);
     34      var offset = 64;
     35      ip.toBuffer('::1', buf, offset);
     36      assert(/(00){15,15}01/.test(buf.toString('hex', offset, offset + 16)));
     37      assert.equal(ip.toString(buf, offset, 16), '::1');
     38      assert.equal(ip.toString(ip.toBuffer('1::', buf, offset),
     39                               offset, 16), '1::');
     40      assert.equal(ip.toString(ip.toBuffer('abcd::dcba', buf, offset),
     41                               offset, 16), 'abcd::dcba');
     42    });
     43 
     44    it('should convert to buffer IPv6 mapped IPv4 address', function() {
     45      var buf = ip.toBuffer('::ffff:127.0.0.1');
     46      assert.equal(buf.toString('hex'), '00000000000000000000ffff7f000001');
     47      assert.equal(ip.toString(buf), '::ffff:7f00:1');
     48 
     49      buf = ip.toBuffer('ffff::127.0.0.1');
     50      assert.equal(buf.toString('hex'), 'ffff000000000000000000007f000001');
     51      assert.equal(ip.toString(buf), 'ffff::7f00:1');
     52 
     53      buf = ip.toBuffer('0:0:0:0:0:ffff:127.0.0.1');
     54      assert.equal(buf.toString('hex'), '00000000000000000000ffff7f000001');
     55      assert.equal(ip.toString(buf), '::ffff:7f00:1');
     56    });
     57  });
     58 
     59  describe('fromPrefixLen() method', function() {
     60    it('should create IPv4 mask', function() {
     61      assert.equal(ip.fromPrefixLen(24), '255.255.255.0');
     62    });
     63    it('should create IPv6 mask', function() {
     64      assert.equal(ip.fromPrefixLen(64), 'ffff:ffff:ffff:ffff::');
     65    });
     66    it('should create IPv6 mask explicitly', function() {
     67      assert.equal(ip.fromPrefixLen(24, 'IPV6'), 'ffff:ff00::');
     68    });
     69  });
     70 
     71  describe('not() method', function() {
     72    it('should reverse bits in address', function() {
     73      assert.equal(ip.not('255.255.255.0'), '0.0.0.255');
     74    });
     75  });
     76 
     77  describe('or() method', function() {
     78    it('should or bits in ipv4 addresses', function() {
     79      assert.equal(ip.or('0.0.0.255', '192.168.1.10'), '192.168.1.255');
     80    });
     81    it('should or bits in ipv6 addresses', function() {
     82      assert.equal(ip.or('::ff', '::abcd:dcba:abcd:dcba'),
     83                   '::abcd:dcba:abcd:dcff');
     84    });
     85    it('should or bits in mixed addresses', function() {
     86      assert.equal(ip.or('0.0.0.255', '::abcd:dcba:abcd:dcba'),
     87                   '::abcd:dcba:abcd:dcff');
     88    });
     89  });
     90 
     91  describe('mask() method', function() {
     92    it('should mask bits in address', function() {
     93      assert.equal(ip.mask('192.168.1.134', '255.255.255.0'), '192.168.1.0');
     94      assert.equal(ip.mask('192.168.1.134', '::ffff:ff00'), '::ffff:c0a8:100');
     95    });
     96 
     97    it('should not leak data', function() {
     98      for (var i = 0; i < 10; i++)
     99        assert.equal(ip.mask('::1', '0.0.0.0'), '::');
    100    });
    101  });
    102 
    103  describe('subnet() method', function() {
    104    // Test cases calculated with http://www.subnet-calculator.com/
    105    var ipv4Subnet = ip.subnet('192.168.1.134', '255.255.255.192');
    106 
    107    it('should compute ipv4 network address', function() {
    108      assert.equal(ipv4Subnet.networkAddress, '192.168.1.128');
    109    });
    110 
    111    it('should compute ipv4 network\'s first address', function() {
    112      assert.equal(ipv4Subnet.firstAddress, '192.168.1.129');
    113    });
    114 
    115    it('should compute ipv4 network\'s last address', function() {
    116      assert.equal(ipv4Subnet.lastAddress, '192.168.1.190');
    117    });
    118 
    119    it('should compute ipv4 broadcast address', function() {
    120      assert.equal(ipv4Subnet.broadcastAddress, '192.168.1.191');
    121    });
    122 
    123    it('should compute ipv4 subnet number of addresses', function() {
    124      assert.equal(ipv4Subnet.length, 64);
    125    });
    126 
    127    it('should compute ipv4 subnet number of addressable hosts', function() {
    128      assert.equal(ipv4Subnet.numHosts, 62);
    129    });
    130 
    131    it('should compute ipv4 subnet mask', function() {
    132      assert.equal(ipv4Subnet.subnetMask, '255.255.255.192');
    133    });
    134 
    135    it('should compute ipv4 subnet mask\'s length', function() {
    136      assert.equal(ipv4Subnet.subnetMaskLength, 26);
    137    });
    138 
    139    it('should know whether a subnet contains an address', function() {
    140      assert.equal(ipv4Subnet.contains('192.168.1.180'), true);
    141    });
    142 
    143    it('should know whether a subnet does not contain an address', function() {
    144      assert.equal(ipv4Subnet.contains('192.168.1.195'), false);
    145    });
    146  });
    147 
    148  describe('subnet() method with mask length 32', function() {
    149    // Test cases calculated with http://www.subnet-calculator.com/
    150    var ipv4Subnet = ip.subnet('192.168.1.134', '255.255.255.255');
    151    it('should compute ipv4 network\'s first address', function() {
    152      assert.equal(ipv4Subnet.firstAddress, '192.168.1.134');
    153    });
    154 
    155    it('should compute ipv4 network\'s last address', function() {
    156      assert.equal(ipv4Subnet.lastAddress, '192.168.1.134');
    157    });
    158 
    159    it('should compute ipv4 subnet number of addressable hosts', function() {
    160      assert.equal(ipv4Subnet.numHosts, 1);
    161    });
    162  });
    163 
    164  describe('subnet() method with mask length 31', function() {
    165    // Test cases calculated with http://www.subnet-calculator.com/
    166    var ipv4Subnet = ip.subnet('192.168.1.134', '255.255.255.254');
    167    it('should compute ipv4 network\'s first address', function() {
    168      assert.equal(ipv4Subnet.firstAddress, '192.168.1.134');
    169    });
    170 
    171    it('should compute ipv4 network\'s last address', function() {
    172      assert.equal(ipv4Subnet.lastAddress, '192.168.1.135');
    173    });
    174 
    175    it('should compute ipv4 subnet number of addressable hosts', function() {
    176      assert.equal(ipv4Subnet.numHosts, 2);
    177    });
    178  });
    179 
    180  describe('cidrSubnet() method', function() {
    181    // Test cases calculated with http://www.subnet-calculator.com/
    182    var ipv4Subnet = ip.cidrSubnet('192.168.1.134/26');
    183 
    184    it('should compute an ipv4 network address', function() {
    185      assert.equal(ipv4Subnet.networkAddress, '192.168.1.128');
    186    });
    187 
    188    it('should compute an ipv4 network\'s first address', function() {
    189      assert.equal(ipv4Subnet.firstAddress, '192.168.1.129');
    190    });
    191 
    192    it('should compute an ipv4 network\'s last address', function() {
    193      assert.equal(ipv4Subnet.lastAddress, '192.168.1.190');
    194    });
    195 
    196    it('should compute an ipv4 broadcast address', function() {
    197      assert.equal(ipv4Subnet.broadcastAddress, '192.168.1.191');
    198    });
    199 
    200    it('should compute an ipv4 subnet number of addresses', function() {
    201      assert.equal(ipv4Subnet.length, 64);
    202    });
    203 
    204    it('should compute an ipv4 subnet number of addressable hosts', function() {
    205      assert.equal(ipv4Subnet.numHosts, 62);
    206    });
    207 
    208    it('should compute an ipv4 subnet mask', function() {
    209      assert.equal(ipv4Subnet.subnetMask, '255.255.255.192');
    210    });
    211 
    212    it('should compute an ipv4 subnet mask\'s length', function() {
    213      assert.equal(ipv4Subnet.subnetMaskLength, 26);
    214    });
    215 
    216    it('should know whether a subnet contains an address', function() {
    217      assert.equal(ipv4Subnet.contains('192.168.1.180'), true);
    218    });
    219 
    220    it('should know whether a subnet contains an address', function() {
    221      assert.equal(ipv4Subnet.contains('192.168.1.195'), false);
    222    });
    223 
    224  });
    225 
    226  describe('cidr() method', function() {
    227    it('should mask address in CIDR notation', function() {
    228      assert.equal(ip.cidr('192.168.1.134/26'), '192.168.1.128');
    229      assert.equal(ip.cidr('2607:f0d0:1002:51::4/56'), '2607:f0d0:1002::');
    230    });
    231  });
    232 
    233  describe('isEqual() method', function() {
    234    it('should check if addresses are equal', function() {
    235      assert(ip.isEqual('127.0.0.1', '::7f00:1'));
    236      assert(!ip.isEqual('127.0.0.1', '::7f00:2'));
    237      assert(ip.isEqual('127.0.0.1', '::ffff:7f00:1'));
    238      assert(!ip.isEqual('127.0.0.1', '::ffaf:7f00:1'));
    239      assert(ip.isEqual('::ffff:127.0.0.1', '::ffff:127.0.0.1'));
    240      assert(ip.isEqual('::ffff:127.0.0.1', '127.0.0.1'));
    241    });
    242  });
    243 
    244 
    245  describe('isPrivate() method', function() {
    246    it('should check if an address is localhost', function() {
    247      assert.equal(ip.isPrivate('127.0.0.1'), true);
    248    });
    249 
    250    it('should check if an address is from a 192.168.x.x network', function() {
    251      assert.equal(ip.isPrivate('192.168.0.123'), true);
    252      assert.equal(ip.isPrivate('192.168.122.123'), true);
    253      assert.equal(ip.isPrivate('192.162.1.2'), false);
    254    });
    255 
    256    it('should check if an address is from a 172.16.x.x network', function() {
    257      assert.equal(ip.isPrivate('172.16.0.5'), true);
    258      assert.equal(ip.isPrivate('172.16.123.254'), true);
    259      assert.equal(ip.isPrivate('171.16.0.5'), false);
    260      assert.equal(ip.isPrivate('172.25.232.15'), true);
    261      assert.equal(ip.isPrivate('172.15.0.5'), false);
    262      assert.equal(ip.isPrivate('172.32.0.5'), false);
    263    });
    264 
    265    it('should check if an address is from a 169.254.x.x network', function() {
    266      assert.equal(ip.isPrivate('169.254.2.3'), true);
    267      assert.equal(ip.isPrivate('169.254.221.9'), true);
    268      assert.equal(ip.isPrivate('168.254.2.3'), false);
    269    });
    270 
    271    it('should check if an address is from a 10.x.x.x network', function() {
    272      assert.equal(ip.isPrivate('10.0.2.3'), true);
    273      assert.equal(ip.isPrivate('10.1.23.45'), true);
    274      assert.equal(ip.isPrivate('12.1.2.3'), false);
    275    });
    276 
    277    it('should check if an address is from a private IPv6 network', function() {
    278      assert.equal(ip.isPrivate('fd12:3456:789a:1::1'), true);
    279      assert.equal(ip.isPrivate('fe80::f2de:f1ff:fe3f:307e'), true);
    280      assert.equal(ip.isPrivate('::ffff:10.100.1.42'), true);
    281      assert.equal(ip.isPrivate('::FFFF:172.16.200.1'), true);
    282      assert.equal(ip.isPrivate('::ffff:192.168.0.1'), true);
    283    });
    284 
    285    it('should check if an address is from the internet', function() {
    286      assert.equal(ip.isPrivate('165.225.132.33'), false); // joyent.com
    287    });
    288 
    289    it('should check if an address is a loopback IPv6 address', function() {
    290      assert.equal(ip.isPrivate('::'), true);
    291      assert.equal(ip.isPrivate('::1'), true);
    292      assert.equal(ip.isPrivate('fe80::1'), true);
    293    });
    294  });
    295 
    296  describe('loopback() method', function() {
    297    describe('undefined', function() {
    298      it('should respond with 127.0.0.1', function() {
    299        assert.equal(ip.loopback(), '127.0.0.1')
    300      });
    301    });
    302 
    303    describe('ipv4', function() {
    304      it('should respond with 127.0.0.1', function() {
    305        assert.equal(ip.loopback('ipv4'), '127.0.0.1')
    306      });
    307    });
    308 
    309    describe('ipv6', function() {
    310      it('should respond with fe80::1', function() {
    311        assert.equal(ip.loopback('ipv6'), 'fe80::1')
    312      });
    313    });
    314  });
    315 
    316  describe('isLoopback() method', function() {
    317    describe('127.0.0.1', function() {
    318      it('should respond with true', function() {
    319        assert.ok(ip.isLoopback('127.0.0.1'))
    320      });
    321    });
    322 
    323    describe('127.8.8.8', function () {
    324      it('should respond with true', function () {
    325        assert.ok(ip.isLoopback('127.8.8.8'))
    326      });
    327    });
    328 
    329    describe('8.8.8.8', function () {
    330      it('should respond with false', function () {
    331        assert.equal(ip.isLoopback('8.8.8.8'), false);
    332      });
    333    });
    334 
    335    describe('fe80::1', function() {
    336      it('should respond with true', function() {
    337        assert.ok(ip.isLoopback('fe80::1'))
    338      });
    339    });
    340 
    341    describe('::1', function() {
    342      it('should respond with true', function() {
    343        assert.ok(ip.isLoopback('::1'))
    344      });
    345    });
    346 
    347    describe('::', function() {
    348      it('should respond with true', function() {
    349        assert.ok(ip.isLoopback('::'))
    350      });
    351    });
    352  });
    353 
    354  describe('address() method', function() {
    355    describe('undefined', function() {
    356      it('should respond with a private ip', function() {
    357        assert.ok(ip.isPrivate(ip.address()));
    358      });
    359    });
    360 
    361    describe('private', function() {
    362      [ undefined, 'ipv4', 'ipv6' ].forEach(function(family) {
    363        describe(family, function() {
    364          it('should respond with a private ip', function() {
    365            assert.ok(ip.isPrivate(ip.address('private', family)));
    366          });
    367        });
    368      });
    369    });
    370 
    371    var interfaces = os.networkInterfaces();
    372 
    373    Object.keys(interfaces).forEach(function(nic) {
    374      describe(nic, function() {
    375        [ undefined, 'ipv4' ].forEach(function(family) {
    376          describe(family, function() {
    377            it('should respond with an ipv4 address', function() {
    378              var addr = ip.address(nic, family);
    379              assert.ok(!addr || net.isIPv4(addr));
    380            });
    381          });
    382        });
    383 
    384        describe('ipv6', function() {
    385          it('should respond with an ipv6 address', function() {
    386            var addr = ip.address(nic, 'ipv6');
    387            assert.ok(!addr || net.isIPv6(addr));
    388          });
    389        })
    390      });
    391    });
    392  });
    393 
    394  describe('toLong() method', function() {
    395    it('should respond with a int', function() {
    396      assert.equal(ip.toLong('127.0.0.1'), 2130706433);
    397      assert.equal(ip.toLong('255.255.255.255'), 4294967295);
    398    });
    399  });
    400 
    401  describe('fromLong() method', function() {
    402    it('should repond with ipv4 address', function() {
    403      assert.equal(ip.fromLong(2130706433), '127.0.0.1');
    404      assert.equal(ip.fromLong(4294967295), '255.255.255.255');
    405    });
    406  })
    407 });