blob: 5d91b327d0092e8a5a7e4a5eb6c1a2c78bdbac05 [file] [log] [blame]
// Copyright 2019 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.
// Tests for the generated View class for a LogFileStatus from
// span_se_log_file_status.emb.
#include <stdint.h>
#include <vector>
#include "gtest/gtest.h"
#include "testdata/golden/span_se_log_file_status.emb.h"
namespace emboss {
namespace test {
namespace {
// A simple, static LogFileStatus. There are technically no invalid
// LogFileStatuses as long as there are at least 24 bytes to read.
static const ::std::uint8_t kLogFileStatus[24] = {
0x01, 0x02, 0x03, 0x04, // 0:4 UInt file_state
'A', 'B', 'C', 'D', // 4:16 UInt:8[12] file_name
'E', 'F', 'G', 'H', // 4:16 UInt:8[12] file_name
'I', 'J', 'K', 'L', // 4:16 UInt:8[12] file_name
0x05, 0x06, 0x07, 0x08, // 16:20 UInt file_size_kb
0x09, 0x0a, 0x0b, 0x0c, // 20:24 UInt media
};
// LogFileStatusView constructor compiles and runs without crashing.
TEST(LogFileStatusView, ConstructorRuns) {
LogFileStatusView(kLogFileStatus, sizeof kLogFileStatus);
}
// LogFileStatusView::SizeInBytes() returns the expected value.
TEST(LogFileStatusView, SizeIsCorrect) {
EXPECT_EQ(24U, LogFileStatusView::SizeInBytes());
}
// LogFileStatusView's atomic field accessors work.
TEST(LogFileStatusView, AtomicFieldAccessorsWork) {
auto view = LogFileStatusView(kLogFileStatus, sizeof kLogFileStatus);
EXPECT_EQ(0x04030201U, view.file_state().Read());
EXPECT_EQ(0x08070605U, view.file_size_kb().Read());
EXPECT_EQ(0x0c0b0a09U, view.media().Read());
}
// LogFileStatusView's array field accessor works.
TEST(LogFileStatusView, ArrayFieldAccessor) {
auto view = LogFileStatusView(kLogFileStatus, sizeof kLogFileStatus);
EXPECT_EQ('A', view.file_name()[0].Read());
EXPECT_EQ('L', view.file_name()[11].Read());
}
// The "Ok()" method works.
TEST(LogFileStatusView, Ok) {
auto view = LogFileStatusView(kLogFileStatus, sizeof kLogFileStatus);
EXPECT_TRUE(view.Ok());
view = LogFileStatusView(kLogFileStatus, sizeof kLogFileStatus - 1);
EXPECT_FALSE(view.Ok());
::std::vector</**/ ::std::uint8_t> bigger_than_necessary(
sizeof kLogFileStatus + 1);
view = LogFileStatusView(&bigger_than_necessary[0],
bigger_than_necessary.size());
EXPECT_TRUE(view.Ok());
}
TEST(LogFileStatusView, Writing) {
::std::uint8_t buffer[sizeof kLogFileStatus] = {0};
auto writer = LogFileStatusWriter(buffer, sizeof buffer);
writer.file_state().Write(0x04030201);
writer.file_size_kb().Write(0x08070605);
writer.media().Write(0x0c0b0a09);
// TODO(bolms): Add a Count method, that returns the element count instead of
// the byte count. (Not a problem here, since file_name's elements are each
// one byte anyway.)
for (::std::size_t i = 0; i < writer.file_name().SizeInBytes(); ++i) {
writer.file_name()[i].Write('A' + i);
}
EXPECT_EQ(::std::vector</**/ ::std::uint8_t>(
kLogFileStatus, kLogFileStatus + sizeof kLogFileStatus),
::std::vector</**/ ::std::uint8_t>(buffer, buffer + sizeof buffer));
}
} // namespace
} // namespace test
} // namespace emboss