mirror of
https://github.com/denoland/deno.git
synced 2025-02-01 12:16:11 -05:00
Compare commits
6 commits
81b4c74c84
...
c8c0f9f6c6
Author | SHA1 | Date | |
---|---|---|---|
|
c8c0f9f6c6 | ||
|
5e9b3712de | ||
|
395628026f | ||
|
4f27d7cdc0 | ||
|
83272f7e8b | ||
|
2a10023fef |
12 changed files with 272 additions and 54 deletions
|
@ -1,5 +1,7 @@
|
||||||
// Copyright 2018-2025 the Deno authors. MIT license.
|
// Copyright 2018-2025 the Deno authors. MIT license.
|
||||||
|
|
||||||
|
// @ts-check
|
||||||
|
|
||||||
import { core, primordials } from "ext:core/mod.js";
|
import { core, primordials } from "ext:core/mod.js";
|
||||||
import { escapeName, withPermissions } from "ext:cli/40_test_common.js";
|
import { escapeName, withPermissions } from "ext:cli/40_test_common.js";
|
||||||
|
|
||||||
|
@ -33,6 +35,14 @@ import { setExitHandler } from "ext:deno_os/30_os.js";
|
||||||
const DenoNs = globalThis.Deno;
|
const DenoNs = globalThis.Deno;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @typedef {() => Promise<"ignored" | "ok" | { failed: any}>} TestFunction
|
||||||
|
*
|
||||||
|
* @typedef {{
|
||||||
|
* fileName: string,
|
||||||
|
* lineNumber: number,
|
||||||
|
* columnNumber: number
|
||||||
|
* }} TestLocation
|
||||||
|
*
|
||||||
* @typedef {{
|
* @typedef {{
|
||||||
* id: number,
|
* id: number,
|
||||||
* name: string,
|
* name: string,
|
||||||
|
@ -40,17 +50,17 @@ const DenoNs = globalThis.Deno;
|
||||||
* origin: string,
|
* origin: string,
|
||||||
* location: TestLocation,
|
* location: TestLocation,
|
||||||
* ignore: boolean,
|
* ignore: boolean,
|
||||||
* only: boolean.
|
* only: boolean,
|
||||||
* sanitizeOps: boolean,
|
* sanitizeOps: boolean,
|
||||||
* sanitizeResources: boolean,
|
* sanitizeResources: boolean,
|
||||||
* sanitizeExit: boolean,
|
* sanitizeExit: boolean,
|
||||||
* permissions: PermissionOptions,
|
* permissions: Deno.PermissionOptions,
|
||||||
* }} TestDescription
|
* }} TestDescription
|
||||||
*
|
*
|
||||||
* @typedef {{
|
* @typedef {{
|
||||||
* id: number,
|
* id: number,
|
||||||
* name: string,
|
* name: string,
|
||||||
* fn: TestFunction
|
* fn: TestFunction,
|
||||||
* origin: string,
|
* origin: string,
|
||||||
* location: TestLocation,
|
* location: TestLocation,
|
||||||
* ignore: boolean,
|
* ignore: boolean,
|
||||||
|
@ -79,12 +89,12 @@ const DenoNs = globalThis.Deno;
|
||||||
* @typedef {{
|
* @typedef {{
|
||||||
* id: number,
|
* id: number,
|
||||||
* name: string,
|
* name: string,
|
||||||
* fn: BenchFunction
|
* fn: BenchFunction,
|
||||||
* origin: string,
|
* origin: string,
|
||||||
* ignore: boolean,
|
* ignore: boolean,
|
||||||
* only: boolean.
|
* only: boolean,
|
||||||
* sanitizeExit: boolean,
|
* sanitizeExit: boolean,
|
||||||
* permissions: PermissionOptions,
|
* permissions: Deno.PermissionOptions,
|
||||||
* }} BenchDescription
|
* }} BenchDescription
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -125,6 +135,11 @@ function assertExit(fn, isTest) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {*} fn
|
||||||
|
* @param {TestDescription | TestStepDescription} desc
|
||||||
|
* @returns {() => Promise<"ignored" | "ok" | { failed: any}>}
|
||||||
|
*/
|
||||||
function wrapOuter(fn, desc) {
|
function wrapOuter(fn, desc) {
|
||||||
return async function outerWrapped() {
|
return async function outerWrapped() {
|
||||||
try {
|
try {
|
||||||
|
@ -145,9 +160,10 @@ function wrapOuter(fn, desc) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function wrapInner(fn) {
|
function wrapInner(fn) {
|
||||||
/** @param desc {TestDescription | TestStepDescription} */
|
/** @param {TestDescription | TestStepDescription} desc */
|
||||||
return async function innerWrapped(desc) {
|
return async function innerWrapped(desc) {
|
||||||
function getRunningStepDescs() {
|
function getRunningStepDescs() {
|
||||||
|
/** @type {TestStepDescription[]} */
|
||||||
const results = [];
|
const results = [];
|
||||||
let childDesc = desc;
|
let childDesc = desc;
|
||||||
while (childDesc.parent != null) {
|
while (childDesc.parent != null) {
|
||||||
|
@ -206,7 +222,11 @@ function wrapInner(fn) {
|
||||||
const registerTestIdRetBuf = new Uint32Array(1);
|
const registerTestIdRetBuf = new Uint32Array(1);
|
||||||
const registerTestIdRetBufU8 = new Uint8Array(registerTestIdRetBuf.buffer);
|
const registerTestIdRetBufU8 = new Uint8Array(registerTestIdRetBuf.buffer);
|
||||||
|
|
||||||
// As long as we're using one isolate per test, we can cache the origin since it won't change
|
/**
|
||||||
|
* As long as we're using one isolate per test, we can cache the origin
|
||||||
|
* since it won't change.
|
||||||
|
* @type {string | undefined}
|
||||||
|
*/
|
||||||
let cachedOrigin = undefined;
|
let cachedOrigin = undefined;
|
||||||
|
|
||||||
function testInner(
|
function testInner(
|
||||||
|
@ -355,6 +375,10 @@ test.only = function (
|
||||||
return testInner(nameOrFnOrOptions, optionsOrFn, maybeFn, { only: true });
|
return testInner(nameOrFnOrOptions, optionsOrFn, maybeFn, { only: true });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {TestDescription | TestStepDescription} desc
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
function getFullName(desc) {
|
function getFullName(desc) {
|
||||||
if ("parent" in desc) {
|
if ("parent" in desc) {
|
||||||
return `${getFullName(desc.parent)} ... ${desc.name}`;
|
return `${getFullName(desc.parent)} ... ${desc.name}`;
|
||||||
|
@ -362,10 +386,19 @@ function getFullName(desc) {
|
||||||
return desc.name;
|
return desc.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {TestDescription | TestStepDescription} desc
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
function usesSanitizer(desc) {
|
function usesSanitizer(desc) {
|
||||||
return desc.sanitizeResources || desc.sanitizeOps || desc.sanitizeExit;
|
return desc.sanitizeResources || desc.sanitizeOps || desc.sanitizeExit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {TestStepDescription} desc
|
||||||
|
* @param {*} result
|
||||||
|
* @param {number} elapsed
|
||||||
|
*/
|
||||||
function stepReportResult(desc, result, elapsed) {
|
function stepReportResult(desc, result, elapsed) {
|
||||||
const state = MapPrototypeGet(testStates, desc.id);
|
const state = MapPrototypeGet(testStates, desc.id);
|
||||||
for (const childDesc of state.children) {
|
for (const childDesc of state.children) {
|
||||||
|
@ -380,7 +413,9 @@ function stepReportResult(desc, result, elapsed) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param desc {TestDescription | TestStepDescription} */
|
/**
|
||||||
|
* @param {TestDescription | TestStepDescription} desc
|
||||||
|
*/
|
||||||
function createTestContext(desc) {
|
function createTestContext(desc) {
|
||||||
let parent;
|
let parent;
|
||||||
let level;
|
let level;
|
||||||
|
@ -412,8 +447,8 @@ function createTestContext(desc) {
|
||||||
*/
|
*/
|
||||||
origin: desc.origin,
|
origin: desc.origin,
|
||||||
/**
|
/**
|
||||||
* @param nameOrFnOrOptions {string | TestStepDefinition | ((t: TestContext) => void | Promise<void>)}
|
* @param {string | TestStepDescription | ((t: TestContext) => void | Promise<void>)} nameOrFnOrOptions
|
||||||
* @param maybeFn {((t: TestContext) => void | Promise<void>) | undefined}
|
* @param {((t: TestContext) => void | Promise<void>) | undefined} maybeFn
|
||||||
*/
|
*/
|
||||||
async step(nameOrFnOrOptions, maybeFn) {
|
async step(nameOrFnOrOptions, maybeFn) {
|
||||||
if (MapPrototypeGet(testStates, desc.id).completed) {
|
if (MapPrototypeGet(testStates, desc.id).completed) {
|
||||||
|
@ -423,6 +458,7 @@ function createTestContext(desc) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @type {TestStepDescription & { fn: any }} */
|
||||||
let stepDesc;
|
let stepDesc;
|
||||||
if (typeof nameOrFnOrOptions === "string") {
|
if (typeof nameOrFnOrOptions === "string") {
|
||||||
if (typeof maybeFn !== "function") {
|
if (typeof maybeFn !== "function") {
|
||||||
|
@ -500,10 +536,8 @@ function createTestContext(desc) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrap a user test function in one which returns a structured result.
|
* Wrap a user test function in one which returns a structured result.
|
||||||
* @template T {Function}
|
* @param {TestDescription | TestStepDescription} desc
|
||||||
* @param testFn {T}
|
* @returns {TestFunction}
|
||||||
* @param desc {TestDescription | TestStepDescription}
|
|
||||||
* @returns {T}
|
|
||||||
*/
|
*/
|
||||||
function wrapTest(desc) {
|
function wrapTest(desc) {
|
||||||
let testFn = wrapInner(desc.fn);
|
let testFn = wrapInner(desc.fn);
|
||||||
|
|
|
@ -226,7 +226,6 @@ deno_core::extension!(deno_node,
|
||||||
ops::crypto::op_node_decipheriv_decrypt,
|
ops::crypto::op_node_decipheriv_decrypt,
|
||||||
ops::crypto::op_node_decipheriv_final,
|
ops::crypto::op_node_decipheriv_final,
|
||||||
ops::crypto::op_node_decipheriv_set_aad,
|
ops::crypto::op_node_decipheriv_set_aad,
|
||||||
ops::crypto::op_node_decipheriv_take,
|
|
||||||
ops::crypto::op_node_dh_compute_secret,
|
ops::crypto::op_node_dh_compute_secret,
|
||||||
ops::crypto::op_node_diffie_hellman,
|
ops::crypto::op_node_diffie_hellman,
|
||||||
ops::crypto::op_node_ecdh_compute_public_key,
|
ops::crypto::op_node_ecdh_compute_public_key,
|
||||||
|
|
|
@ -500,6 +500,11 @@ impl Decipher {
|
||||||
auth_tag: &[u8],
|
auth_tag: &[u8],
|
||||||
) -> Result<(), DecipherError> {
|
) -> Result<(), DecipherError> {
|
||||||
use Decipher::*;
|
use Decipher::*;
|
||||||
|
|
||||||
|
if input.is_empty() && !matches!(self, Aes128Gcm(_) | Aes256Gcm(_)) {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
match (self, auto_pad) {
|
match (self, auto_pad) {
|
||||||
(Aes128Cbc(decryptor), true) => {
|
(Aes128Cbc(decryptor), true) => {
|
||||||
assert!(input.len() == 16);
|
assert!(input.len() == 16);
|
||||||
|
|
|
@ -332,17 +332,6 @@ pub fn op_node_decipheriv_decrypt(
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
#[op2(fast)]
|
|
||||||
pub fn op_node_decipheriv_take(
|
|
||||||
state: &mut OpState,
|
|
||||||
#[smi] rid: u32,
|
|
||||||
) -> Result<(), cipher::DecipherContextError> {
|
|
||||||
let context = state.resource_table.take::<cipher::DecipherContext>(rid)?;
|
|
||||||
Rc::try_unwrap(context)
|
|
||||||
.map_err(|_| cipher::DecipherContextError::ContextInUse)?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[op2]
|
#[op2]
|
||||||
pub fn op_node_decipheriv_final(
|
pub fn op_node_decipheriv_final(
|
||||||
state: &mut OpState,
|
state: &mut OpState,
|
||||||
|
|
|
@ -18,7 +18,6 @@ import {
|
||||||
op_node_decipheriv_decrypt,
|
op_node_decipheriv_decrypt,
|
||||||
op_node_decipheriv_final,
|
op_node_decipheriv_final,
|
||||||
op_node_decipheriv_set_aad,
|
op_node_decipheriv_set_aad,
|
||||||
op_node_decipheriv_take,
|
|
||||||
op_node_private_decrypt,
|
op_node_private_decrypt,
|
||||||
op_node_private_encrypt,
|
op_node_private_encrypt,
|
||||||
op_node_public_encrypt,
|
op_node_public_encrypt,
|
||||||
|
@ -352,14 +351,6 @@ export class Decipheriv extends Transform implements Cipher {
|
||||||
}
|
}
|
||||||
|
|
||||||
final(encoding: string = getDefaultEncoding()): Buffer | string {
|
final(encoding: string = getDefaultEncoding()): Buffer | string {
|
||||||
if (!this.#needsBlockCache || this.#cache.cache.byteLength === 0) {
|
|
||||||
op_node_decipheriv_take(this.#context);
|
|
||||||
return encoding === "buffer" ? Buffer.from([]) : "";
|
|
||||||
}
|
|
||||||
if (this.#cache.cache.byteLength != 16) {
|
|
||||||
throw new Error("Invalid final block size");
|
|
||||||
}
|
|
||||||
|
|
||||||
let buf = new Buffer(16);
|
let buf = new Buffer(16);
|
||||||
op_node_decipheriv_final(
|
op_node_decipheriv_final(
|
||||||
this.#context,
|
this.#context,
|
||||||
|
@ -369,6 +360,13 @@ export class Decipheriv extends Transform implements Cipher {
|
||||||
this.#authTag || NO_TAG,
|
this.#authTag || NO_TAG,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (!this.#needsBlockCache || this.#cache.cache.byteLength === 0) {
|
||||||
|
return encoding === "buffer" ? Buffer.from([]) : "";
|
||||||
|
}
|
||||||
|
if (this.#cache.cache.byteLength != 16) {
|
||||||
|
throw new Error("Invalid final block size");
|
||||||
|
}
|
||||||
|
|
||||||
buf = buf.subarray(0, 16 - buf.at(-1)); // Padded in Pkcs7 mode
|
buf = buf.subarray(0, 16 - buf.at(-1)); // Padded in Pkcs7 mode
|
||||||
return encoding === "buffer" ? buf : buf.toString(encoding);
|
return encoding === "buffer" ? buf : buf.toString(encoding);
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,6 +116,12 @@ deno_core::extension!(
|
||||||
"op_exit" | "op_set_exit_code" | "op_get_exit_code" =>
|
"op_exit" | "op_set_exit_code" | "op_get_exit_code" =>
|
||||||
op.with_implementation_from(&deno_core::op_void_sync()),
|
op.with_implementation_from(&deno_core::op_void_sync()),
|
||||||
_ => op,
|
_ => op,
|
||||||
|
},
|
||||||
|
state = |state| {
|
||||||
|
#[cfg(unix)]
|
||||||
|
{
|
||||||
|
state.put(ops::signal::SignalState::default());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,7 @@ use opentelemetry::metrics::InstrumentBuilder;
|
||||||
use opentelemetry::metrics::MeterProvider as _;
|
use opentelemetry::metrics::MeterProvider as _;
|
||||||
use opentelemetry::otel_debug;
|
use opentelemetry::otel_debug;
|
||||||
use opentelemetry::otel_error;
|
use opentelemetry::otel_error;
|
||||||
|
use opentelemetry::trace::Link;
|
||||||
use opentelemetry::trace::SpanContext;
|
use opentelemetry::trace::SpanContext;
|
||||||
use opentelemetry::trace::SpanId;
|
use opentelemetry::trace::SpanId;
|
||||||
use opentelemetry::trace::SpanKind;
|
use opentelemetry::trace::SpanKind;
|
||||||
|
@ -94,6 +95,7 @@ deno_core::extension!(
|
||||||
op_otel_span_attribute1,
|
op_otel_span_attribute1,
|
||||||
op_otel_span_attribute2,
|
op_otel_span_attribute2,
|
||||||
op_otel_span_attribute3,
|
op_otel_span_attribute3,
|
||||||
|
op_otel_span_add_link,
|
||||||
op_otel_span_update_name,
|
op_otel_span_update_name,
|
||||||
op_otel_metric_attribute3,
|
op_otel_metric_attribute3,
|
||||||
op_otel_metric_record0,
|
op_otel_metric_record0,
|
||||||
|
@ -1324,17 +1326,6 @@ impl OtelSpan {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[fast]
|
|
||||||
fn drop_link(&self) {
|
|
||||||
let mut state = self.0.borrow_mut();
|
|
||||||
match &mut **state {
|
|
||||||
OtelSpanState::Recording(span) => {
|
|
||||||
span.links.dropped_count += 1;
|
|
||||||
}
|
|
||||||
OtelSpanState::Done(_) => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[fast]
|
#[fast]
|
||||||
fn end(&self, end_time: f64) {
|
fn end(&self, end_time: f64) {
|
||||||
let end_time = if end_time.is_nan() {
|
let end_time = if end_time.is_nan() {
|
||||||
|
@ -1448,6 +1439,48 @@ fn op_otel_span_update_name<'s>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[op2(fast)]
|
||||||
|
fn op_otel_span_add_link<'s>(
|
||||||
|
scope: &mut v8::HandleScope<'s>,
|
||||||
|
span: v8::Local<'s, v8::Value>,
|
||||||
|
trace_id: v8::Local<'s, v8::Value>,
|
||||||
|
span_id: v8::Local<'s, v8::Value>,
|
||||||
|
#[smi] trace_flags: u8,
|
||||||
|
is_remote: bool,
|
||||||
|
#[smi] dropped_attributes_count: u32,
|
||||||
|
) -> bool {
|
||||||
|
let trace_id = parse_trace_id(scope, trace_id);
|
||||||
|
if trace_id == TraceId::INVALID {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
let span_id = parse_span_id(scope, span_id);
|
||||||
|
if span_id == SpanId::INVALID {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
let span_context = SpanContext::new(
|
||||||
|
trace_id,
|
||||||
|
span_id,
|
||||||
|
TraceFlags::new(trace_flags),
|
||||||
|
is_remote,
|
||||||
|
TraceState::NONE,
|
||||||
|
);
|
||||||
|
|
||||||
|
let Some(span) =
|
||||||
|
deno_core::_ops::try_unwrap_cppgc_object::<OtelSpan>(scope, span)
|
||||||
|
else {
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
let mut state = span.0.borrow_mut();
|
||||||
|
if let OtelSpanState::Recording(span) = &mut **state {
|
||||||
|
span.links.links.push(Link::new(
|
||||||
|
span_context,
|
||||||
|
vec![],
|
||||||
|
dropped_attributes_count,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
struct OtelMeter(opentelemetry::metrics::Meter);
|
struct OtelMeter(opentelemetry::metrics::Meter);
|
||||||
|
|
||||||
impl deno_core::GarbageCollected for OtelMeter {}
|
impl deno_core::GarbageCollected for OtelMeter {}
|
||||||
|
|
|
@ -15,6 +15,7 @@ import {
|
||||||
op_otel_metric_record2,
|
op_otel_metric_record2,
|
||||||
op_otel_metric_record3,
|
op_otel_metric_record3,
|
||||||
op_otel_metric_wait_to_observe,
|
op_otel_metric_wait_to_observe,
|
||||||
|
op_otel_span_add_link,
|
||||||
op_otel_span_attribute1,
|
op_otel_span_attribute1,
|
||||||
op_otel_span_attribute2,
|
op_otel_span_attribute2,
|
||||||
op_otel_span_attribute3,
|
op_otel_span_attribute3,
|
||||||
|
@ -186,7 +187,6 @@ interface OtelSpan {
|
||||||
spanContext(): SpanContext;
|
spanContext(): SpanContext;
|
||||||
setStatus(status: SpanStatusCode, errorDescription: string): void;
|
setStatus(status: SpanStatusCode, errorDescription: string): void;
|
||||||
dropEvent(): void;
|
dropEvent(): void;
|
||||||
dropLink(): void;
|
|
||||||
end(endTime: number): void;
|
end(endTime: number): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -359,14 +359,24 @@ class Span {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
addLink(_link: Link): Span {
|
addLink(link: Link): Span {
|
||||||
this.#otelSpan?.dropLink();
|
const droppedAttributeCount = (link.droppedAttributesCount ?? 0) +
|
||||||
|
(link.attributes ? ObjectKeys(link.attributes).length : 0);
|
||||||
|
const valid = op_otel_span_add_link(
|
||||||
|
this.#otelSpan,
|
||||||
|
link.context.traceId,
|
||||||
|
link.context.spanId,
|
||||||
|
link.context.traceFlags,
|
||||||
|
link.context.isRemote ?? false,
|
||||||
|
droppedAttributeCount,
|
||||||
|
);
|
||||||
|
if (!valid) return this;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
addLinks(links: Link[]): Span {
|
addLinks(links: Link[]): Span {
|
||||||
for (let i = 0; i < links.length; i++) {
|
for (let i = 0; i < links.length; i++) {
|
||||||
this.#otelSpan?.dropLink();
|
this.addLink(links[i]);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,10 @@
|
||||||
},
|
},
|
||||||
"args": "run -A main.ts metric.ts",
|
"args": "run -A main.ts metric.ts",
|
||||||
"output": "metric.out"
|
"output": "metric.out"
|
||||||
|
},
|
||||||
|
"links": {
|
||||||
|
"args": "run -A main.ts links.ts",
|
||||||
|
"output": "links.out"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
96
tests/specs/cli/otel_basic/links.out
Normal file
96
tests/specs/cli/otel_basic/links.out
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
{
|
||||||
|
"spans": [
|
||||||
|
{
|
||||||
|
"traceId": "00000000000000000000000000000001",
|
||||||
|
"spanId": "0000000000000001",
|
||||||
|
"traceState": "",
|
||||||
|
"parentSpanId": "",
|
||||||
|
"flags": 1,
|
||||||
|
"name": "example span",
|
||||||
|
"kind": 1,
|
||||||
|
"startTimeUnixNano": "[WILDCARD]",
|
||||||
|
"endTimeUnixNano": "[WILDCARD]",
|
||||||
|
"attributes": [],
|
||||||
|
"droppedAttributesCount": 0,
|
||||||
|
"events": [],
|
||||||
|
"droppedEventsCount": 0,
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"traceId": "1234567890abcdef1234567890abcdef",
|
||||||
|
"spanId": "1234567890abcdef",
|
||||||
|
"traceState": "",
|
||||||
|
"attributes": [],
|
||||||
|
"droppedAttributesCount": 0,
|
||||||
|
"flags": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"droppedLinksCount": 0,
|
||||||
|
"status": {
|
||||||
|
"message": "",
|
||||||
|
"code": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"traceId": "00000000000000000000000000000002",
|
||||||
|
"spanId": "0000000000000002",
|
||||||
|
"traceState": "",
|
||||||
|
"parentSpanId": "",
|
||||||
|
"flags": 1,
|
||||||
|
"name": "example span",
|
||||||
|
"kind": 1,
|
||||||
|
"startTimeUnixNano": "[WILDCARD]",
|
||||||
|
"endTimeUnixNano": "[WILDCARD]",
|
||||||
|
"attributes": [],
|
||||||
|
"droppedAttributesCount": 0,
|
||||||
|
"events": [],
|
||||||
|
"droppedEventsCount": 0,
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"traceId": "1234567890abcdef1234567890abcdef",
|
||||||
|
"spanId": "1234567890abcdef",
|
||||||
|
"traceState": "",
|
||||||
|
"attributes": [],
|
||||||
|
"droppedAttributesCount": 0,
|
||||||
|
"flags": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"droppedLinksCount": 0,
|
||||||
|
"status": {
|
||||||
|
"message": "",
|
||||||
|
"code": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"traceId": "00000000000000000000000000000003",
|
||||||
|
"spanId": "0000000000000003",
|
||||||
|
"traceState": "",
|
||||||
|
"parentSpanId": "",
|
||||||
|
"flags": 1,
|
||||||
|
"name": "example span",
|
||||||
|
"kind": 1,
|
||||||
|
"startTimeUnixNano": "[WILDCARD]",
|
||||||
|
"endTimeUnixNano": "[WILDCARD]",
|
||||||
|
"attributes": [],
|
||||||
|
"droppedAttributesCount": 0,
|
||||||
|
"events": [],
|
||||||
|
"droppedEventsCount": 0,
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"traceId": "1234567890abcdef1234567890abcdef",
|
||||||
|
"spanId": "1234567890abcdef",
|
||||||
|
"traceState": "",
|
||||||
|
"attributes": [],
|
||||||
|
"droppedAttributesCount": 2,
|
||||||
|
"flags": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"droppedLinksCount": 0,
|
||||||
|
"status": {
|
||||||
|
"message": "",
|
||||||
|
"code": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"logs": [],
|
||||||
|
"metrics": []
|
||||||
|
}
|
40
tests/specs/cli/otel_basic/links.ts
Normal file
40
tests/specs/cli/otel_basic/links.ts
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
// Copyright 2018-2025 the Deno authors. MIT license.
|
||||||
|
|
||||||
|
import { trace } from "npm:@opentelemetry/api@1.9.0";
|
||||||
|
|
||||||
|
const tracer = trace.getTracer("example-tracer");
|
||||||
|
|
||||||
|
const span1 = tracer.startSpan("example span", {
|
||||||
|
links: [{
|
||||||
|
context: {
|
||||||
|
traceId: "1234567890abcdef1234567890abcdef",
|
||||||
|
spanId: "1234567890abcdef",
|
||||||
|
traceFlags: 1,
|
||||||
|
},
|
||||||
|
}],
|
||||||
|
});
|
||||||
|
span1.end();
|
||||||
|
|
||||||
|
const span2 = tracer.startSpan("example span");
|
||||||
|
span2.addLink({
|
||||||
|
context: {
|
||||||
|
traceId: "1234567890abcdef1234567890abcdef",
|
||||||
|
spanId: "1234567890abcdef",
|
||||||
|
traceFlags: 1,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
span2.end();
|
||||||
|
|
||||||
|
const span3 = tracer.startSpan("example span");
|
||||||
|
span3.addLink({
|
||||||
|
context: {
|
||||||
|
traceId: "1234567890abcdef1234567890abcdef",
|
||||||
|
spanId: "1234567890abcdef",
|
||||||
|
traceFlags: 1,
|
||||||
|
},
|
||||||
|
attributes: {
|
||||||
|
key: "value",
|
||||||
|
},
|
||||||
|
droppedAttributesCount: 1,
|
||||||
|
});
|
||||||
|
span3.end();
|
|
@ -4,7 +4,7 @@ import crypto from "node:crypto";
|
||||||
import { Buffer } from "node:buffer";
|
import { Buffer } from "node:buffer";
|
||||||
import testVectors128 from "./gcmEncryptExtIV128.json" with { type: "json" };
|
import testVectors128 from "./gcmEncryptExtIV128.json" with { type: "json" };
|
||||||
import testVectors256 from "./gcmEncryptExtIV256.json" with { type: "json" };
|
import testVectors256 from "./gcmEncryptExtIV256.json" with { type: "json" };
|
||||||
import { assertEquals } from "@std/assert";
|
import { assertEquals, assertThrows } from "@std/assert";
|
||||||
|
|
||||||
const aesGcm = (bits: string, key: Uint8Array) => {
|
const aesGcm = (bits: string, key: Uint8Array) => {
|
||||||
const ALGO = bits == "128" ? `aes-128-gcm` : `aes-256-gcm`;
|
const ALGO = bits == "128" ? `aes-128-gcm` : `aes-256-gcm`;
|
||||||
|
@ -123,7 +123,7 @@ Deno.test({
|
||||||
// Issue #27441
|
// Issue #27441
|
||||||
// https://github.com/denoland/deno/issues/27441
|
// https://github.com/denoland/deno/issues/27441
|
||||||
Deno.test({
|
Deno.test({
|
||||||
name: "aes-256-gcm supports IV of non standard length",
|
name: "aes-256-gcm supports IV of non standard length and auth tag check",
|
||||||
fn() {
|
fn() {
|
||||||
const decipher = crypto.createDecipheriv(
|
const decipher = crypto.createDecipheriv(
|
||||||
"aes-256-gcm",
|
"aes-256-gcm",
|
||||||
|
@ -136,6 +136,10 @@ Deno.test({
|
||||||
"utf-8",
|
"utf-8",
|
||||||
);
|
);
|
||||||
assertEquals(decrypted, "this is a secret");
|
assertEquals(decrypted, "this is a secret");
|
||||||
decipher.final();
|
assertThrows(
|
||||||
|
() => decipher.final(),
|
||||||
|
TypeError,
|
||||||
|
"Failed to authenticate data",
|
||||||
|
);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Reference in a new issue