Skip to content

Commit

Permalink
Add test to validate StartBertRequest parameters.make smoke_test publ…
Browse files Browse the repository at this point in the history
…ic for all platforms.adding the interfaces as part of interface name.Fix smoke test dependency.
  • Loading branch information
smolkaj authored and bibhuprasad committed Oct 23, 2024
1 parent b2401c9 commit 0fc5d64
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 34 deletions.
4 changes: 2 additions & 2 deletions tests/forwarding/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ cc_library(
testonly = True,
srcs = ["smoke_test.cc"],
hdrs = ["smoke_test.h"],
visibility = ["//platforms/networking/gpins/testing/blackbox/p4:__pkg__"],
visibility = ["//visibility:public"],
deps = [
":p4_blackbox_fixture",
":test_data",
Expand All @@ -93,7 +93,7 @@ cc_library(
"//sai_p4/instantiations/google:sai_p4info_cc",
"//sai_p4/instantiations/google:sai_pd_cc_proto",
"//thinkit:mirror_testbed_fixture",
"@com_google_googletest//:gtest_main",
"@com_google_googletest//:gtest",
],
alwayslink = True,
)
Expand Down
2 changes: 2 additions & 0 deletions tests/gnoi/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,13 @@ cc_library(
],
deps = [
"//gutil:status_matchers",
"//gutil:testing",
"//thinkit:mirror_testbed_fixture",
"@com_github_gnoi//diag:diag_cc_proto",
"@com_github_google_glog//:glog",
"@com_github_grpc_grpc//:grpc++",
"@com_google_absl//absl/strings",
"@com_google_absl//absl/time",
"@com_google_googletest//:gtest",
"@com_google_protobuf//:protobuf",
],
Expand Down
128 changes: 96 additions & 32 deletions tests/gnoi/bert_tests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,54 +14,118 @@

#include "tests/gnoi/bert_tests.h"

#include "absl/strings/str_cat.h"
#include "absl/strings/substitute.h"
#include "absl/time/clock.h"
#include "absl/time/time.h"
#include "diag/diag.pb.h"
#include "glog/logging.h"
#include "google/protobuf/text_format.h"
#include "gtest/gtest.h"
#include "gutil/status_matchers.h"
#include "gutil/testing.h"

namespace bert {

// Test StartBERT with test duration longer than maximum allowed duration.
TEST_P(BertTest, StartBertFailsIfTestDurationTooLong) {
using ::testing::HasSubstr;

// Test StartBERT with invalid request parameters.
TEST_P(BertTest, StartBertFailsIfRequestParametersInvalid) {
thinkit::Switch& sut = GetMirrorTestbed().Sut();
ASSERT_OK_AND_ASSIGN(auto sut_gnoi_diag_stub, sut.CreateGnoiDiagStub());

// Set BERT test duration to more than 24 hours: (24 hours + 1 sec).
constexpr uint32_t kTesDurationInSecs = (60 * 60 * 24) + 1;
// TODO (b/182417612) : Select one admin state "up" port.
gnoi::diag::StartBERTRequest valid_request =
gutil::ParseProtoOrDie<gnoi::diag::StartBERTRequest>(R"PROTO(
bert_operation_id: "OpId-1"
per_port_requests {
interface {
origin: "openconfig"
elem { name: "interfaces" }
elem {
name: "interface"
key { key: "name" value: "Ethernet0" }
}
}
prbs_polynomial: PRBS_POLYNOMIAL_PRBS23
test_duration_in_secs: 600
}
)PROTO");
// Set a unique BERT operation id using current time.
valid_request.set_bert_operation_id(
absl::StrCat("OpId-", absl::ToUnixMillis(absl::Now())));
gnoi::diag::StartBERTResponse response;

// TODO (ashishksingh) : Before using the "Ethernet0", run sanity test to
// ensure the ports are oper-state "up" on the SUT switch.
const std::string kStartBertRequest =
absl::Substitute(R"PROTO(
bert_operation_id: "OpId-1"
per_port_requests {
interface {
origin: "openconfig"
elem {
name: "interface"
key { key: "name" value: "Ethernet0" }
}
}
prbs_polynomial: PRBS_POLYNOMIAL_PRBS23
test_duration_in_secs: $0
}
)PROTO",
kTesDurationInSecs);
// Case 1: BERT test duration is 0 secs.
{
gnoi::diag::StartBERTRequest too_short_time_request = valid_request;
too_short_time_request.mutable_per_port_requests(0)
->set_test_duration_in_secs(0);
grpc::ClientContext context;
LOG(INFO) << "Sending StartBERT request: "
<< too_short_time_request.ShortDebugString();
EXPECT_THAT(gutil::GrpcStatusToAbslStatus(sut_gnoi_diag_stub->StartBERT(
&context, too_short_time_request, &response)),
gutil::StatusIs(absl::StatusCode::kInvalidArgument,
HasSubstr("is too short")));
}

gnoi::diag::StartBERTRequest request;
ASSERT_TRUE(google::protobuf::TextFormat::ParseFromString(kStartBertRequest,
&request));
// Case 2: BERT test duration is more than 24 hours: (24 hours + 1 sec).
{
gnoi::diag::StartBERTRequest too_long_time_request = valid_request;
too_long_time_request.mutable_per_port_requests(0)
->set_test_duration_in_secs(
ToInt64Seconds(absl::Hours(24) + absl::Seconds(1)));
response.Clear();
grpc::ClientContext context;
LOG(INFO) << "Sending StartBERT request: "
<< too_long_time_request.ShortDebugString();
EXPECT_THAT(gutil::GrpcStatusToAbslStatus(sut_gnoi_diag_stub->StartBERT(
&context, too_long_time_request, &response)),
gutil::StatusIs(absl::StatusCode::kInvalidArgument,
HasSubstr("is too long")));
}

gnoi::diag::StartBERTResponse response;
grpc::ClientContext context;
LOG(INFO) << "Sending StartBERT request: " << request.ShortDebugString();
// Case 3: Invalid PRBS polynomial order.
{
gnoi::diag::StartBERTRequest unset_prbs_polynomial_request = valid_request;
unset_prbs_polynomial_request.mutable_per_port_requests(0)
->clear_prbs_polynomial();
response.Clear();
grpc::ClientContext context;
LOG(INFO) << "Sending StartBERT request: "
<< unset_prbs_polynomial_request.ShortDebugString();
EXPECT_THAT(gutil::GrpcStatusToAbslStatus(sut_gnoi_diag_stub->StartBERT(
&context, unset_prbs_polynomial_request, &response)),
gutil::StatusIs(absl::StatusCode::kInvalidArgument,
HasSubstr("PRBS polynomial is not set")));
}

EXPECT_THAT(gutil::GrpcStatusToAbslStatus(
sut_gnoi_diag_stub->StartBERT(&context, request, &response)),
gutil::StatusIs(absl::StatusCode::kInvalidArgument,
testing::HasSubstr("too long")));
// Case 4: Invalid interface.
{
gnoi::diag::StartBERTRequest invalid_interface_request = valid_request;
gnoi::types::Path invalid_interface =
gutil::ParseProtoOrDie<gnoi::types::Path>(
R"PROTO(
origin: "openconfig"
elem { name: "interfaces" }
elem {
name: "interface"
key { key: "name" value: "InvalidPort" }
}
)PROTO");
invalid_interface_request.mutable_per_port_requests(0)
->mutable_interface()
->CopyFrom(invalid_interface);
response.Clear();
grpc::ClientContext context;
LOG(INFO) << "Sending StartBERT request: "
<< invalid_interface_request.ShortDebugString();
EXPECT_THAT(gutil::GrpcStatusToAbslStatus(sut_gnoi_diag_stub->StartBERT(
&context, invalid_interface_request, &response)),
gutil::StatusIs(absl::StatusCode::kInvalidArgument,
HasSubstr("Interface is invalid")));
}
}

} // namespace bert

0 comments on commit 0fc5d64

Please sign in to comment.