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