summaryrefslogtreecommitdiff
path: root/lib/xray/tests/unit/profile_collector_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/xray/tests/unit/profile_collector_test.cc')
-rw-r--r--lib/xray/tests/unit/profile_collector_test.cc36
1 files changed, 34 insertions, 2 deletions
diff --git a/lib/xray/tests/unit/profile_collector_test.cc b/lib/xray/tests/unit/profile_collector_test.cc
index b7dbe567312a0..67049af2cd5f9 100644
--- a/lib/xray/tests/unit/profile_collector_test.cc
+++ b/lib/xray/tests/unit/profile_collector_test.cc
@@ -15,6 +15,8 @@
#include "xray_profile_collector.h"
#include "xray_profiling_flags.h"
#include <cstdint>
+#include <cstring>
+#include <memory>
#include <thread>
#include <utility>
#include <vector>
@@ -24,6 +26,29 @@ namespace {
static constexpr auto kHeaderSize = 16u;
+constexpr uptr ExpectedProfilingVersion = 0x20180424;
+
+struct ExpectedProfilingFileHeader {
+ const u64 MagicBytes = 0x7872617970726f66; // Identifier for XRay profiling
+ // files 'xrayprof' in hex.
+ const u64 Version = ExpectedProfilingVersion;
+ u64 Timestamp = 0;
+ u64 PID = 0;
+};
+
+void ValidateFileHeaderBlock(XRayBuffer B) {
+ ASSERT_NE(static_cast<const void *>(B.Data), nullptr);
+ ASSERT_EQ(B.Size, sizeof(ExpectedProfilingFileHeader));
+ typename std::aligned_storage<sizeof(ExpectedProfilingFileHeader)>::type
+ FileHeaderStorage;
+ ExpectedProfilingFileHeader ExpectedHeader;
+ std::memcpy(&FileHeaderStorage, B.Data, B.Size);
+ auto &FileHeader =
+ *reinterpret_cast<ExpectedProfilingFileHeader *>(&FileHeaderStorage);
+ ASSERT_EQ(ExpectedHeader.MagicBytes, FileHeader.MagicBytes);
+ ASSERT_EQ(ExpectedHeader.Version, FileHeader.Version);
+}
+
void ValidateBlock(XRayBuffer B) {
profilingFlags()->setDefaults();
ASSERT_NE(static_cast<const void *>(B.Data), nullptr);
@@ -107,9 +132,13 @@ TEST(profileCollectorServiceTest, PostSerializeCollect) {
// Then we serialize the data.
profileCollectorService::serialize();
- // Then we go through a single buffer to see whether we're getting the data we
- // expect.
+ // Then we go through two buffers to see whether we're getting the data we
+ // expect. The first block must always be as large as a file header, which
+ // will have a fixed size.
auto B = profileCollectorService::nextBuffer({nullptr, 0});
+ ValidateFileHeaderBlock(B);
+
+ B = profileCollectorService::nextBuffer(B);
ValidateBlock(B);
u32 BlockSize;
u32 BlockNum;
@@ -169,6 +198,9 @@ TEST(profileCollectorServiceTest, PostSerializeCollectMultipleThread) {
// Ensure that we see two buffers.
auto B = profileCollectorService::nextBuffer({nullptr, 0});
+ ValidateFileHeaderBlock(B);
+
+ B = profileCollectorService::nextBuffer(B);
ValidateBlock(B);
B = profileCollectorService::nextBuffer(B);