/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifdef MOZ_GECKO_PROFILER # include "ProfileBuffer.h" # include "mozilla/PowerOfTwo.h" # include "mozilla/ProfileBufferChunkManagerWithLocalLimit.h" # include "mozilla/ProfileChunkedBuffer.h" # include "gtest/gtest.h" // Make sure we can record one entry and read it TEST(ThreadProfile, InsertOneEntry) { mozilla::ProfileBufferChunkManagerWithLocalLimit chunkManager( 2 * (1 + uint32_t(sizeof(ProfileBufferEntry))) * 4, 2 * (1 + uint32_t(sizeof(ProfileBufferEntry)))); mozilla::ProfileChunkedBuffer profileChunkedBuffer( mozilla::ProfileChunkedBuffer::ThreadSafety::WithMutex, chunkManager); auto pb = mozilla::MakeUnique(profileChunkedBuffer); pb->AddEntry(ProfileBufferEntry::Time(123.1)); ProfileBufferEntry entry = pb->GetEntry(pb->BufferRangeStart()); ASSERT_TRUE(entry.IsTime()); ASSERT_EQ(123.1, entry.GetDouble()); } // See if we can insert some entries TEST(ThreadProfile, InsertEntriesNoWrap) { mozilla::ProfileBufferChunkManagerWithLocalLimit chunkManager( 100 * (1 + uint32_t(sizeof(ProfileBufferEntry))), 100 * (1 + uint32_t(sizeof(ProfileBufferEntry))) / 4); mozilla::ProfileChunkedBuffer profileChunkedBuffer( mozilla::ProfileChunkedBuffer::ThreadSafety::WithMutex, chunkManager); auto pb = mozilla::MakeUnique(profileChunkedBuffer); const int test_size = 50; for (int i = 0; i < test_size; i++) { pb->AddEntry(ProfileBufferEntry::Time(i)); } int times = 0; uint64_t readPos = pb->BufferRangeStart(); while (readPos != pb->BufferRangeEnd()) { ProfileBufferEntry entry = pb->GetEntry(readPos); readPos++; if (entry.GetKind() == ProfileBufferEntry::Kind::INVALID) { continue; } ASSERT_TRUE(entry.IsTime()); ASSERT_EQ(times, entry.GetDouble()); times++; } ASSERT_EQ(test_size, times); } #endif // MOZ_GECKO_PROFILER