« index

Coverage for /Users/yunong/workspace/node-restify/test/throttle.test.js : 100%

175 lines | 175 run | 0 missing | 0 partial | 29 blocks | 29 blocks run | 0 blocks missing

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

  // Copyright 2012 Mark Cavage, Inc.  All rights reserved.
  
  var http = require('http');
  
  var uuid = require('node-uuid');
  
  var restify = require('../lib');
  
  if (require.cache[__dirname + '/lib/helper.js'])
      delete require.cache[__dirname + '/lib/helper.js'];
  var helper = require('./lib/helper.js');
  
  
  ///--- Globals
  
  var after = helper.after;
  var before = helper.before;
  var test = helper.test;
  
  var PORT = process.env.UNIT_TEST_PORT || 0;
  var CLIENT;
  var SERVER;
  var USERNAME = uuid();
  var PASSWORD = uuid();
  
  var errorMessage = 'Error message should include rate 0.5 r/s. Received: ';
  ///--- Tests
  
  
  //--- Tests
  
  test('setup', function (t) {
      SERVER = restify.createServer({
          dtrace: helper.dtrace,
          log: helper.getLog('server')
      });
  
      SERVER.use(function ghettoAuthenticate(req, res, next) {
          if (req.params.name)
              req.username = req.params.name;
  
          next();
      });
  
      SERVER.use(restify.throttle({
          burst: 1,
          rate: 0.5,
          username: true,
          overrides: {
              'admin': {
                  burst: 0,
                  rate: 0
              },
              'special': {
                  burst: 3,
                  rate: 1
              }
          }
      }));
  
      SERVER.get('/test/:name', function (req, res, next) {
          res.send();
          next();
      });
  
      SERVER.listen(PORT, '127.0.0.1', function () {
          PORT = SERVER.address().port;
          CLIENT = restify.createJsonClient({
              url: 'http://127.0.0.1:' + PORT,
              dtrace: helper.dtrace,
              retry: false,
              agent: false
          });
  
          t.end();
      });
  });
  
  
  test('ok', function (t) {
      CLIENT.get('/test/throttleMe', function (err, _, res) {
          t.ifError(err);
          t.equal(res.statusCode, 200);
          t.end();
      });
  });
  
  
  test('throttled', function (t) {
      CLIENT.get('/test/throttleMe', function (err, _, res) {
          t.ok(err);
          t.equal(err.statusCode, 429);
          t.ok(err && err.message && err.message.indexOf('0.5 r/s') !== -1,
              errorMessage + (err && err.message));
          t.equal(res.statusCode, 429);
          setTimeout(function () {
              t.end();
          }, 2100);
      });
  });
  
  
  test('ok after tokens', function (t) {
      CLIENT.get('/test/throttleMe', function (err, _, res) {
          t.ifError(err);
          t.equal(res.statusCode, 200);
          t.end();
      });
  });
  
  
  test('override limited', function (t) {
      CLIENT.get('/test/special', function (err, _, res) {
          t.ifError(err);
          t.equal(res.statusCode, 200);
          t.end();
      });
  });
  
  
  test('override limited (not throttled)', function (t) {
      CLIENT.get('/test/special', function (err, _, res) {
          t.ifError(err);
          t.equal(res.statusCode, 200);
          t.end();
      });
  });
  
  test('throttled after limited override', function (t) {
      CLIENT.get('/test/throttleMe', function () {
      CLIENT.get('/test/throttleMe', function (err, _, res) {
          t.ok(err);
          t.equal(res.statusCode, 429);
          t.ok(err && err.message && err.message.indexOf('0.5 r/s') !== -1,
              errorMessage + (err && err.message));
          t.end();
      });
      });
  });
  
  
  test('override unlimited', function (t) {
      CLIENT.get('/test/admin', function (err, _, res) {
          t.ifError(err);
          t.equal(res.statusCode, 200);
          t.end();
      });
  });
  
  
  test('override unlimited (not throttled)', function (t) {
      CLIENT.get('/test/admin', function (err, _, res) {
          t.ifError(err);
          t.equal(res.statusCode, 200);
          t.end();
      });
  });
  
  test('throttled after unlimited override', function (t) {
      CLIENT.get('/test/throttleMe', function () {
      CLIENT.get('/test/throttleMe', function (err, _, res) {
          t.ok(err);
          t.equal(res.statusCode, 429);
          t.ok(err && err.message && err.message.indexOf('0.5 r/s') !== -1,
              errorMessage + (err && err.message));
          t.end();
      });
      });
  });
  
  test('shutdown', function (t) {
      SERVER.close(function () {
          t.end();
      });
  });
« index | cover.io