1 |
|
2 |
|
3 |
|
4 |
|
5 | 'use strict';
|
6 |
|
7 | var helper = require('../../test-helper');
|
8 | var config = helper.config();
|
9 |
|
10 | var request = require('supertest');
|
11 | var chai = require('chai');
|
12 | var should = chai.should();
|
13 |
|
14 | chai.config.includeStack = true;
|
15 | chai.config.showDiff = true;
|
16 |
|
17 | var expectedRecordKeys = [
|
18 | 'apiproxy',
|
19 | 'apiproxy_revision',
|
20 | 'client_ip',
|
21 | 'client_received_start_timestamp',
|
22 | 'client_sent_end_timestamp',
|
23 | 'recordType',
|
24 | 'request_path',
|
25 | 'request_uri',
|
26 | 'request_verb',
|
27 | 'response_status_code',
|
28 | 'useragent'
|
29 | ];
|
30 |
|
31 | describe('analytics', function() {
|
32 |
|
33 | var servers, proxy;
|
34 |
|
35 | beforeEach(function() {
|
36 | config.analytics = {
|
37 | uri: 'x',
|
38 | key: 'x',
|
39 | proxy: 'x',
|
40 | bufferSize: 5,
|
41 | batchSize: 5,
|
42 | flushInterval: 10000
|
43 | };
|
44 | });
|
45 |
|
46 | afterEach(function() {
|
47 | servers.close();
|
48 | });
|
49 |
|
50 | it('should log forwarded requests', function(done) {
|
51 |
|
52 | config.edgemicro.plugins.sequence = ['analytics'];
|
53 | helper.startServers(config, function(err, s) {
|
54 | if (err) { return done(err); }
|
55 | servers = s;
|
56 | proxy = servers.proxy;
|
57 |
|
58 | var buffer = helper.analytics.buffer;
|
59 | var startLen = helper.analytics.buffer.length;
|
60 |
|
61 | request(proxy)
|
62 | .get('/')
|
63 | .expect(200)
|
64 | .end(function(err, res) {
|
65 | if (err) { return done(err); }
|
66 | should.exist(res.body.fromTarget);
|
67 | buffer.length.should.equal(startLen + 1);
|
68 | var record = buffer[buffer.length - 1];
|
69 | record.should.have.keys(expectedRecordKeys);
|
70 | record.response_status_code.should.equal(200);
|
71 |
|
72 | record.apiproxy.should.eql('microgateway_test');
|
73 | record.apiproxy_revision.should.eql('1');
|
74 |
|
75 | done();
|
76 | });
|
77 | });
|
78 | });
|
79 |
|
80 | it('should log quota failures', function(done) {
|
81 |
|
82 | var pem = require('pem');
|
83 | var jwt = require('jsonwebtoken');
|
84 | var privateKey, publicKey;
|
85 |
|
86 | config['quota-memory'] = {
|
87 | Test: {
|
88 | allow: 1,
|
89 | timeUnit: 'minute'
|
90 | }
|
91 | };
|
92 |
|
93 | config.edgemicro.plugins.sequence = ['analytics', 'oauth', 'quota-memory'];
|
94 | helper.startServers(config, function(err, s) {
|
95 | if (err) { return done(err); }
|
96 | servers = s;
|
97 | proxy = servers.proxy;
|
98 |
|
99 | var buffer = helper.analytics.buffer;
|
100 | var startLen = helper.analytics.buffer.length;
|
101 |
|
102 | var options = {
|
103 | selfSigned: true,
|
104 | days: 1
|
105 | };
|
106 | pem.createCertificate(options, function(err, keys) {
|
107 | if (err) { return done(err); }
|
108 |
|
109 | privateKey = keys.serviceKey;
|
110 | publicKey = keys.certificate;
|
111 |
|
112 | config.oauth.public_key = publicKey;
|
113 |
|
114 | var options = { algorithm: 'RS256' };
|
115 | var payload = { test: 'test', api_product_list: [ 'Test' ] };
|
116 | var token = jwt.sign(payload, privateKey, options);
|
117 |
|
118 | request(proxy)
|
119 | .get('/')
|
120 | .set('Authorization', 'Bearer ' + token)
|
121 | .expect(200)
|
122 | .end(function(err, res) {
|
123 | if (err) { return done(err); }
|
124 | should.exist(res.body.fromTarget);
|
125 |
|
126 | request(proxy)
|
127 | .get('/')
|
128 | .set('Authorization', 'Bearer ' + token)
|
129 | .expect(403)
|
130 | .end(function(err, res) {
|
131 | if (err) { return done(err); }
|
132 | should.not.exist(res.body.fromTarget);
|
133 | buffer.length.should.equal(startLen + 2);
|
134 | var record = buffer[buffer.length - 1];
|
135 | record.should.have.keys(expectedRecordKeys);
|
136 | record.response_status_code.should.equal(403);
|
137 |
|
138 | done();
|
139 | });
|
140 | });
|
141 | });
|
142 | });
|
143 | });
|
144 |
|
145 | it('should log spikearrest failures', function(done) {
|
146 |
|
147 | config.spikearrest = {
|
148 | timeUnit: 'minute',
|
149 | bufferSize: 0,
|
150 | allow: 1
|
151 | };
|
152 |
|
153 | config.edgemicro.plugins.sequence = ['analytics', 'spikearrest'];
|
154 | helper.startServers(config, function(err, s) {
|
155 | if (err) { return done(err); }
|
156 | servers = s;
|
157 | proxy = servers.proxy;
|
158 |
|
159 | var buffer = helper.analytics.buffer;
|
160 | var startLen = helper.analytics.buffer.length;
|
161 |
|
162 | request(proxy)
|
163 | .get('/')
|
164 | .expect(200)
|
165 | .end(function(err, res) {
|
166 | if (err) { return done(err); }
|
167 | should.exist(res.body.fromTarget);
|
168 |
|
169 | request(proxy)
|
170 | .get('/')
|
171 | .expect(503)
|
172 | .end(function(err, res) {
|
173 | if (err) { return done(err); }
|
174 | should.not.exist(res.body.fromTarget);
|
175 | buffer.length.should.equal(startLen + 2);
|
176 | var record = buffer[buffer.length - 1];
|
177 | record.should.have.keys(expectedRecordKeys);
|
178 | record.response_status_code.should.equal(503);
|
179 |
|
180 | done();
|
181 | });
|
182 | });
|
183 | });
|
184 | });
|
185 |
|
186 | it('should log oauth failures', function(done) {
|
187 |
|
188 | config.oauth = {
|
189 | allowNoAuthorization: false,
|
190 | allowInvalidAuthorization: false,
|
191 | publicKey: 'x'
|
192 | };
|
193 |
|
194 | config.edgemicro.plugins.sequence = ['analytics', 'oauth'];
|
195 | helper.startServers(config, function(err, s) {
|
196 | if (err) { return done(err); }
|
197 | servers = s;
|
198 | proxy = servers.proxy;
|
199 |
|
200 | var buffer = helper.analytics.buffer;
|
201 | var startLen = helper.analytics.buffer.length;
|
202 |
|
203 | request(proxy)
|
204 | .get('/')
|
205 | .expect(401)
|
206 | .end(function(err, res) {
|
207 | if (err) { return done(err); }
|
208 | should.not.exist(res.body.fromTarget);
|
209 | buffer.length.should.equal(startLen + 1);
|
210 | var record = buffer[buffer.length - 1];
|
211 | record.should.have.keys(expectedRecordKeys);
|
212 | record.response_status_code.should.equal(401);
|
213 |
|
214 | done();
|
215 | });
|
216 | });
|
217 | });
|
218 |
|
219 | });
|