16154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal/* 26154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal * Copyright (C) 2016, The Android Open Source Project 36154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal * 46154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal * Licensed under the Apache License, Version 2.0 (the "License"); 56154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal * you may not use this file except in compliance with the License. 66154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal * You may obtain a copy of the License at 76154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal * 86154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal * http://www.apache.org/licenses/LICENSE-2.0 96154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal * 106154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal * Unless required by applicable law or agreed to in writing, software 116154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal * distributed under the License is distributed on an "AS IS" BASIS, 126154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal * See the License for the specific language governing permissions and 146154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal * limitations under the License. 156154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal */ 166154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 176154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal#include <cstddef> 186154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal#include <type_traits> 196154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 206154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal#include "gtest/gtest.h" 216154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 226154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal#include "wifilogd/protocol.h" 236154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 246154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawalnamespace android { 256154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawalnamespace wifilogd { 266154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 276154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal// The protocol tests aim to provide friction against changes that 286154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal// break byte-stream compatibility. Byte-stream compatibility is 296154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal// important for two reasons: 306154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal// 1. We need to support non-C++ clients. Those clients may use bindings 316154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal// that are implemented in their own language, rather than using a 326154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal// C or C++ client library. 336154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal// 2. We need to maintain compatibility with older clients talking to 346154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal// newer versions of wifilogd. 356154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 366154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawalTEST(ProtocolTest, AsciiMessageLayoutIsUnchanged) { 376154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal using protocol::AsciiMessage; 386154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal ASSERT_TRUE(std::is_standard_layout<AsciiMessage>::value); 396154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 406154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(0U, offsetof(AsciiMessage, data_len)); 416154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(2U, sizeof(AsciiMessage::data_len)); 426154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 436154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(2U, offsetof(AsciiMessage, tag_len)); 446154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(1U, sizeof(AsciiMessage::tag_len)); 456154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 466154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(3U, offsetof(AsciiMessage, severity)); 476154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(1U, sizeof(AsciiMessage::severity)); 486154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 496154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(4U, sizeof(AsciiMessage)); 506154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal} 516154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 526154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawalTEST(ProtocolTest, CommandLayoutIsUnchanged) { 536154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal using protocol::Command; 546154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal ASSERT_TRUE(std::is_standard_layout<Command>::value); 556154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 566154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(0U, offsetof(Command, src_boottime_nsec)); 576154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(8U, sizeof(Command::src_boottime_nsec)); 586154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 596154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(8U, offsetof(Command, sequence_num)); 606154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(2U, sizeof(Command::sequence_num)); 616154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 626154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(10U, offsetof(Command, opcode)); 636154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(2U, sizeof(Command::opcode)); 646154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 656154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(12U, offsetof(Command, payload_len)); 666154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(2U, sizeof(Command::payload_len)); 676154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 686154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal // The |reserved| field fills out Command, in place of padding that 696154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal // would otherwise be added by the compiler. 706154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(14U, offsetof(Command, reserved)); 716154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(2U, sizeof(Command::reserved)); 726154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 736154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(16U, sizeof(Command)); 746154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal} 756154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 766154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawalTEST(ProtocolTest, MaxMessageSizeHasNotShrunk) { 776154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_GE(protocol::kMaxMessageSize, 4096U); 786154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal} 796154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 806154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawalTEST(ProtocolTest, MessageSeveritiesAreUnchanged) { 816154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal using protocol::MessageSeverity; 826154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(0U, static_cast<uint8_t>(MessageSeverity::kError)); 836154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(1U, static_cast<uint8_t>(MessageSeverity::kWarning)); 846154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(2U, static_cast<uint8_t>(MessageSeverity::kInformational)); 856154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(3U, static_cast<uint8_t>(MessageSeverity::kTrace)); 866154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(4U, static_cast<uint8_t>(MessageSeverity::kDump)); 876154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal} 886154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 896154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawalTEST(ProtocolTest, OpcodesAreUnchanged) { 906154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal using protocol::Opcode; 916154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(2U, sizeof(Opcode)); 926154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal EXPECT_EQ(0U, static_cast<uint16_t>(Opcode::kWriteAsciiMessage)); 93fd08064ec7ca120b3501c341c8dfde9fdd757316mukesh agrawal EXPECT_EQ(0x20U, static_cast<uint16_t>(Opcode::kDumpBuffers)); 946154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal} 956154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal 966154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal} // namespace wifilogd 976154ce7b95f2e77ec3e9c02d48746e592dcdcf54mukesh agrawal} // namespace android 98