Skip to content
File

Blob: src/workerd/api/tests/cache-instrumentation-test.js

javascript262 lines
1// Copyright (c) 2017-2023 Cloudflare, Inc.
2// Licensed under the Apache 2.0 license found in the LICENSE file or at:
3// https://opensource.org/licenses/Apache-2.0
4import * as assert from 'node:assert';
5import {
6 invocationPromises,
7 spans,
8 testTailHandler,
9} from 'test:instrumentation-tail';
10 
11// Use shared instrumentation test tail worker
12export default testTailHandler;
13 
14export const test = {
15 async test() {
16 // Wait for all the tailStream executions to finish
17 await Promise.allSettled(invocationPromises);
18 
19 // Recorded streaming tail worker events, in insertion order,
20 let received = Array.from(spans.values());
21 
22 // spans emitted by cache-operations-test.js in execution order
23 let expected = [
24 {
25 name: 'cache_match',
26 'cache.request.url': 'https://example.com/conditional-etag',
27 'cache.request.method': 'GET',
28 'cache.request.header.if_none_match': 'abc123',
29 'cache.response.status_code': 504n,
30 'cache.response.body.size': 0n,
31 'cache.response.cache_status': 'MISS',
32 'cache.response.success': false,
33 closed: true,
34 },
35 {
36 name: 'cache_match',
37 'cache.request.url': 'https://example.com/conditional-last-modified',
38 'cache.request.method': 'GET',
39 'cache.request.header.if_modified_since':
40 'Wed, 21 Oct 2020 07:28:00 GMT',
41 'cache.response.status_code': 504n,
42 'cache.response.body.size': 0n,
43 'cache.response.cache_status': 'MISS',
44 'cache.response.success': false,
45 closed: true,
46 },
47 {
48 name: 'cache_delete',
49 'cache.request.url': 'https://example.com/delete-exists',
50 'cache.request.method': 'GET',
51 'cache.response.status_code': 200n,
52 'cache.response.success': true,
53 closed: true,
54 },
55 {
56 name: 'cache_delete',
57 'cache.request.url': 'https://example.com/delete-not-exists',
58 'cache.request.method': 'GET',
59 'cache.response.status_code': 404n,
60 'cache.response.success': false,
61 closed: true,
62 },
63 {
64 name: 'cache_delete',
65 'cache.request.ignore_method': true,
66 'cache.request.url': 'https://example.com/delete-with-options',
67 'cache.request.method': 'POST',
68 'cache.response.status_code': 404n,
69 'cache.response.success': false,
70 closed: true,
71 },
72 {
73 name: 'cache_put',
74 'cache.request.url': 'https://example.com/put-cache-tag',
75 'cache.request.method': 'GET',
76 'cache.request.payload.status_code': 200n,
77 'cache.request.payload.header.cache_control': 'public, max-age=3600',
78 'cache.request.payload.header.cache_tag': 'tag1,tag2,tag3',
79 'cache.request.payload.size': 143n,
80 'cache.response.success': true,
81 closed: true,
82 },
83 {
84 name: 'cache_put',
85 'cache.request.url': 'https://example.com/put-etag',
86 'cache.request.method': 'GET',
87 'cache.request.payload.status_code': 200n,
88 'cache.request.payload.header.cache_control': 'public, max-age=3600',
89 'cache.request.payload.header.etag': '"abc123"',
90 'cache.request.payload.size': 130n,
91 'cache.response.success': true,
92 closed: true,
93 },
94 {
95 name: 'cache_put',
96 'cache.request.url': 'https://example.com/put-expires',
97 'cache.request.method': 'GET',
98 'cache.request.payload.status_code': 200n,
99 'cache.request.payload.header.expires': 'Wed, 21 Oct 2025 07:28:00 GMT',
100 'cache.request.payload.size': 120n,
101 'cache.response.success': true,
102 closed: true,
103 },
104 {
105 name: 'cache_put',
106 'cache.request.url': 'https://example.com/put-last-modified',
107 'cache.request.method': 'GET',
108 'cache.request.payload.status_code': 200n,
109 'cache.request.payload.header.cache_control': 'public, max-age=3600',
110 'cache.request.payload.header.last_modified':
111 'Wed, 21 Oct 2020 07:28:00 GMT',
112 'cache.request.payload.size': 169n,
113 'cache.response.success': true,
114 closed: true,
115 },
116 {
117 name: 'cache_put',
118 'cache.request.url': 'https://example.com/put-set-cookie',
119 'cache.request.method': 'GET',
120 'cache.request.payload.status_code': 200n,
121 'cache.request.payload.header.cache_control': 'public, max-age=3600',
122 'cache.request.payload.size': 164n,
123 'cache.response.success': true,
124 closed: true,
125 },
126 {
127 name: 'cache_put',
128 'cache.request.url': 'https://example.com/put-set-cookie-private',
129 'cache.request.method': 'GET',
130 'cache.request.payload.status_code': 200n,
131 'cache.request.payload.header.cache_control':
132 'public, max-age=3600, private=Set-Cookie',
133 'cache.request.payload.size': 197n,
134 'cache.response.success': true,
135 closed: true,
136 },
137 {
138 name: 'cache_put',
139 'cache.request.url': 'https://example.com/put-must-revalidate',
140 'cache.request.method': 'GET',
141 'cache.request.payload.status_code': 200n,
142 'cache.request.payload.header.cache_control':
143 'public, max-age=3600, must-revalidate',
144 'cache.request.payload.size': 142n,
145 'cache.response.success': true,
146 closed: true,
147 },
148 {
149 name: 'cache_put',
150 'cache.request.url': 'https://example.com/put-proxy-revalidate',
151 'cache.request.method': 'GET',
152 'cache.request.payload.status_code': 200n,
153 'cache.request.payload.header.cache_control':
154 'public, max-age=3600, proxy-revalidate',
155 'cache.request.payload.size': 144n,
156 'cache.response.success': true,
157 closed: true,
158 },
159 {
160 name: 'cache_put',
161 'cache.request.url': 'https://example.com/put-private',
162 'cache.request.method': 'GET',
163 'cache.request.payload.status_code': 200n,
164 'cache.request.payload.header.cache_control': 'private, max-age=3600',
165 'cache.request.payload.size': 118n,
166 'cache.response.success': true,
167 closed: true,
168 },
169 {
170 name: 'cache_put',
171 'cache.request.url': 'https://example.com/put-no-cache',
172 'cache.request.method': 'GET',
173 'cache.request.payload.status_code': 200n,
174 'cache.request.payload.header.cache_control': 'no-cache, max-age=3600',
175 'cache.request.payload.size': 120n,
176 'cache.response.success': true,
177 closed: true,
178 },
179 {
180 name: 'cache_match',
181 'cache.request.url': 'https://example.com/cached-resource',
182 'cache.request.method': 'GET',
183 'cache.response.status_code': 200n,
184 'cache.response.body.size': 14n,
185 'cache.response.cache_status': 'HIT',
186 'cache.response.success': true,
187 closed: true,
188 },
189 {
190 name: 'cache_match',
191 'cache.request.url': 'https://example.com/not-cached',
192 'cache.request.method': 'GET',
193 'cache.response.status_code': 504n,
194 'cache.response.body.size': 0n,
195 'cache.response.cache_status': 'MISS',
196 'cache.response.success': false,
197 closed: true,
198 },
199 {
200 name: 'cache_match',
201 'cache.request.ignore_method': false,
202 'cache.request.url': 'https://example.com/cached-with-options',
203 'cache.request.method': 'GET',
204 'cache.response.status_code': 504n,
205 'cache.response.body.size': 0n,
206 'cache.response.cache_status': 'MISS',
207 'cache.response.success': false,
208 closed: true,
209 },
210 {
211 name: 'cache_put',
212 'cache.request.url': 'https://example.com/put-resource',
213 'cache.request.method': 'GET',
214 'cache.request.payload.status_code': 200n,
215 'cache.request.payload.header.cache_control': 'public, max-age=3600',
216 'cache.request.payload.size': 114n,
217 'cache.response.success': true,
218 closed: true,
219 },
220 {
221 name: 'cache_put',
222 'cache.request.url': 'https://example.com/put-no-store',
223 'cache.request.method': 'GET',
224 'cache.request.payload.status_code': 200n,
225 'cache.request.payload.header.cache_control': 'no-store',
226 'cache.request.payload.size': 106n,
227 'cache.response.success': true,
228 closed: true,
229 },
230 {
231 name: 'cache_put',
232 'cache.request.url': 'https://example.com/put-s-maxage',
233 'cache.request.method': 'GET',
234 'cache.request.payload.status_code': 200n,
235 'cache.request.payload.header.cache_control': 's-maxage=7200, public',
236 'cache.request.payload.size': 119n,
237 'cache.response.success': true,
238 closed: true,
239 },
240 ];
241 
242 assert.equal(
243 received.length,
244 expected.length,
245 `Expected ${expected.length} received ${received.length} spans`
246 );
247 let errors = [];
248 for (let i = 0; i < received.length; i++) {
249 try {
250 assert.deepStrictEqual(received[i], expected[i]);
251 } catch (e) {
252 console.error(`value: ${i} does not match`);
253 console.log(e);
254 errors.push(e);
255 }
256 }
257 if (errors.length > 0) {
258 throw 'cache spans are incorrect';
259 }
260 },
261};