spec/elastic_apm/trace_context/traceparent_spec.rb (112 lines of code) (raw):
# Licensed to Elasticsearch B.V. under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# frozen_string_literal: true
require 'spec_helper'
module ElasticAPM
RSpec.describe TraceContext::Traceparent do
describe '.new' do
subject { described_class.new }
its(:version) { should eq '00' }
its(:trace_id) { should match(/.{16}/) }
its(:id) { should match(/.{8}/) }
its(:parent_id) { should be_nil }
it { should be_recorded }
end
describe '.parse' do
let(:header) { '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-00' }
subject { described_class.parse header }
context 'with a common header' do
it { expect { subject }.to_not raise_error }
its(:version) { should eq '00' }
its(:trace_id) { should eq '0af7651916cd43dd8448eb211c80319c' }
its(:parent_id) { should eq 'b7ad6b7169203331' }
its(:id) { should_not be_nil }
its(:id) { should_not eq 'b7ad6b7169203331' }
its(:flags) { should eq '00000000' }
end
context 'with a blank header' do
let(:header) { '' }
it do
expect { subject }
.to raise_error(TraceContext::InvalidTraceparentHeader)
end
end
context 'when recorded' do
let(:header) do
'00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01'
end
it { should be_recorded }
end
context 'with unknown version' do
let(:header) do
'01-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-03'
end
it do
expect { subject }
.to raise_error(TraceContext::InvalidTraceparentHeader)
end
end
context 'with non-hex trace id' do
let(:header) do
'00-Ggf7651916cd43dd8448eb211c80319c-b7ad6b7169203331-03'
end
it do
expect { subject }
.to raise_error(TraceContext::InvalidTraceparentHeader)
end
end
context 'with non-hex parent id' do
let(:header) do
'00-0af7651916cd43dd8448eb211c80319c-XXad6b7169203331-03'
end
it do
expect { subject }
.to raise_error(TraceContext::InvalidTraceparentHeader)
end
end
end
describe '#ensure_parent_id' do
let(:parent_id) { nil }
subject(:tc) { described_class.new parent_id: parent_id }
context 'parent_id set' do
let(:parent_id) { 'b7ad6b7169203331' }
it "doesn't change parent_id" do
expect(tc.ensure_parent_id).to eq parent_id
expect(tc.parent_id).to eq parent_id
end
end
it 'sets and returns parent_id' do
pid = tc.ensure_parent_id
expect(tc.parent_id).to eq pid
end
end
describe '#child' do
let(:header) { '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-00' }
let(:parent) { described_class.parse header }
subject { parent.child }
it 'makes a child copy' do
expect(subject.parent_id).to eq parent.id
expect(subject.id).not_to eq parent.id
end
end
describe '#to_header' do
subject do
described_class.new.tap do |tp|
tp.trace_id = '1' * 32
tp.id = '2' * 16
tp.flags = '00000011'
end
end
its(:to_header) do
should match('00-11111111111111111111111111111111-2222222222222222-01')
end
end
describe '#flags' do
context 'with flags as props' do
subject do
described_class.new.tap do |tp|
tp.recorded = true
end
end
its(:flags) { should eq '00000001' }
end
end
end
end