Skip to content

Commit c6f9946

Browse files
committed
refactor(test): Tiny cleanup of MMDS unit tests
* Insert a line break with "\" after "\r\n" if another line follows * Make multi-line strings start at the same column. * Eliminate unneeded variable assignments (`request_bytes`). * Use test utility function if possible * Remove duplicate test cases Signed-off-by: Takahiro Itazuri <[email protected]>
1 parent ea87024 commit c6f9946

File tree

1 file changed

+120
-94
lines changed

1 file changed

+120
-94
lines changed

src/vmm/src/mmds/mod.rs

Lines changed: 120 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ mod tests {
430430
// Test with empty `Accept` header. micro-http defaults to `Accept: text/plain`.
431431
let (request, expected_response) = generate_request_and_expected_response(
432432
b"GET http://169.254.169.254/ HTTP/1.0\r\n\"
433-
Accept:\r\n\r\n",
433+
Accept:\r\n\r\n",
434434
MediaType::PlainText,
435435
);
436436
assert_eq!(
@@ -441,7 +441,7 @@ mod tests {
441441
// Test with `Accept: */*` header.
442442
let (request, expected_response) = generate_request_and_expected_response(
443443
b"GET http://169.254.169.254/ HTTP/1.0\r\n\"
444-
Accept: */*\r\n\r\n",
444+
Accept: */*\r\n\r\n",
445445
MediaType::PlainText,
446446
);
447447
assert_eq!(
@@ -452,7 +452,7 @@ mod tests {
452452
// Test with `Accept: text/plain`.
453453
let (request, expected_response) = generate_request_and_expected_response(
454454
b"GET http://169.254.169.254/ HTTP/1.0\r\n\
455-
Accept: text/plain\r\n\r\n",
455+
Accept: text/plain\r\n\r\n",
456456
MediaType::PlainText,
457457
);
458458
assert_eq!(
@@ -463,7 +463,7 @@ mod tests {
463463
// Test with `Accept: application/json`.
464464
let (request, expected_response) = generate_request_and_expected_response(
465465
b"GET http://169.254.169.254/ HTTP/1.0\r\n\
466-
Accept: application/json\r\n\r\n",
466+
Accept: application/json\r\n\r\n",
467467
MediaType::ApplicationJson,
468468
);
469469
assert_eq!(convert_to_response(mmds, request), expected_response);
@@ -485,8 +485,9 @@ mod tests {
485485
);
486486

487487
// Test resource not found.
488-
let request_bytes = b"GET http://169.254.169.254/invalid HTTP/1.0\r\n\r\n";
489-
let request = Request::try_from(request_bytes, None).unwrap();
488+
let request =
489+
Request::try_from(b"GET http://169.254.169.254/invalid HTTP/1.0\r\n\r\n", None)
490+
.unwrap();
490491
let mut expected_response = Response::new(Version::Http10, StatusCode::NotFound);
491492
expected_response.set_content_type(MediaType::PlainText);
492493
expected_response.set_body(Body::new(
@@ -496,8 +497,7 @@ mod tests {
496497
assert_eq!(actual_response, expected_response);
497498

498499
// Test NotImplemented.
499-
let request_bytes = b"GET /age HTTP/1.1\r\n\r\n";
500-
let request = Request::try_from(request_bytes, None).unwrap();
500+
let request = Request::try_from(b"GET /age HTTP/1.1\r\n\r\n", None).unwrap();
501501
let mut expected_response = Response::new(Version::Http11, StatusCode::NotImplemented);
502502
expected_response.set_content_type(MediaType::PlainText);
503503
let body = "Cannot retrieve value. The value has an unsupported type.".to_string();
@@ -508,8 +508,11 @@ mod tests {
508508
// Test not allowed HTTP Method.
509509
let not_allowed_methods = ["PUT", "PATCH"];
510510
for method in not_allowed_methods.iter() {
511-
let request_bytes = format!("{} http://169.254.169.255/ HTTP/1.0\r\n\r\n", method);
512-
let request = Request::try_from(request_bytes.as_bytes(), None).unwrap();
511+
let request = Request::try_from(
512+
format!("{method} http://169.254.169.255/ HTTP/1.0\r\n\r\n").as_bytes(),
513+
None,
514+
)
515+
.unwrap();
513516
let mut expected_response =
514517
Response::new(Version::Http10, StatusCode::MethodNotAllowed);
515518
expected_response.set_content_type(MediaType::PlainText);
@@ -520,32 +523,29 @@ mod tests {
520523
}
521524

522525
// Test invalid (empty absolute path) URI.
523-
let request_bytes = b"GET http:// HTTP/1.0\r\n\r\n";
524-
let request = Request::try_from(request_bytes, None).unwrap();
526+
let request = Request::try_from(b"GET http:// HTTP/1.0\r\n\r\n", None).unwrap();
525527
let mut expected_response = Response::new(Version::Http10, StatusCode::BadRequest);
526528
expected_response.set_content_type(MediaType::PlainText);
527529
expected_response.set_body(Body::new(VmmMmdsError::InvalidURI.to_string()));
528530
let actual_response = convert_to_response(mmds.clone(), request);
529531
assert_eq!(actual_response, expected_response);
530532

531533
// Test invalid custom header value is ignored when V1 is configured.
532-
let request_bytes = b"GET http://169.254.169.254/name/first HTTP/1.0\r\n\
533-
Accept: application/json\r\n
534-
X-metadata-token-ttl-seconds: application/json\r\n\r\n";
535-
let request = Request::try_from(request_bytes, None).unwrap();
536-
let mut expected_response = Response::new(Version::Http10, StatusCode::OK);
537-
expected_response.set_body(Body::new("\"John\""));
534+
let (request, expected_response) = generate_request_and_expected_response(
535+
b"GET http://169.254.169.254/ HTTP/1.0\r\n\
536+
Accept: application/json\r\n\
537+
X-metadata-token-ttl-seconds: -60\r\n\r\n",
538+
MediaType::ApplicationJson,
539+
);
538540
let actual_response = convert_to_response(mmds.clone(), request);
539541
assert_eq!(actual_response, expected_response);
540542

541543
// Test Ok path.
542-
let request_bytes = b"GET http://169.254.169.254/ HTTP/1.0\r\n\
543-
Accept: application/json\r\n\r\n";
544-
let request = Request::try_from(request_bytes, None).unwrap();
545-
let mut expected_response = Response::new(Version::Http10, StatusCode::OK);
546-
let mut body = get_json_data().to_string();
547-
body.retain(|c| !c.is_whitespace());
548-
expected_response.set_body(Body::new(body));
544+
let (request, expected_response) = generate_request_and_expected_response(
545+
b"GET http://169.254.169.254/ HTTP/1.0\r\n\
546+
Accept: application/json\r\n\r\n",
547+
MediaType::ApplicationJson,
548+
);
549549
let actual_response = convert_to_response(mmds, request);
550550
assert_eq!(actual_response, expected_response);
551551
}
@@ -566,8 +566,8 @@ mod tests {
566566
);
567567

568568
// Test not allowed PATCH HTTP Method.
569-
let request_bytes = b"PATCH http://169.254.169.255/ HTTP/1.0\r\n\r\n";
570-
let request = Request::try_from(request_bytes, None).unwrap();
569+
let request =
570+
Request::try_from(b"PATCH http://169.254.169.255/ HTTP/1.0\r\n\r\n", None).unwrap();
571571
let mut expected_response = Response::new(Version::Http10, StatusCode::MethodNotAllowed);
572572
expected_response.set_content_type(MediaType::PlainText);
573573
expected_response.set_body(Body::new(VmmMmdsError::MethodNotAllowed.to_string()));
@@ -577,25 +577,30 @@ mod tests {
577577
assert_eq!(actual_response, expected_response);
578578

579579
// Test invalid value for custom header.
580-
let request_bytes = b"GET http://169.254.169.254/ HTTP/1.0\r\n\
581-
Accept: application/json\r\n
582-
X-metadata-token-ttl-seconds: application/json\r\n\r\n";
583-
let request = Request::try_from(request_bytes, None).unwrap();
580+
let request = Request::try_from(
581+
b"GET http://169.254.169.254/ HTTP/1.0\r\n\
582+
Accept: application/json\r\n\
583+
X-metadata-token-ttl-seconds: -60\r\n\r\n",
584+
None,
585+
)
586+
.unwrap();
584587
let mut expected_response = Response::new(Version::Http10, StatusCode::BadRequest);
585588
expected_response.set_content_type(MediaType::PlainText);
586589
expected_response.set_body(Body::new(
587-
"Invalid header. Reason: Invalid value. Key:X-metadata-token-ttl-seconds; \
588-
Value:application/json"
590+
"Invalid header. Reason: Invalid value. Key:X-metadata-token-ttl-seconds; Value:-60"
589591
.to_string(),
590592
));
591593
let actual_response = convert_to_response(mmds.clone(), request);
592594
assert_eq!(actual_response, expected_response);
593595

594596
// Test PUT requests.
595597
// Unsupported `X-Forwarded-For` header present.
596-
let request_bytes = b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r\n\
597-
X-Forwarded-For: 203.0.113.195\r\n\r\n";
598-
let request = Request::try_from(request_bytes, None).unwrap();
598+
let request = Request::try_from(
599+
b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r\n\
600+
X-Forwarded-For: 203.0.113.195\r\n\r\n",
601+
None,
602+
)
603+
.unwrap();
599604
let mut expected_response = Response::new(Version::Http10, StatusCode::BadRequest);
600605
expected_response.set_content_type(MediaType::PlainText);
601606
expected_response.set_body(Body::new(
@@ -605,9 +610,12 @@ mod tests {
605610
assert_eq!(actual_response, expected_response);
606611

607612
// Test invalid path.
608-
let request_bytes = b"PUT http://169.254.169.254/token HTTP/1.0\r\n\
609-
X-metadata-token-ttl-seconds: 60\r\n\r\n";
610-
let request = Request::try_from(request_bytes, None).unwrap();
613+
let request = Request::try_from(
614+
b"PUT http://169.254.169.254/token HTTP/1.0\r\n\
615+
X-metadata-token-ttl-seconds: 60\r\n\r\n",
616+
None,
617+
)
618+
.unwrap();
611619
let mut expected_response = Response::new(Version::Http10, StatusCode::NotFound);
612620
expected_response.set_content_type(MediaType::PlainText);
613621
expected_response.set_body(Body::new(
@@ -619,62 +627,77 @@ mod tests {
619627
// Test invalid lifetime values for token.
620628
let invalid_values = [MIN_TOKEN_TTL_SECONDS - 1, MAX_TOKEN_TTL_SECONDS + 1];
621629
for invalid_value in invalid_values.iter() {
622-
let request_bytes = format!(
623-
"PUT http://169.254.169.254/latest/api/token \
624-
HTTP/1.0\r\nX-metadata-token-ttl-seconds: {}\r\n\r\n",
625-
invalid_value
626-
);
627-
let request = Request::try_from(request_bytes.as_bytes(), None).unwrap();
630+
#[rustfmt::skip]
631+
let request = Request::try_from(
632+
format!(
633+
"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r\n\
634+
X-metadata-token-ttl-seconds: {invalid_value}\r\n\r\n"
635+
)
636+
.as_bytes(),
637+
None,
638+
)
639+
.unwrap();
628640
let mut expected_response = Response::new(Version::Http10, StatusCode::BadRequest);
629641
expected_response.set_content_type(MediaType::PlainText);
642+
#[rustfmt::skip]
630643
let error_msg = format!(
631-
"Invalid time to live value provided for token: {}. Please provide a value \
632-
between {} and {}.",
633-
invalid_value, MIN_TOKEN_TTL_SECONDS, MAX_TOKEN_TTL_SECONDS
644+
"Invalid time to live value provided for token: {invalid_value}. \
645+
Please provide a value between {MIN_TOKEN_TTL_SECONDS} and {MAX_TOKEN_TTL_SECONDS}.",
634646
);
635647
expected_response.set_body(Body::new(error_msg));
636648
let actual_response = convert_to_response(mmds.clone(), request);
637649
assert_eq!(actual_response, expected_response);
638650
}
639651

640652
// Test no lifetime value provided for token.
641-
let request_bytes = b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r\n\r\n";
642-
let request = Request::try_from(request_bytes, None).unwrap();
653+
let request = Request::try_from(
654+
b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r\n\r\n",
655+
None,
656+
)
657+
.unwrap();
643658
let mut expected_response = Response::new(Version::Http10, StatusCode::BadRequest);
644659
expected_response.set_content_type(MediaType::PlainText);
645660
expected_response.set_body(Body::new(VmmMmdsError::NoTtlProvided.to_string()));
646661
let actual_response = convert_to_response(mmds.clone(), request);
647662
assert_eq!(actual_response, expected_response);
648663

649664
// Test valid PUT.
650-
let request_bytes = b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r\n\
651-
X-metadata-token-ttl-seconds: 60\r\n\r\n";
652-
let request = Request::try_from(request_bytes, None).unwrap();
665+
let request = Request::try_from(
666+
b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r\n\
667+
X-metadata-token-ttl-seconds: 60\r\n\r\n",
668+
None,
669+
)
670+
.unwrap();
653671
let actual_response = convert_to_response(mmds.clone(), request);
654672
assert_eq!(actual_response.status(), StatusCode::OK);
655673
assert_eq!(actual_response.content_type(), MediaType::PlainText);
656674

657675
// Test valid GET.
658676
let valid_token = String::from_utf8(actual_response.body().unwrap().body).unwrap();
659-
let request_bytes = format!(
660-
"GET http://169.254.169.254/ HTTP/1.0\r\nAccept: \
661-
application/json\r\nX-metadata-token: {}\r\n\r\n",
662-
valid_token
677+
#[rustfmt::skip]
678+
let (request, expected_response) = generate_request_and_expected_response(
679+
format!(
680+
"GET http://169.254.169.254/ HTTP/1.0\r\n\
681+
Accept: application/json\r\n\
682+
X-metadata-token: {valid_token}\r\n\r\n",
683+
)
684+
.as_bytes(),
685+
MediaType::ApplicationJson,
663686
);
664-
let request = Request::try_from(request_bytes.as_bytes(), None).unwrap();
665-
let mut expected_response = Response::new(Version::Http10, StatusCode::OK);
666-
let mut body = get_json_data().to_string();
667-
body.retain(|c| !c.is_whitespace());
668-
expected_response.set_body(Body::new(body));
669687
let actual_response = convert_to_response(mmds.clone(), request);
670688
assert_eq!(actual_response, expected_response);
671689

672690
// Test GET request towards unsupported value type.
673-
let request_bytes = format!(
674-
"GET /age HTTP/1.1\r\nX-metadata-token: {}\r\n\r\n",
675-
valid_token
676-
);
677-
let request = Request::try_from(request_bytes.as_bytes(), None).unwrap();
691+
#[rustfmt::skip]
692+
let request = Request::try_from(
693+
format!(
694+
"GET /age HTTP/1.1\r\n\
695+
X-metadata-token: {valid_token}\r\n\r\n",
696+
)
697+
.as_bytes(),
698+
None,
699+
)
700+
.unwrap();
678701
let mut expected_response = Response::new(Version::Http11, StatusCode::NotImplemented);
679702
expected_response.set_content_type(MediaType::PlainText);
680703
let body = "Cannot retrieve value. The value has an unsupported type.".to_string();
@@ -683,11 +706,16 @@ mod tests {
683706
assert_eq!(actual_response, expected_response);
684707

685708
// Test GET request towards invalid resource.
686-
let request_bytes = format!(
687-
"GET http://169.254.169.254/invalid HTTP/1.0\r\nX-metadata-token: {}\r\n\r\n",
688-
valid_token
689-
);
690-
let request = Request::try_from(request_bytes.as_bytes(), None).unwrap();
709+
#[rustfmt::skip]
710+
let request = Request::try_from(
711+
format!(
712+
"GET http://169.254.169.254/invalid HTTP/1.0\r\n\
713+
X-metadata-token: {valid_token}\r\n\r\n",
714+
)
715+
.as_bytes(),
716+
None,
717+
)
718+
.unwrap();
691719
let mut expected_response = Response::new(Version::Http10, StatusCode::NotFound);
692720
expected_response.set_content_type(MediaType::PlainText);
693721
expected_response.set_body(Body::new(
@@ -697,43 +725,41 @@ mod tests {
697725
assert_eq!(actual_response, expected_response);
698726

699727
// Test GET request without token should return Unauthorized status code.
700-
let request_bytes = b"GET http://169.254.169.254/ HTTP/1.0\r\n\r\n";
701-
let request = Request::try_from(request_bytes, None).unwrap();
728+
let request =
729+
Request::try_from(b"GET http://169.254.169.254/ HTTP/1.0\r\n\r\n", None).unwrap();
702730
let mut expected_response = Response::new(Version::Http10, StatusCode::Unauthorized);
703731
expected_response.set_content_type(MediaType::PlainText);
704732
expected_response.set_body(Body::new(VmmMmdsError::NoTokenProvided.to_string()));
705733
let actual_response = convert_to_response(mmds.clone(), request);
706734
assert_eq!(actual_response, expected_response);
707735

708-
// Test GET request with invalid token should return Unauthorized status code.
709-
let request_bytes = b"GET http://169.254.169.254/ HTTP/1.0\r\n\
710-
X-metadata-token: foo\r\n\r\n";
711-
let request = Request::try_from(request_bytes, None).unwrap();
712-
let mut expected_response = Response::new(Version::Http10, StatusCode::Unauthorized);
713-
expected_response.set_content_type(MediaType::PlainText);
714-
expected_response.set_body(Body::new(VmmMmdsError::InvalidToken.to_string()));
715-
let actual_response = convert_to_response(mmds.clone(), request);
716-
assert_eq!(actual_response, expected_response);
717-
718736
// Create a new MMDS token that expires in one second.
719-
let request_bytes = b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r\n\
720-
X-metadata-token-ttl-seconds: 1\r\n\r\n";
721-
let request = Request::try_from(request_bytes, None).unwrap();
737+
let request = Request::try_from(
738+
b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r\n\
739+
X-metadata-token-ttl-seconds: 1\r\n\r\n",
740+
None,
741+
)
742+
.unwrap();
722743
let actual_response = convert_to_response(mmds.clone(), request);
723744
assert_eq!(actual_response.status(), StatusCode::OK);
724745
assert_eq!(actual_response.content_type(), MediaType::PlainText);
725746

726747
// Test GET request with invalid tokens.
727748
// `valid_token` will become invalid after one second, when it expires.
728749
let valid_token = String::from_utf8(actual_response.body().unwrap().body).unwrap();
729-
let invalid_token = "a".repeat(58);
730-
let tokens = [invalid_token, valid_token];
750+
let invalid_token = "INVALID_TOKEN";
751+
let tokens = [invalid_token, &valid_token];
731752
for token in tokens.iter() {
732-
let request_bytes = format!(
733-
"GET http://169.254.169.254/ HTTP/1.0\r\nX-metadata-token: {}\r\n\r\n",
734-
token
735-
);
736-
let request = Request::try_from(request_bytes.as_bytes(), None).unwrap();
753+
#[rustfmt::skip]
754+
let request = Request::try_from(
755+
format!(
756+
"GET http://169.254.169.254/ HTTP/1.0\r\n\
757+
X-metadata-token: {token}\r\n\r\n",
758+
)
759+
.as_bytes(),
760+
None,
761+
)
762+
.unwrap();
737763
let mut expected_response = Response::new(Version::Http10, StatusCode::Unauthorized);
738764
expected_response.set_content_type(MediaType::PlainText);
739765
expected_response.set_body(Body::new(VmmMmdsError::InvalidToken.to_string()));

0 commit comments

Comments
 (0)