892 lines
27 KiB
JavaScript
892 lines
27 KiB
JavaScript
var test = require('tap').test;
|
|
var errors = require('../lib/memjs/protocol').errors;
|
|
var MemJS = require('../');
|
|
|
|
test('GetSuccessful', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
n += 1;
|
|
dummyServer.respond(
|
|
{header: {status: 0, opaque: request.header.opaque},
|
|
val: 'world', extras: 'flagshere'});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
var assertor = function(err, val, flags) {
|
|
t.equal('world', val);
|
|
t.equal('flagshere', flags);
|
|
t.equal(null, err);
|
|
t.equal(1, n, 'Ensure get is called');
|
|
};
|
|
client.get('hello', assertor);
|
|
n = 0;
|
|
return client.get('hello').then(function(res) {
|
|
assertor(null, res.value, res.flags);
|
|
});
|
|
});
|
|
|
|
test('GetNotFound', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
n += 1;
|
|
dummyServer.respond(
|
|
{header: {status: 1, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
var assertor = function(val, flags) {
|
|
t.equal(null, val);
|
|
t.equal(null, flags);
|
|
t.equal(1, n, 'Ensure get is called');
|
|
t.end();
|
|
};
|
|
client.get('hello', assertor);
|
|
n = 0;
|
|
return client.get('hello').then(function(res) {
|
|
assertor(null, res.value, res.extras);
|
|
});
|
|
});
|
|
|
|
test('GetSerializer', function(t) {
|
|
var n = 0;
|
|
var dn = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
n += 1;
|
|
dummyServer.respond(
|
|
{header: {status: 0, opaque: request.header.opaque},
|
|
val: 'world', extras: 'flagshere'});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer], {
|
|
serializer: {
|
|
serialize: function(opcode, value, extras){
|
|
return { value: value, extras: extras };
|
|
},
|
|
deserialize: function (opcode, value, extras) {
|
|
dn += 1;
|
|
return { value: 'deserialized', extras: extras };
|
|
}
|
|
}
|
|
});
|
|
var assertor = function(err, val, flags) {
|
|
t.equal('deserialized', val);
|
|
t.equal('flagshere', flags);
|
|
t.equal(null, err);
|
|
t.equal(1, n, 'Ensure get is called');
|
|
t.equal(1, dn, 'Ensure deserialization is called once');
|
|
};
|
|
client.get('hello', assertor);
|
|
n = 0;
|
|
dn = 0;
|
|
return client.get('hello').then(function(res) {
|
|
assertor(null, res.value, res.flags);
|
|
});
|
|
});
|
|
|
|
test('SetSuccessful', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
var assertor = function(err, val) {
|
|
t.equal(true, val);
|
|
t.equal(null, err);
|
|
t.equal(1, n, 'Ensure set is called');
|
|
};
|
|
client.set('hello', 'world', {}, assertor);
|
|
n = 0;
|
|
return client.set('hello', 'world', {}).then(function (success){
|
|
assertor(null, success);
|
|
});
|
|
});
|
|
|
|
test('SetSuccessfulWithoutOption', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
client.set('hello', 'world', function(err, val) {
|
|
t.equal(true, val);
|
|
t.equal(null, err);
|
|
t.equal(1, n, 'Ensure set is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('SetPromiseWithoutOption', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
return client.set('hello', 'world').then(function(val) {
|
|
t.equal(true, val);
|
|
t.equal(1, n, 'Ensure set is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('SetWithExpiration', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
t.equal('\0\0\0\0\0\0\4\0', request.extras.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer], {expires: 1024});
|
|
client.set('hello', 'world', {}, function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(true, val);
|
|
t.equal(1, n, 'Ensure set is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('SetUnsuccessful', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 3, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
var assertor = function(err, val) {
|
|
t.equal(null, val);
|
|
t.equal('MemJS SET: ' + errors[3], err.message);
|
|
t.equal(1, n, 'Ensure set is called');
|
|
};
|
|
client.set('hello', 'world', {}, assertor);
|
|
n = 0;
|
|
return client.set('hello', 'world', {}).catch(function(err) {
|
|
assertor(err, null);
|
|
});
|
|
});
|
|
|
|
test('SetError', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
n += 1;
|
|
dummyServer.error({message: 'This is an expected error.'});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
client.set('hello', 'world', {}, function(err, val) {
|
|
t.notEqual(null, err);
|
|
t.equal('This is an expected error.', err.message);
|
|
t.equal(null, val);
|
|
t.equal(2, n, 'Ensure set is retried once');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('SetError', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
setTimeout(function() {
|
|
n += 1;
|
|
dummyServer.error({message: 'This is an expected error.'});
|
|
}, 100);
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer], {retries: 2});
|
|
client.set('hello', 'world', {}, function(err /*, val */) {
|
|
t.equal(2, n, 'Ensure set is retried once');
|
|
t.ok(err, 'Ensure callback called with error');
|
|
t.equal('This is an expected error.', err.message);
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('SetErrorConcurrent', function(t) {
|
|
var n = 0;
|
|
var callbn1 = 0;
|
|
var callbn2 = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(/* requestBuf */) {
|
|
n += 1;
|
|
dummyServer.error({message: 'This is an expected error.'});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer], {retries: 2});
|
|
client.set('hello', 'world', {}, function(err /*, val */) {
|
|
t.ok(err, 'Ensure callback called with error');
|
|
t.equal('This is an expected error.', err.message);
|
|
callbn1 += 1;
|
|
done();
|
|
});
|
|
|
|
client.set('foo', 'bar', {}, function(err /*, val */) {
|
|
t.ok(err, 'Ensure callback called with error');
|
|
t.equal('This is an expected error.', err.message);
|
|
callbn2 += 1;
|
|
done();
|
|
});
|
|
|
|
var done =(function() {
|
|
var called = 0;
|
|
return function() {
|
|
called += 1;
|
|
if (called < 2) return;
|
|
t.equal(1, callbn1, 'Ensure callback 1 is called once');
|
|
t.equal(1, callbn2, 'Ensure callback 2 is called once');
|
|
t.equal(4, n, 'Ensure error sent twice for each set call');
|
|
t.end();
|
|
};
|
|
})();
|
|
});
|
|
|
|
test('SetUnicode', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('éééoào', request.val.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
client.set('hello', 'éééoào', {}, function(err, val) {
|
|
t.equal(true, val);
|
|
t.equal(1, n, 'Ensure set is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('SetSerialize', function(t) {
|
|
var n = 0;
|
|
var sn = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('serialized', request.val.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 3, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer], {
|
|
serializer: {
|
|
serialize: function(opcode, value, extras){
|
|
sn += 1;
|
|
return { value: 'serialized', extras: extras };
|
|
},
|
|
deserialize: function (opcode, value, extras) {
|
|
return { value: value, extras: extras };
|
|
}
|
|
}
|
|
});
|
|
var assertor = function(err, val) {
|
|
t.equal(null, val);
|
|
t.equal('MemJS SET: ' + errors[3], err.message);
|
|
t.equal(1, n, 'Ensure set is called');
|
|
t.equal(1, sn, 'Ensure serialization is called once');
|
|
};
|
|
client.set('hello', 'world', {}, assertor);
|
|
n = 0;
|
|
sn = 0;
|
|
return client.set('hello', 'world', {}).catch(function(err) {
|
|
assertor(err, null);
|
|
});
|
|
});
|
|
|
|
test('AddSuccessful', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
t.equal('0000000000000400', request.extras.toString('hex'));
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer], {expires: 1024});
|
|
var assertor = function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(true, val);
|
|
t.equal(1, n, 'Ensure add is called');
|
|
};
|
|
client.add('hello', 'world', {}, assertor);
|
|
n = 0;
|
|
return client.add('hello', 'world', {}).then(function(success) {
|
|
assertor(null, success);
|
|
});
|
|
});
|
|
|
|
test('AddSuccessfulWithoutOption', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
t.equal('0000000000000400', request.extras.toString('hex'));
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer], {expires: 1024});
|
|
client.add('hello', 'world', function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(true, val);
|
|
t.equal(1, n, 'Ensure add is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('AddKeyExists', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 2, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
client.add('hello', 'world', {}, function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(false, val);
|
|
t.equal(1, n, 'Ensure add is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('AddSerializer', function(t) {
|
|
var n = 0;
|
|
var sn = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('serialized', request.val.toString());
|
|
t.equal('0000000100000400', request.extras.toString('hex'));
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer], {
|
|
expires: 1024,
|
|
serializer: {
|
|
serialize: function(opcode, value, extras){
|
|
sn += 1;
|
|
extras.writeUInt32BE(1, 0);
|
|
return { value: 'serialized', extras: extras };
|
|
},
|
|
deserialize: function (opcode, value, extras) {
|
|
return { value: value, extras: extras };
|
|
}
|
|
}
|
|
});
|
|
var assertor = function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(true, val);
|
|
t.equal(1, n, 'Ensure add is called');
|
|
t.equal(1, sn, 'Ensure serialization is called once');
|
|
};
|
|
client.add('hello', 'world', {}, assertor);
|
|
n = 0;
|
|
sn = 0;
|
|
return client.add('hello', 'world', {}).then(function(success) {
|
|
assertor(null, success);
|
|
});
|
|
});
|
|
|
|
test('ReplaceSuccessful', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
t.equal('\0\0\0\0\0\0\4\0', request.extras.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer], {expires: 1024});
|
|
var assertor = function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(true, val);
|
|
t.equal(1, n, 'Ensure replace is called');
|
|
};
|
|
client.replace('hello', 'world', {}, assertor);
|
|
n = 0;
|
|
return client.replace('hello', 'world', {}).then(function(success){
|
|
assertor(null, success);
|
|
});
|
|
});
|
|
|
|
test('ReplaceSuccessfulWithoutOption', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
t.equal('\0\0\0\0\0\0\4\0', request.extras.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer], {expires: 1024});
|
|
client.replace('hello', 'world', function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(true, val);
|
|
t.equal(1, n, 'Ensure replace is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('ReplaceKeyDNE', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 1, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
client.replace('hello', 'world', {}, function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(false, val);
|
|
t.equal(1, n, 'Ensure replace is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('DeleteSuccessful', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
var assertor = function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(true, val);
|
|
t.equal(1, n, 'Ensure delete is called');
|
|
};
|
|
client.delete('hello', assertor);
|
|
n = 0;
|
|
return client.delete('hello').then(function(success) {
|
|
assertor(null, success);
|
|
});
|
|
});
|
|
|
|
test('DeleteKeyDNE', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 1, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
client.delete('hello', function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(false, val);
|
|
t.equal(1, n, 'Ensure delete is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('Flush', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.host = 'example.com';
|
|
dummyServer.port = 1234;
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal(0x08, request.header.opcode);
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 1, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer, dummyServer]);
|
|
var assertor = function(err, results) {
|
|
t.equal(null, err);
|
|
t.equal(true, results['example.com:1234']);
|
|
t.equal(2, n, 'Ensure flush is called for each server');
|
|
};
|
|
client.flush(assertor);
|
|
n = 0;
|
|
return client.flush().then(function(results) {
|
|
assertor(null, results);
|
|
});
|
|
});
|
|
|
|
test('Stats', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.host = 'myhostname';
|
|
dummyServer.port = 5544;
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal(0x10, request.header.opcode);
|
|
n += 1;
|
|
dummyServer.respond({
|
|
header: {status: 0, totalBodyLength: 9, opaque: request.header.opaque},
|
|
key: 'bytes', val: '1432'});
|
|
dummyServer.respond({
|
|
header: {status: 0, totalBodyLength: 9, opaque: request.header.opaque},
|
|
key: 'count', val: '5432'});
|
|
dummyServer.respond({
|
|
header: {status: 0, totalBodyLength: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
client.stats(function(err, server, stats) {
|
|
t.equal(null, err);
|
|
t.equal('1432', stats.bytes);
|
|
t.equal('5432', stats.count);
|
|
t.equal('myhostname:5544', server);
|
|
t.equal(1, n, 'Ensure stats is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('IncrementSuccessful', function(t) {
|
|
var n = 0;
|
|
var callbn = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
|
|
var expectedExtras = [
|
|
'\0\0\0\0\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0',
|
|
'\0\0\0\0\0\0\0\5\0\0\0\0\0\0\0\3\0\0\0\0'
|
|
];
|
|
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal(5, request.header.opcode);
|
|
t.equal('number-increment-test', request.key.toString());
|
|
t.equal('', request.val.toString());
|
|
t.equal(expectedExtras[n], request.extras.toString());
|
|
n += 1;
|
|
process.nextTick(function() {
|
|
var value = Buffer.alloc(8);
|
|
value.writeUInt32BE(request.header.opcode + 1, 4);
|
|
value.writeUInt32BE(0, 0);
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}, val: value});
|
|
});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
client.increment('number-increment-test', 5, {}, function(err, success, val){
|
|
callbn += 1;
|
|
t.equal(true, success);
|
|
t.equal(6, val);
|
|
t.equal(null, err);
|
|
done();
|
|
});
|
|
|
|
client.increment('number-increment-test', 5, { initial: 3 }, function(err, success, val) {
|
|
callbn += 1;
|
|
t.equal(true, success);
|
|
t.equal(6, val);
|
|
t.equal(null, err);
|
|
done();
|
|
});
|
|
|
|
var done =(function() {
|
|
var called = 0;
|
|
return function() {
|
|
called += 1;
|
|
if (called < 2) return;
|
|
t.equal(2, n, 'Ensure increment is called twice');
|
|
t.equal(2, callbn, 'Ensure callback is called twice');
|
|
t.end();
|
|
};
|
|
})();
|
|
});
|
|
|
|
test('DecrementSuccessful', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal(6, request.header.opcode);
|
|
t.equal('number-decrement-test', request.key.toString());
|
|
t.equal('', request.val.toString());
|
|
t.equal('\0\0\0\0\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0', request.extras.toString());
|
|
n += 1;
|
|
process.nextTick(function() {
|
|
var value = Buffer.alloc(8);
|
|
value.writeUInt32BE(request.header.opcode, 4);
|
|
value.writeUInt32BE(0, 0);
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}, val: value});
|
|
});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
client.decrement('number-decrement-test', 5, {}, function(err, success, val) {
|
|
t.equal(true, success);
|
|
t.equal(6, val);
|
|
t.equal(null, err);
|
|
t.equal(1, n, 'Ensure decr is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('DecrementSuccessfulWithoutOption', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal(6, request.header.opcode);
|
|
t.equal('number-decrement-test', request.key.toString());
|
|
t.equal('', request.val.toString());
|
|
t.equal('\0\0\0\0\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0', request.extras.toString());
|
|
n += 1;
|
|
process.nextTick(function() {
|
|
var value = Buffer.alloc(8);
|
|
value.writeUInt32BE(request.header.opcode, 4);
|
|
value.writeUInt32BE(0, 0);
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}, val: value});
|
|
});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
client.decrement('number-decrement-test', 5, function(err, success, val) {
|
|
t.equal(true, success);
|
|
t.equal(6, val);
|
|
t.equal(null, err);
|
|
t.equal(1, n, 'Ensure decr is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('AppendSuccessful', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer], {expires: 1024});
|
|
client.append('hello', 'world', function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(true, val);
|
|
t.equal(1, n, 'Ensure append is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('AppendKeyDNE', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 1, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
client.append('hello', 'world', function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(false, val);
|
|
t.equal(1, n, 'Ensure append is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('PrependSuccessful', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer], {expires: 1024});
|
|
client.prepend('hello', 'world', function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(true, val);
|
|
t.equal(1, n, 'Ensure prepend is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('PrependKeyDNE', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 1, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
client.prepend('hello', 'world', function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(false, val);
|
|
t.equal(1, n, 'Ensure prepend is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('TouchSuccessful', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('', request.val.toString());
|
|
t.equal('\0\0\4\0', request.extras.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
client.touch('hello', 1024, function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(true, val);
|
|
t.equal(1, n, 'Ensure touch is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('TouchKeyDNE', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('', request.val.toString());
|
|
t.equal('\0\0\4\0', request.extras.toString());
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 1, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer]);
|
|
client.touch('hello', 1024, function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(false, val);
|
|
t.equal(1, n, 'Ensure ptouch is called');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('Failover', function(t) {
|
|
var n1 = 0;
|
|
var n2 = 0;
|
|
var dummyServer1 = new MemJS.Server();
|
|
dummyServer1.write = function(/* requestBuf*/) {
|
|
n1 += 1;
|
|
dummyServer1.error(new Error('connection failure'));
|
|
};
|
|
var dummyServer2 = new MemJS.Server();
|
|
dummyServer2.write = function(requestBuf) {
|
|
n2 += 1;
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
dummyServer2.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer1, dummyServer2], {failover: true});
|
|
client.get('\0', function(err/*, val */){
|
|
t.equal(null, err);
|
|
t.equal(2, n1);
|
|
t.equal(1, n2);
|
|
t.end();
|
|
});
|
|
|
|
});
|
|
|
|
test('Very Large Client Seq', function(t) {
|
|
var n = 0;
|
|
var dummyServer = new MemJS.Server();
|
|
dummyServer.write = function(requestBuf) {
|
|
var request = MemJS.Utils.parseMessage(requestBuf);
|
|
t.equal('hello', request.key.toString());
|
|
t.equal('world', request.val.toString());
|
|
t.equal('0000000000000400', request.extras.toString('hex'));
|
|
n += 1;
|
|
dummyServer.respond({header: {status: 0, opaque: request.header.opaque}});
|
|
};
|
|
|
|
var client = new MemJS.Client([dummyServer], {expires: 1024});
|
|
client.seq = Math.pow(2,33);
|
|
var assertor = function(err, val) {
|
|
t.equal(null, err);
|
|
t.equal(true, val);
|
|
t.equal(1, n, 'Ensure add is called');
|
|
};
|
|
client.add('hello', 'world', {}, assertor);
|
|
n = 0;
|
|
return client.add('hello', 'world', {}).then(function(success) {
|
|
assertor(null, success);
|
|
});
|
|
});
|
|
return;
|