1 // Copyright 2019 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 // Tests for the generated View class for a LogFileStatus from
16 // span_se_log_file_status.emb.
17 #include <stdint.h>
18
19 #include <vector>
20
21 #include "gtest/gtest.h"
22 #include "testdata/golden/span_se_log_file_status.emb.h"
23
24 namespace emboss {
25 namespace test {
26 namespace {
27
28 // A simple, static LogFileStatus. There are technically no invalid
29 // LogFileStatuses as long as there are at least 24 bytes to read.
30 static const ::std::uint8_t kLogFileStatus[24] = {
31 0x01, 0x02, 0x03, 0x04, // 0:4 UInt file_state
32 'A', 'B', 'C', 'D', // 4:16 UInt:8[12] file_name
33 'E', 'F', 'G', 'H', // 4:16 UInt:8[12] file_name
34 'I', 'J', 'K', 'L', // 4:16 UInt:8[12] file_name
35 0x05, 0x06, 0x07, 0x08, // 16:20 UInt file_size_kb
36 0x09, 0x0a, 0x0b, 0x0c, // 20:24 UInt media
37 };
38
39 // LogFileStatusView constructor compiles and runs without crashing.
TEST(LogFileStatusView,ConstructorRuns)40 TEST(LogFileStatusView, ConstructorRuns) {
41 LogFileStatusView(kLogFileStatus, sizeof kLogFileStatus);
42 }
43
44 // LogFileStatusView::SizeInBytes() returns the expected value.
TEST(LogFileStatusView,SizeIsCorrect)45 TEST(LogFileStatusView, SizeIsCorrect) {
46 EXPECT_EQ(24U, LogFileStatusView::SizeInBytes());
47 }
48
49 // LogFileStatusView's atomic field accessors work.
TEST(LogFileStatusView,AtomicFieldAccessorsWork)50 TEST(LogFileStatusView, AtomicFieldAccessorsWork) {
51 auto view = LogFileStatusView(kLogFileStatus, sizeof kLogFileStatus);
52 EXPECT_EQ(0x04030201U, view.file_state().Read());
53 EXPECT_EQ(0x08070605U, view.file_size_kb().Read());
54 EXPECT_EQ(0x0c0b0a09U, view.media().Read());
55 }
56
57 // LogFileStatusView's array field accessor works.
TEST(LogFileStatusView,ArrayFieldAccessor)58 TEST(LogFileStatusView, ArrayFieldAccessor) {
59 auto view = LogFileStatusView(kLogFileStatus, sizeof kLogFileStatus);
60 EXPECT_EQ('A', view.file_name()[0].Read());
61 EXPECT_EQ('L', view.file_name()[11].Read());
62 }
63
64 // The "Ok()" method works.
TEST(LogFileStatusView,Ok)65 TEST(LogFileStatusView, Ok) {
66 auto view = LogFileStatusView(kLogFileStatus, sizeof kLogFileStatus);
67 EXPECT_TRUE(view.Ok());
68 view = LogFileStatusView(kLogFileStatus, sizeof kLogFileStatus - 1);
69 EXPECT_FALSE(view.Ok());
70 ::std::vector</**/ ::std::uint8_t> bigger_than_necessary(
71 sizeof kLogFileStatus + 1);
72 view = LogFileStatusView(&bigger_than_necessary[0],
73 bigger_than_necessary.size());
74 EXPECT_TRUE(view.Ok());
75 }
76
TEST(LogFileStatusView,Writing)77 TEST(LogFileStatusView, Writing) {
78 ::std::uint8_t buffer[sizeof kLogFileStatus] = {0};
79 auto writer = LogFileStatusWriter(buffer, sizeof buffer);
80 writer.file_state().Write(0x04030201);
81 writer.file_size_kb().Write(0x08070605);
82 writer.media().Write(0x0c0b0a09);
83 // TODO(bolms): Add a Count method, that returns the element count instead of
84 // the byte count. (Not a problem here, since file_name's elements are each
85 // one byte anyway.)
86 for (::std::size_t i = 0; i < writer.file_name().SizeInBytes(); ++i) {
87 writer.file_name()[i].Write('A' + i);
88 }
89 EXPECT_EQ(::std::vector</**/ ::std::uint8_t>(
90 kLogFileStatus, kLogFileStatus + sizeof kLogFileStatus),
91 ::std::vector</**/ ::std::uint8_t>(buffer, buffer + sizeof buffer));
92 }
93
94 } // namespace
95 } // namespace test
96 } // namespace emboss
97