Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions public/conformance/auth.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions public/conformance/firestore-rules.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions public/conformance/firestore.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions public/conformance/functions.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions public/conformance/pubsub.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions public/conformance/storage-rules.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions public/conformance/storage.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions public/conformance/suite.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"runs":[[0,1,0,"Functions emulator shutdown after one HTTP invocation"],[1,1,0,"Functions emulator shutdown after one HTTP invocation"],[2,3,1,"Rules coverage and requests over HTTP"],[5,11,1,"Requests websocket: history and live evaluations"],[16,1,1,"Emulator UI pages driving each emulator"],[17,8,1,"Rules coverage and requests over HTTP"],[25,1,1,"Requests websocket: history and live evaluations"],[26,21,1,"Emulator UI pages driving each emulator"],[47,5,2,"Hub locator, emulator map, export and the origin guard"],[52,5,2,"Suite startup, shutdown and restart on the same ports"],[57,5,2,"UI config, index page and the logging websocket"]],"cases":[{"t":"one HTTP invocation","q":"GET /{project}/us-central1/ping","a":"200 {synthetic}","r":"c","k":"answer"},{"t":"SIGINT","q":"SIGINT to firebase emulators:start","a":"stopped in 34 ms, exit code 0","r":"u"},{"t":"write visible","q":"PATCH /v1/projects/{project}/databases/(default)/documents/notes/visible","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"status"},{"t":"write denied","q":"PATCH /v1/projects/{project}/databases/(default)/documents/notes/denied","a":"403 PERMISSION_DENIED: false for 'create' @ L6, false for 'update' @ L6","r":"c","k":"status"},{"t":"write hidden","q":"PATCH /v1/projects/{project}/databases/(default)/documents/notes/hidden (owner)","a":"200 {name, fields, createTime, updateTime}","r":"c","k":"status"},{"t":"initial history","q":"connect to the requests websocket","a":"empty history","r":"c","k":"answer"},{"t":"evaluation request 1","q":"rules evaluation event 1","a":"allow create /databases/(default)/documents/notes/visible","r":"c","k":"verdict"},{"t":"evaluation request 2","q":"rules evaluation event 2","a":"allow update /databases/(default)/documents/notes/visible","r":"c","k":"verdict"},{"t":"evaluation request 3","q":"rules evaluation event 3","a":"deny create /databases/(default)/documents/notes/denied","r":"c","k":"verdict"},{"t":"evaluation request 4","q":"rules evaluation event 4","a":"deny update /databases/(default)/documents/notes/denied","r":"c","k":"verdict"},{"t":"evaluation request 5","q":"rules evaluation event 5","a":"error get /databases/(default)/documents/notes/visible","r":"c","k":"verdict"},{"t":"evaluation request 6","q":"rules evaluation event 6","a":"allow get /databases/(default)/documents/notes/visible","r":"c","k":"verdict"},{"t":"evaluation request 7","q":"rules evaluation event 7","a":"error get /databases/(default)/documents/notes/hidden","r":"c","k":"verdict"},{"t":"evaluation request 8","q":"rules evaluation event 8","a":"deny get /databases/(default)/documents/notes/hidden","r":"c","k":"verdict"},{"t":"evaluation request 9","q":"rules evaluation event 9","a":"error get /databases/(default)/documents/notes/missing","r":"c","k":"verdict"},{"t":"evaluation request 10","q":"rules evaluation event 10","a":"error get /databases/(default)/documents/notes/missing","r":"c","k":"verdict"},{"t":"auth GET","q":"GET /identitytoolkit.googleapis.com/v2/projects/{project}/tenants","a":"200 {tenants}","r":"c","k":"answer"},{"t":"coverage before","q":"GET /emulator/v1/projects/{project}:ruleCoverage","a":"200 {rules, report}","r":"u"},{"t":"read visible","q":"GET /v1/projects/{project}/databases/(default)/documents/notes/visible","a":"200 {name, fields, createTime, updateTime}","r":"u"},{"t":"read hidden","q":"GET /v1/projects/{project}/databases/(default)/documents/notes/hidden","a":"403 PERMISSION_DENIED: evaluation error at L5:19 for 'get' @ L5, false for 'get' @ L5","r":"u"},{"t":"read missing","q":"GET /v1/projects/{project}/databases/(default)/documents/notes/missing","a":"403 PERMISSION_DENIED: evaluation error at L5:19 for 'get' @ L5, Null value error. for 'get' @ L5","r":"u"},{"t":"read hidden admin","q":"GET /v1/projects/{project}/databases/(default)/documents/notes/hidden (owner)","a":"200 {name, fields, createTime, updateTime}","r":"u"},{"t":"list documents admin","q":"GET /v1/projects/{project}/databases/(default)/documents/notes?pageSize=1000 (owner)","a":"200 {documents}","r":"u"},{"t":"coverage after","q":"GET /emulator/v1/projects/{project}:ruleCoverage","a":"200 {rules, report}","r":"u"},{"t":"coverage html","q":"GET /emulator/v1/projects/{project}:ruleCoverage.html","a":"200 {byteLength, sha256, title, embeddedCoverage}","r":"u"},{"t":"after reconnecting","q":"reconnect to the requests websocket","a":"history replay of 10 evaluations","r":"u"},{"t":"firestore GET","q":"GET /emulator/v1/projects/{project}:ruleCoverage.html","a":"200","r":"u"},{"t":"firestore DELETE","q":"DELETE /emulator/v1/projects/{project}/databases/(default)/documents","a":"200 {}","r":"u"},{"t":"auth POST","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"200 {recordsCount, userInfo}","r":"u"},{"t":"auth GET","q":"GET /emulator/v1/projects/{project}/config","a":"200 {signIn, emailPrivacyConfig}","r":"u"},{"t":"auth POST","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"u"},{"t":"auth POST","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:lookup","a":"200 identitytoolkit#GetAccountInfoResponse","r":"u"},{"t":"auth POST","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts:query","a":"200 {recordsCount, userInfo}","r":"u"},{"t":"auth DELETE","q":"DELETE /emulator/v1/projects/{project}/accounts","a":"200 {}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o (query: delimiter, prefix)","a":"200 {prefixes, items}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o (query: delimiter, prefix)","a":"200 {prefixes, items}","r":"u"},{"t":"storage POST","q":"POST /v0/b/{project}/o (query: name)","a":"200 {name, bucket, generation, metageneration, …}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o (query: delimiter, prefix)","a":"200 {prefixes, items}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o/synthetic.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o (query: delimiter, prefix)","a":"200 {prefixes, items}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o/synthetic.txt","a":"200 {name, bucket, generation, metageneration, …}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o (query: delimiter, prefix)","a":"200 {prefixes, items}","r":"u"},{"t":"storage DELETE","q":"DELETE /v0/b/{project}/o/%252f","a":"404 (empty body)","r":"u"},{"t":"storage DELETE","q":"DELETE /v0/b/{project}/o/synthetic.txt","a":"204","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o (query: delimiter, prefix)","a":"200 {prefixes, items}","r":"u"},{"t":"storage GET","q":"GET /v0/b/{project}/o (query: delimiter, prefix)","a":"200 {prefixes, items}","r":"u"},{"t":"UI config","q":"GET /api/config","a":"200 · project {project}, 6 services listed","r":"u"},{"t":"hub locator","q":"GET /","a":"200 {version, origins, pid, host, …}","r":"u"},{"t":"hub emulator map","q":"GET /emulators","a":"200 {hub, ui, logging, auth, …}","r":"u"},{"t":"create export user","q":"POST /identitytoolkit.googleapis.com/v1/projects/{project}/accounts","a":"200 identitytoolkit#SignupNewUserResponse","r":"u"},{"t":"hub auth export","q":"POST /_admin/export","a":"200 {message}","r":"u"},{"t":"hub export origin blocked","q":"POST /_admin/export","a":"403 {message}","r":"u"},{"t":"first start","q":"firebase emulators:start (auth, functions, pubsub)","a":"ready after 18 s · hub 200, functions 200, auth 200, pubsub 200, ui 200","r":"u"},{"t":"first stop","q":"stop the suite (origin-guarded run)","a":"not clean, exit 2 · locator deleted, ports closed","r":"u"},{"t":"restart","q":"start the suite again on the same ports","a":"ready after 18 s · hub 200, functions 200, auth 200, pubsub 200, ui 200","r":"u"},{"t":"restart hub readiness","q":"GET / on the hub","a":"200 {version, origins, pid, host, …}","r":"u"},{"t":"second stop","q":"stop the suite (control run)","a":"clean, exit 0 · locator deleted, ports closed","r":"u"},{"t":"ui api config","q":"GET /api/config","a":"200 {projectId, experiments, hub, ui, …}","r":"u"},{"t":"ui index html","q":"GET /","a":"200 {byteLength, sha256, containsRootElement}","r":"u"},{"t":"logging websocket message 1","q":"connect to the logging websocket","a":"info: Watching \"<suite-root>/functions\" for Cloud Functions...","r":"u"},{"t":"logging websocket message 2","q":"connect to the logging websocket","a":"warn: ⚠ functions: package.json indicates an outdated version of firebase-functions. Please upgrade using npm install --save firebase-funct…","r":"u"},{"t":"logging websocket message 3","q":"connect to the logging websocket","a":"info: ✔ functions: Using node@24 from host.","r":"u"}]}
1 change: 1 addition & 0 deletions public/conformance/tasks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"runs":[[0,17,0,"Every onTaskDispatched export is discovered with its taskQueueTrigger and registered as a queue; a caller can register queues directly with the official defaults, an invalid queue id and an over-limit concurrency are rejected."],[17,11,0,"Enqueue over the wire: a named task and an auto-named task reach the default-config handler with the X-CloudTasks headers; duplicate names, unknown queues and caller headers overriding the emulator's are recorded."],[28,5,0,"Retry semantics: a 500 keeps the execution count, a 400 increments it, exhausting maxAttempts runs maxAttempts+1 times, and the previous response reaches the handler."],[33,6,0,"A dispatch deadline aborts the emulator's request while the handler completes (a retry follows); maxConcurrentDispatches 1 serialises a queue; maxDispatchesPerSecond 1 paces one."],[39,9,0,"Deleting a pending task, an unknown task, a task on an unknown queue, and a task already dispatched; the Admin SDK's delete swallows 404."],[48,11,0,"The Admin SDK path handlers use: getFunctions().taskQueue().enqueue() with data, id, scheduleDelaySeconds, dispatchDeadlineSeconds, headers and uri, a duplicate id, an unknown queue, an explicit region; delete() of a pending, an unknown and an auto-named task."],[59,1,0,"The Admin SDK path handlers use: getFunctions().taskQueue().enqueue() with data, id, scheduleDelaySeconds, dispatchDeadlineSeconds, headers and uri, a duplicate id, an unknown queue, an explicit region; delete() of a pending, an unknown and an auto-named task."]],"cases":[{"t":"backends","q":"GET /backends","a":"200 {backends}","r":"c","k":"answer"},{"t":"startup logs","q":"emulator log lines matching \"queue\"","a":"0 log lines matched","r":"c","k":"behaviour"},{"t":"stats initial","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"register defaults","q":"POST /projects/{project}/locations/us-central1/queues/manual-defaults","a":"200 {taskQueueConfig}","r":"c","k":"answer"},{"t":"register explicit","q":"POST /projects/{project}/locations/us-central1/queues/manual-explicit","a":"200 {taskQueueConfig}","r":"c","k":"answer"},{"t":"register null fields","q":"POST /projects/{project}/locations/us-central1/queues/manual-nulls","a":"200 {taskQueueConfig}","r":"c","k":"answer"},{"t":"register empty body","q":"POST /projects/{project}/locations/us-central1/queues/manual-empty","a":"200 {taskQueueConfig}","r":"c","k":"answer"},{"t":"register over limit","q":"POST /projects/{project}/locations/us-central1/queues/manual-over","a":"400 cannot set maxConcurrentDispatches to a value over 5000","r":"c","k":"answer"},{"t":"register invalid id underscore","q":"POST /projects/{project}/locations/us-central1/queues/bad_name","a":"400 Queue ID must start with a letter followed by up to 62 letters, numbers, hyphens, or underscores and must end with a letter or a number","r":"c","k":"answer"},{"t":"register invalid id long","q":"POST /projects/{project}/locations/us-central1/queues/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa…","a":"400 Queue ID must start with a letter followed by up to 62 letters, numbers, hyphens, or underscores and must end with a letter or a number","r":"c","k":"answer"},{"t":"register invalid id dot","q":"POST /projects/{project}/locations/us-central1/queues/bad.name","a":"400 Queue ID must start with a letter followed by up to 62 letters, numbers, hyphens, or underscores and must end with a letter or a number","r":"c","k":"answer"},{"t":"register foreign project","q":"POST /projects/{project}/locations/us-central1/queues/foreign","a":"200 {taskQueueConfig}","r":"c","k":"answer"},{"t":"register replaces","q":"POST /projects/{project}/locations/us-central1/queues/manual-explicit","a":"200 {taskQueueConfig}","r":"c","k":"answer"},{"t":"stats after register","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"unknown route get","q":"GET /v2/projects/{project}/locations/us-central1/queues","a":"404 Cannot GET /v2/projects/{project}/locations/us-central1/queues","r":"c","k":"answer"},{"t":"unknown route post","q":"POST /unknown","a":"404 Cannot POST /unknown","r":"c","k":"answer"},{"t":"queue get not a route","q":"GET /projects/{project}/locations/us-central1/queues/manual-defaults","a":"404 Cannot GET /projects/{project}/locations/us-central1/queues/manual-defaults","r":"c","k":"answer"},{"t":"enqueue named","q":"POST /projects/{project}/locations/us-central1/queues/taskDefault/tasks","a":"200 {task} · handler saw 1 event","r":"c","k":"answer"},{"t":"enqueue auto named","q":"POST /projects/{project}/locations/us-central1/queues/taskDefault/tasks","a":"200 {task} · handler saw 1 event","r":"c","k":"answer"},{"t":"enqueue duplicate name","q":"POST /projects/{project}/locations/us-central1/queues/taskDefault/tasks","a":"409 A task with the same name already exists","r":"c","k":"answer"},{"t":"enqueue unknown queue","q":"POST /projects/{project}/locations/us-central1/queues/noSuchQueue/tasks","a":"404 Tried to queue a task from a non-existent queue","r":"c","k":"answer"},{"t":"enqueue with schedule time","q":"POST /projects/{project}/locations/us-central1/queues/taskDefault/tasks","a":"200 {task} · handler saw 1 event","r":"c","k":"answer"},{"t":"enqueue caller headers","q":"POST /projects/{project}/locations/us-central1/queues/taskDefault/tasks","a":"200 {task} · handler saw 1 event","r":"c","k":"answer"},{"t":"enqueue explicit url","q":"POST /projects/{project}/locations/us-central1/queues/taskDefault/tasks","a":"200 {task} · handler saw 1 event","r":"c","k":"answer"},{"t":"enqueue alt region","q":"POST /projects/{project}/locations/europe-west1/queues/taskAlt/tasks","a":"200 {task} · handler saw 1 event","r":"c","k":"answer"},{"t":"enqueue wrong region","q":"POST /projects/{project}/locations/us-central1/queues/taskAlt/tasks","a":"404 Tried to queue a task from a non-existent queue","r":"c","k":"answer"},{"t":"enqueue manual queue unreachable","q":"POST /projects/{project}/locations/us-central1/queues/manual-defaults/tasks","a":"200 {task}","r":"c","k":"answer"},{"t":"stats after dispatch","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"retry once 500","q":"POST /projects/{project}/locations/us-central1/queues/taskRetry/tasks","a":"200 {task} · handler saw 2 events","r":"c","k":"answer"},{"t":"retry once 400","q":"POST /projects/{project}/locations/us-central1/queues/taskRetry/tasks","a":"200 {task} · handler saw 2 events","r":"c","k":"answer"},{"t":"retry exhausted","q":"POST /projects/{project}/locations/us-central1/queues/taskRetry/tasks","a":"200 {task} · handler saw 4 events","r":"c","k":"answer"},{"t":"retry then succeed twice","q":"POST /projects/{project}/locations/us-central1/queues/taskRetry/tasks","a":"200 {task} · handler saw 3 events","r":"c","k":"answer"},{"t":"stats after retries","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"slow deadline","q":"POST /projects/{project}/locations/us-central1/queues/taskSlow/tasks","a":"200 {task} · handler saw 2 events","r":"c","k":"answer"},{"t":"serial a","q":"POST /projects/{project}/locations/us-central1/queues/taskSerial/tasks","a":"200 {task}","r":"c","k":"answer"},{"t":"serial b","q":"POST /projects/{project}/locations/us-central1/queues/taskSerial/tasks","a":"200 {task}","r":"c","k":"answer"},{"t":"serial c","q":"POST /projects/{project}/locations/us-central1/queues/taskSerial/tasks","a":"200 {task} · handler saw 3 events","r":"c","k":"answer"},{"t":"rate abc","q":"3 parallel tasks POST /projects/{project}/locations/us-central1/queues/taskRate/tasks","a":"statuses 200, 200, 200 · handler saw 3 events","r":"c","k":"answer"},{"t":"stats after limits","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"enqueue pending a","q":"POST /projects/{project}/locations/us-central1/queues/manual-defaults/tasks","a":"200 {task}","r":"c","k":"answer"},{"t":"enqueue pending b","q":"POST /projects/{project}/locations/us-central1/queues/manual-defaults/tasks","a":"200 {task}","r":"c","k":"answer"},{"t":"stats pending","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"delete unknown queue","q":"DELETE /projects/{project}/locations/us-central1/queues/noSuchQueue/tasks/pending-a","a":"404 Tried to remove a task from a non-existent queue","r":"c","k":"answer"},{"t":"delete unknown task","q":"DELETE /projects/{project}/locations/us-central1/queues/manual-defaults/tasks/no-such-task","a":"404 Tried to remove a task that doesn't exist","r":"c","k":"answer"},{"t":"delete dispatched","q":"DELETE /projects/{project}/locations/us-central1/queues/taskDefault/tasks/job-named-1","a":"200 {res}","r":"c","k":"answer"},{"t":"delete again","q":"DELETE /projects/{project}/locations/us-central1/queues/taskDefault/tasks/job-named-1","a":"404 Tried to remove a task that doesn't exist","r":"c","k":"answer"},{"t":"reuse deleted name","q":"POST /projects/{project}/locations/us-central1/queues/taskDefault/tasks","a":"409 A task with the same name already exists","r":"c","k":"answer"},{"t":"stats after delete","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"admin enqueue plain","q":"POST /{project}/us-central1/enqueueViaAdmin","a":"200 {ok} · handler saw 2 events","r":"c","k":"answer"},{"t":"admin enqueue options","q":"POST /{project}/us-central1/enqueueViaAdmin","a":"200 {ok} · handler saw 2 events","r":"c","k":"answer"},{"t":"admin enqueue duplicate","q":"POST /{project}/us-central1/enqueueViaAdmin","a":"500 {ok, code, message} · handler saw 1 event","r":"c","k":"answer"},{"t":"admin enqueue uri","q":"POST /{project}/us-central1/enqueueViaAdmin","a":"200 {ok} · handler saw 2 events","r":"c","k":"answer"},{"t":"admin enqueue unknown queue","q":"POST /{project}/us-central1/enqueueViaAdmin","a":"500 {ok, code, message} · handler saw 1 event","r":"c","k":"answer"},{"t":"admin enqueue alt region","q":"POST /{project}/us-central1/enqueueViaAdmin","a":"200 {ok} · handler saw 2 events","r":"c","k":"answer"},{"t":"admin enqueue pending","q":"POST /{project}/us-central1/enqueueViaAdmin","a":"200 {ok} · handler saw 1 event","r":"c","k":"answer"},{"t":"admin delete pending","q":"POST /{project}/us-central1/deleteViaAdmin","a":"200 {ok} · handler saw 1 event","r":"c","k":"answer"},{"t":"admin delete unknown","q":"POST /{project}/us-central1/deleteViaAdmin","a":"200 {ok} · handler saw 1 event","r":"c","k":"answer"},{"t":"admin delete unknown queue","q":"POST /{project}/us-central1/deleteViaAdmin","a":"200 {ok} · handler saw 1 event","r":"c","k":"answer"},{"t":"stats final","q":"GET /queueStats","a":"200 {queue:{project}, queue:{project}, queue:{project}, queue:{project}, …}","r":"c","k":"answer"},{"t":"tasks logs","q":"emulator log lines matching \"task\"","a":"15 log lines matched","r":"u"}]}
Loading
Loading