@@ -62,6 +62,9 @@ TEST(TraceStateTest, ValidateHeaderParsing)
6262 {" k1=v1,k2=v2,invalidmember" , " " },
6363 {" 1a-2f@foo=bar1,a*/foo-_/bar=bar4" , " 1a-2f@foo=bar1,a*/foo-_/bar=bar4" },
6464 {" 1a-2f@foo=bar1,*/foo-_/bar=bar4" , " " },
65+ {" foo@@bar=1,baz=2" , " foo@@bar=1,baz=2" },
66+ {" foo@bar@baz=1" , " foo@bar@baz=1" },
67+ {" @foo=1" , " " },
6568 {" ,k1=v1" , " k1=v1" },
6669 {" ," , " " },
6770 {" ,=," , " " },
@@ -71,6 +74,12 @@ TEST(TraceStateTest, ValidateHeaderParsing)
7174 {
7275 EXPECT_EQ (create_ts_return_header (testcase.input ), testcase.expected );
7376 }
77+ // Key length boundaries: 256-char key valid, 257-char invalid
78+ EXPECT_NE (create_ts_return_header (std::string (256 , ' z' ) + " =1" ), " " );
79+ EXPECT_EQ (create_ts_return_header (std::string (257 , ' z' ) + " =1" ), " " );
80+ // Old vendor-section limits (241 before @, 14 after) are gone; only total length matters
81+ EXPECT_NE (create_ts_return_header (std::string (242 , ' t' ) + " @v=1" ), " " ); // 244-char key with @
82+ EXPECT_NE (create_ts_return_header (" t@" + std::string (15 , ' v' ) + " =1" ), " " ); // 15 chars after @
7483}
7584
7685TEST (TraceStateTest, ExceedsMaxKeyValuePairs)
@@ -165,10 +174,23 @@ TEST(TraceStateTest, GetAllEntries)
165174TEST (TraceStateTest, IsValidKey)
166175{
167176 EXPECT_TRUE (TraceState::IsValidKey (" valid-key23/*" ));
177+ // @ is a regular keychar per W3C Trace Context Level 2
178+ EXPECT_TRUE (TraceState::IsValidKey (" foo@" ));
179+ EXPECT_TRUE (TraceState::IsValidKey (" foo@@bar" ));
180+ EXPECT_TRUE (TraceState::IsValidKey (" foo@bar@baz" ));
181+ EXPECT_FALSE (TraceState::IsValidKey (" @foo" )); // must start with lcalpha or DIGIT
168182 EXPECT_FALSE (TraceState::IsValidKey (" Invalid_key" ));
169183 EXPECT_FALSE (TraceState::IsValidKey (" invalid$Key&" ));
170184 EXPECT_FALSE (TraceState::IsValidKey (" " ));
171185 EXPECT_FALSE (TraceState::IsValidKey (kLongString ));
186+ // Key length boundary: exactly 256 chars valid, 257 invalid
187+ EXPECT_TRUE (TraceState::IsValidKey (std::string (256 , ' z' )));
188+ EXPECT_FALSE (TraceState::IsValidKey (std::string (257 , ' z' )));
189+ // Old vendor-section limits (241 before @, 14 after) are gone; only total length matters
190+ EXPECT_TRUE (
191+ TraceState::IsValidKey (std::string (241 , ' t' ) + " @" + std::string (14 , ' v' ))); // 256 chars
192+ EXPECT_TRUE (TraceState::IsValidKey (std::string (242 , ' t' ) + " @v" )); // 244 chars
193+ EXPECT_TRUE (TraceState::IsValidKey (" t@" + std::string (15 , ' v' ))); // 17 chars
172194}
173195
174196TEST (TraceStateTest, IsValidValue)
0 commit comments