Files
nearby/internal/proto/analytics/connections_log_test.cc
2025-07-24 09:34:17 -07:00

125 lines
4.1 KiB
C++

// Copyright 2020 Google LLC
//
// Licensed 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
//
// https://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.
// #include "logs/proto/location/nearby/nearby_client_log.proto.h"
#include "google/protobuf/descriptor.h"
#include "gtest/gtest.h"
#include "internal/platform/logging.h"
#include "internal/proto/analytics/connections_log.pb.h"
#include "proto/connections_enums.pb.h"
namespace nearby {
namespace analytics {
namespace proto {
namespace {
using G3ConnectionsLog = ::location::nearby::analytics::proto::ConnectionsLog;
using P3ConnectionsLog = ::location::nearby::analytics::proto::ConnectionsLog;
using ::proto2::Descriptor;
using ::proto2::FieldDescriptor;
// Forward declaration.
bool Compare(const Descriptor* desc1, const Descriptor* desc2);
// Compares the two field descriptors and return false if name, number, label,
// or type is different.
bool Compare(const FieldDescriptor* field1, const FieldDescriptor* field2) {
if (field1->name() != field2->name()) {
LOG(WARNING) << "Field name diff: " << field1->name() << " <=> "
<< field2->name();
return false;
}
if (field1->number() != field2->number()) {
LOG(WARNING) << "Field " << field1->name()
<< " number diff: " << field1->number() << " <=> "
<< field2->number();
return false;
}
if (field1->label() != field2->label()) {
LOG(WARNING) << "Field " << field1->name()
<< " label diff: " << field1->label() << " <=> "
<< field2->label();
return false;
}
bool bRet = false;
if (field1->type() != field2->type()) {
LOG(WARNING) << "Field " << field1->name()
<< " type diff: " << field1->type() << " <=> "
<< field2->type();
return bRet;
} else if (field1->type() == FieldDescriptor::TYPE_MESSAGE) {
const Descriptor* msg1 = field1->message_type();
const Descriptor* msg2 = field2->message_type();
bRet = Compare(msg1, msg2);
} else {
bRet = true;
}
return bRet;
}
// Compares the two descriptors and return false immediately if different.
bool Compare(const Descriptor* desc1, const Descriptor* desc2) {
LOG(INFO) << "Descriptor1 full name: " << desc1->full_name() << " <=> "
<< desc2->full_name();
for (int i = 0; i < desc1->field_count(); ++i) {
const FieldDescriptor* field1 = desc1->field(i);
const FieldDescriptor* field2 = desc2->FindFieldByName(field1->name());
bool bRet = false;
if (field2) {
bRet = Compare(field1, field2);
} else {
LOG(ERROR) << "Descriptor1 full name: " << desc1->full_name()
<< "=> Extra field1 name=" << field1->name()
<< ", number=" << field1->number()
<< ", label=" << field1->label()
<< ", type=" << field1->type();
}
if (!bRet) {
return false;
}
}
for (int i = 0; i < desc2->field_count(); ++i) {
const FieldDescriptor* field2 = desc2->field(i);
const FieldDescriptor* field1 = desc1->FindFieldByName(field2->name());
if (!field1) {
LOG(ERROR) << "Descriptor2 full name: " << desc2->full_name()
<< "=> Extra field2 name=" << field2->name()
<< ", number=" << field2->number()
<< ", label=" << field2->label()
<< ", type=" << field2->type();
return false;
}
}
return true;
}
TEST(ConnectionsLogTest, TwoMessagesAreIdentical) {
const proto2::Descriptor* descriptor1 = G3ConnectionsLog::descriptor();
const proto2::Descriptor* descriptor2 = P3ConnectionsLog::descriptor();
EXPECT_TRUE(Compare(descriptor1, descriptor2));
}
} // namespace
} // namespace proto
} // namespace analytics
} // namespace nearby