|
6 | 6 | // https://developers.google.com/open-source/licenses/bsd
|
7 | 7 |
|
8 | 8 | #import "GPBTestUtilities.h"
|
| 9 | +#import "GPBUnknownFieldSet.h" |
9 | 10 |
|
10 | 11 | #import "GPBUnknownFieldSet_PackagePrivate.h"
|
11 | 12 | #import "GPBUnknownField_PackagePrivate.h"
|
@@ -376,6 +377,180 @@ - (void)testLargeVarint {
|
376 | 377 | XCTAssertEqual(0x7FFFFFFFFFFFFFFFULL, [field2.varintList valueAtIndex:0]);
|
377 | 378 | }
|
378 | 379 |
|
| 380 | +static NSData* DataForGroupsOfDepth(NSUInteger depth) { |
| 381 | + NSMutableData* data = [NSMutableData dataWithCapacity:0]; |
| 382 | + |
| 383 | + uint32_t byte = 35; // 35 = 0b100011 -> field 4/start group |
| 384 | + for (NSUInteger i = 0; i < depth; ++i) { |
| 385 | + [data appendBytes:&byte length:1]; |
| 386 | + } |
| 387 | + |
| 388 | + byte = 8; // 8 = 0b1000, -> field 1/varint |
| 389 | + [data appendBytes:&byte length:1]; |
| 390 | + byte = 1; // 1 -> varint value of 1 |
| 391 | + [data appendBytes:&byte length:1]; |
| 392 | + |
| 393 | + byte = 36; // 36 = 0b100100 -> field 4/end group |
| 394 | + for (NSUInteger i = 0; i < depth; ++i) { |
| 395 | + [data appendBytes:&byte length:1]; |
| 396 | + } |
| 397 | + return data; |
| 398 | +} |
| 399 | + |
| 400 | +- (void)testParsingNestingGroupData { |
| 401 | + // 35 = 0b100011 -> field 4/start group |
| 402 | + // 36 = 0b100100 -> field 4/end group |
| 403 | + // 43 = 0b101011 -> field 5/end group |
| 404 | + // 44 = 0b101100 -> field 5/end group |
| 405 | + // 8 = 0b1000, 1 -> field 1/varint, value of 1 |
| 406 | + // 21 = 0b10101, 0x78, 0x56, 0x34, 0x12 -> field 2/fixed32, value of 0x12345678 |
| 407 | + // 25 = 0b11001, 0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12 -> field 3/fixed64, |
| 408 | + // value of 0x123456789abcdef0LL |
| 409 | + // 50 = 0b110010, 0x0 -> field 6/length delimited, length 0 |
| 410 | + // 50 = 0b110010, 0x1, 42 -> field 6/length delimited, length 1, byte 42 |
| 411 | + // 0 -> field 0 which is invalid/varint |
| 412 | + // 15 = 0b1111 -> field 1, wire type 7 which is invalid |
| 413 | + |
| 414 | + TestEmptyMessage* m = [TestEmptyMessage parseFromData:DataFromBytes(35, 36) |
| 415 | + error:NULL]; // empty group |
| 416 | + XCTAssertEqual(m.unknownFields.countOfFields, (NSUInteger)1); |
| 417 | + GPBUnknownField* field = [m.unknownFields getField:4]; |
| 418 | + XCTAssertEqual(field.groupList.count, (NSUInteger)1); |
| 419 | + GPBUnknownFieldSet* group = field.groupList[0]; |
| 420 | + XCTAssertEqual(group.countOfFields, (NSUInteger)0); |
| 421 | + |
| 422 | + m = [TestEmptyMessage parseFromData:DataFromBytes(35, 8, 1, 36) error:NULL]; // varint |
| 423 | + XCTAssertEqual(m.unknownFields.countOfFields, (NSUInteger)1); |
| 424 | + field = [m.unknownFields getField:4]; |
| 425 | + XCTAssertEqual(field.groupList.count, (NSUInteger)1); |
| 426 | + group = field.groupList[0]; |
| 427 | + field = [group getField:1]; |
| 428 | + XCTAssertEqual(field.varintList.count, (NSUInteger)1); |
| 429 | + XCTAssertEqual([field.varintList valueAtIndex:0], 1); |
| 430 | + |
| 431 | + m = [TestEmptyMessage parseFromData:DataFromBytes(35, 21, 0x78, 0x56, 0x34, 0x12, 36) |
| 432 | + error:NULL]; // fixed32 |
| 433 | + XCTAssertEqual(m.unknownFields.countOfFields, (NSUInteger)1); |
| 434 | + field = [m.unknownFields getField:4]; |
| 435 | + XCTAssertEqual(field.groupList.count, (NSUInteger)1); |
| 436 | + group = field.groupList[0]; |
| 437 | + field = [group getField:2]; |
| 438 | + XCTAssertEqual(field.fixed32List.count, (NSUInteger)1); |
| 439 | + XCTAssertEqual([field.fixed32List valueAtIndex:0], 0x12345678); |
| 440 | + |
| 441 | + m = [TestEmptyMessage |
| 442 | + parseFromData:DataFromBytes(35, 25, 0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12, |
| 443 | + 36) |
| 444 | + error:NULL]; // fixed64 |
| 445 | + XCTAssertEqual(m.unknownFields.countOfFields, (NSUInteger)1); |
| 446 | + field = [m.unknownFields getField:4]; |
| 447 | + XCTAssertEqual(field.groupList.count, (NSUInteger)1); |
| 448 | + group = field.groupList[0]; |
| 449 | + field = [group getField:3]; |
| 450 | + XCTAssertEqual(field.fixed64List.count, (NSUInteger)1); |
| 451 | + XCTAssertEqual([field.fixed64List valueAtIndex:0], 0x123456789abcdef0LL); |
| 452 | + |
| 453 | + m = [TestEmptyMessage parseFromData:DataFromBytes(35, 50, 0, 36) |
| 454 | + error:NULL]; // length delimited, length 0 |
| 455 | + XCTAssertEqual(m.unknownFields.countOfFields, (NSUInteger)1); |
| 456 | + field = [m.unknownFields getField:4]; |
| 457 | + XCTAssertEqual(field.groupList.count, (NSUInteger)1); |
| 458 | + group = field.groupList[0]; |
| 459 | + field = [group getField:6]; |
| 460 | + XCTAssertEqual(field.lengthDelimitedList.count, (NSUInteger)1); |
| 461 | + XCTAssertEqualObjects(field.lengthDelimitedList[0], [NSData data]); |
| 462 | + |
| 463 | + m = [TestEmptyMessage parseFromData:DataFromBytes(35, 50, 1, 42, 36) |
| 464 | + error:NULL]; // length delimited, length 1, byte 42 |
| 465 | + XCTAssertEqual(m.unknownFields.countOfFields, (NSUInteger)1); |
| 466 | + field = [m.unknownFields getField:4]; |
| 467 | + XCTAssertEqual(field.groupList.count, (NSUInteger)1); |
| 468 | + group = field.groupList[0]; |
| 469 | + field = [group getField:6]; |
| 470 | + XCTAssertEqual(field.lengthDelimitedList.count, (NSUInteger)1); |
| 471 | + XCTAssertEqualObjects(field.lengthDelimitedList[0], DataFromBytes(42)); |
| 472 | + |
| 473 | + m = [TestEmptyMessage parseFromData:DataFromBytes(35, 43, 44, 36) error:NULL]; // Sub group |
| 474 | + field = [m.unknownFields getField:4]; |
| 475 | + XCTAssertEqual(field.groupList.count, (NSUInteger)1); |
| 476 | + group = field.groupList[0]; |
| 477 | + XCTAssertEqual(group.countOfFields, (NSUInteger)1); |
| 478 | + field = [group getField:5]; |
| 479 | + XCTAssertEqual(field.groupList.count, (NSUInteger)1); |
| 480 | + group = field.groupList[0]; |
| 481 | + XCTAssertEqual(group.countOfFields, (NSUInteger)0); |
| 482 | + |
| 483 | + m = [TestEmptyMessage parseFromData:DataFromBytes(35, 8, 1, 43, 8, 2, 44, 36) |
| 484 | + error:NULL]; // varint and sub group with varint |
| 485 | + XCTAssertEqual(m.unknownFields.countOfFields, (NSUInteger)1); |
| 486 | + field = [m.unknownFields getField:4]; |
| 487 | + XCTAssertEqual(field.groupList.count, (NSUInteger)1); |
| 488 | + group = field.groupList[0]; |
| 489 | + XCTAssertEqual(group.countOfFields, (NSUInteger)2); |
| 490 | + field = [group getField:1]; |
| 491 | + XCTAssertEqual(field.varintList.count, (NSUInteger)1); |
| 492 | + XCTAssertEqual([field.varintList valueAtIndex:0], 1); |
| 493 | + field = [group getField:5]; |
| 494 | + XCTAssertEqual(field.groupList.count, (NSUInteger)1); |
| 495 | + group = field.groupList[0]; |
| 496 | + field = [group getField:1]; |
| 497 | + XCTAssertEqual(field.varintList.count, (NSUInteger)1); |
| 498 | + XCTAssertEqual([field.varintList valueAtIndex:0], 2); |
| 499 | + |
| 500 | + XCTAssertNil([TestEmptyMessage parseFromData:DataFromBytes(35, 0, 36) |
| 501 | + error:NULL]); // Invalid field number |
| 502 | + XCTAssertNil([TestEmptyMessage parseFromData:DataFromBytes(35, 15, 36) |
| 503 | + error:NULL]); // Invalid wire type |
| 504 | + XCTAssertNil([TestEmptyMessage parseFromData:DataFromBytes(35, 21, 0x78, 0x56, 0x34) |
| 505 | + error:NULL]); // truncated fixed32 |
| 506 | + XCTAssertNil([TestEmptyMessage |
| 507 | + parseFromData:DataFromBytes(35, 25, 0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, |
| 508 | + 0x34) |
| 509 | + error:NULL]); // truncated fixed64 |
| 510 | + |
| 511 | + // Mising end group |
| 512 | + XCTAssertNil([TestEmptyMessage parseFromData:DataFromBytes(35) error:NULL]); |
| 513 | + XCTAssertNil([TestEmptyMessage parseFromData:DataFromBytes(35, 8, 1) error:NULL]); |
| 514 | + XCTAssertNil([TestEmptyMessage parseFromData:DataFromBytes(35, 43) error:NULL]); |
| 515 | + XCTAssertNil([TestEmptyMessage parseFromData:DataFromBytes(35, 43, 8, 1) error:NULL]); |
| 516 | + |
| 517 | + // Wrong end group |
| 518 | + XCTAssertNil([TestEmptyMessage parseFromData:DataFromBytes(35, 44) error:NULL]); |
| 519 | + XCTAssertNil([TestEmptyMessage parseFromData:DataFromBytes(35, 8, 1, 44) error:NULL]); |
| 520 | + XCTAssertNil([TestEmptyMessage parseFromData:DataFromBytes(35, 43, 36) error:NULL]); |
| 521 | + XCTAssertNil([TestEmptyMessage parseFromData:DataFromBytes(35, 43, 8, 1, 36) error:NULL]); |
| 522 | + XCTAssertNil([TestEmptyMessage parseFromData:DataFromBytes(35, 43, 44, 44) error:NULL]); |
| 523 | + XCTAssertNil([TestEmptyMessage parseFromData:DataFromBytes(35, 43, 8, 1, 44, 44) error:NULL]); |
| 524 | + |
| 525 | + // This is the same limit as within GPBCodedInputStream. |
| 526 | + const NSUInteger kDefaultRecursionLimit = 100; |
| 527 | + // That depth parses. |
| 528 | + NSData* testData = DataForGroupsOfDepth(kDefaultRecursionLimit); |
| 529 | + m = [TestEmptyMessage parseFromData:testData error:NULL]; |
| 530 | + XCTAssertEqual(m.unknownFields.countOfFields, (NSUInteger)1); |
| 531 | + field = [m.unknownFields getField:4]; |
| 532 | + for (NSUInteger i = 0; i < kDefaultRecursionLimit; ++i) { |
| 533 | + XCTAssertEqual(field.varintList.count, (NSUInteger)0); |
| 534 | + XCTAssertEqual(field.fixed32List.count, (NSUInteger)0); |
| 535 | + XCTAssertEqual(field.fixed64List.count, (NSUInteger)0); |
| 536 | + XCTAssertEqual(field.lengthDelimitedList.count, (NSUInteger)0); |
| 537 | + XCTAssertEqual(field.groupList.count, (NSUInteger)1); |
| 538 | + group = field.groupList[0]; |
| 539 | + XCTAssertEqual(group.countOfFields, (NSUInteger)1); |
| 540 | + field = [group getField:(i < (kDefaultRecursionLimit - 1) ? 4 : 1)]; |
| 541 | + } |
| 542 | + // field is of the inner most group |
| 543 | + XCTAssertEqual(field.varintList.count, (NSUInteger)1); |
| 544 | + XCTAssertEqual([field.varintList valueAtIndex:0], (NSUInteger)1); |
| 545 | + XCTAssertEqual(field.fixed32List.count, (NSUInteger)0); |
| 546 | + XCTAssertEqual(field.fixed64List.count, (NSUInteger)0); |
| 547 | + XCTAssertEqual(field.lengthDelimitedList.count, (NSUInteger)0); |
| 548 | + XCTAssertEqual(field.groupList.count, (NSUInteger)0); |
| 549 | + // One more level deep fails. |
| 550 | + testData = DataForGroupsOfDepth(kDefaultRecursionLimit + 1); |
| 551 | + XCTAssertNil([TestEmptyMessage parseFromData:testData error:NULL]); |
| 552 | +} |
| 553 | + |
379 | 554 | #pragma mark - Field tests
|
380 | 555 | // Some tests directly on fields since the dictionary in FieldSet can gate
|
381 | 556 | // testing some of these.
|
|
0 commit comments