blob: 673e20cc477f8c221377389fc0e4afb13198fc48 [file] [log] [blame]
// Copyright 2023 The Cobalt Authors. All Rights Reserved.
//
// 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
//
// http://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.
#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#endif
#include <set>
#include <string>
#include "cobalt/media/base/cval_stats.h"
#include "testing/gtest/include/gtest/gtest.h"
const char kCValnameLatest[] = "Media.SbPlayerCreateTime.Latest";
const char kCValnameAverage[] = "Media.SbPlayerCreateTime.Average";
const char kCValnameMaximum[] = "Media.SbPlayerCreateTime.Maximum";
const char kCValnameMedian[] = "Media.SbPlayerCreateTime.Median";
const char kCValnameMinimum[] = "Media.SbPlayerCreateTime.Minimum";
const char kPipelineIdentifier[] = "test_pipeline";
constexpr int kSleepTimeMs = 50;
namespace cobalt {
namespace media {
namespace {
void sleep_ms(int ms) {
#ifdef _WIN32
Sleep(ms);
#else
usleep(ms);
#endif
}
} // namespace
TEST(MediaCValStatsTest, InitiallyEmpty) {
base::CValManager* cvm = base::CValManager::GetInstance();
EXPECT_TRUE(cvm);
std::set<std::string> cval_names = cvm->GetOrderedCValNames();
std::set<std::string>::size_type size = cval_names.size();
EXPECT_EQ(size, 0);
}
TEST(MediaCValStatsTest, CValStatsCreation) {
base::CValManager* cvm = base::CValManager::GetInstance();
EXPECT_TRUE(cvm);
CValStats cval_stats_;
std::set<std::string> cval_names = cvm->GetOrderedCValNames();
std::set<std::string>::size_type size = cval_names.size();
EXPECT_EQ(size, 15);
}
TEST(MediaCValStatsTest, NothingRecorded) {
base::CValManager* cvm = base::CValManager::GetInstance();
EXPECT_TRUE(cvm);
CValStats cval_stats_;
cval_stats_.StartTimer(MediaTiming::SbPlayerCreate, kPipelineIdentifier);
sleep_ms(kSleepTimeMs);
cval_stats_.StopTimer(MediaTiming::SbPlayerCreate, kPipelineIdentifier);
base::Optional<std::string> result =
cvm->GetValueAsPrettyString(kCValnameLatest);
EXPECT_TRUE(result);
EXPECT_EQ(*result, "0");
}
TEST(MediaCValStatsTest, EnableRecording) {
base::CValManager* cvm = base::CValManager::GetInstance();
EXPECT_TRUE(cvm);
CValStats cval_stats_;
cval_stats_.Enable(true);
cval_stats_.StartTimer(MediaTiming::SbPlayerCreate, kPipelineIdentifier);
sleep_ms(kSleepTimeMs);
cval_stats_.StopTimer(MediaTiming::SbPlayerCreate, kPipelineIdentifier);
base::Optional<std::string> result =
cvm->GetValueAsPrettyString(kCValnameLatest);
EXPECT_TRUE(result);
EXPECT_NE(*result, "0");
result = cvm->GetValueAsPrettyString(kCValnameMinimum);
EXPECT_TRUE(result);
EXPECT_NE(*result, "0");
result = cvm->GetValueAsPrettyString(kCValnameMaximum);
EXPECT_TRUE(result);
EXPECT_NE(*result, "0");
}
TEST(MediaCValStatsTest, DontGenerateHistoricalData) {
base::CValManager* cvm = base::CValManager::GetInstance();
EXPECT_TRUE(cvm);
CValStats cval_stats_;
cval_stats_.Enable(true);
for (int i = 0; i < kMediaDefaultMaxSamplesBeforeCalculation - 1; i++) {
cval_stats_.StartTimer(MediaTiming::SbPlayerCreate, kPipelineIdentifier);
sleep_ms(kSleepTimeMs);
cval_stats_.StopTimer(MediaTiming::SbPlayerCreate, kPipelineIdentifier);
}
base::Optional<std::string> result =
cvm->GetValueAsPrettyString(kCValnameLatest);
EXPECT_TRUE(result);
EXPECT_NE(*result, "0");
result = cvm->GetValueAsPrettyString(kCValnameAverage);
EXPECT_TRUE(result);
EXPECT_EQ(*result, "0");
result = cvm->GetValueAsPrettyString(kCValnameMedian);
EXPECT_TRUE(result);
EXPECT_EQ(*result, "0");
}
TEST(MediaCValStatsTest, GenerateHistoricalData) {
base::CValManager* cvm = base::CValManager::GetInstance();
EXPECT_TRUE(cvm);
CValStats cval_stats_;
cval_stats_.Enable(true);
for (int i = 0; i < kMediaDefaultMaxSamplesBeforeCalculation; i++) {
cval_stats_.StartTimer(MediaTiming::SbPlayerCreate, kPipelineIdentifier);
sleep_ms(kSleepTimeMs);
cval_stats_.StopTimer(MediaTiming::SbPlayerCreate, kPipelineIdentifier);
}
base::Optional<std::string> result =
cvm->GetValueAsPrettyString(kCValnameAverage);
EXPECT_TRUE(result);
EXPECT_NE(*result, "0");
result = cvm->GetValueAsPrettyString(kCValnameMedian);
EXPECT_TRUE(result);
EXPECT_NE(*result, "0");
}
TEST(MediaCValStatsTest, CircularBufferDontWrapIndex) {
base::CValManager* cvm = base::CValManager::GetInstance();
EXPECT_TRUE(cvm);
CValStats cval_stats_;
cval_stats_.Enable(true);
for (int i = 0; i < kMaxSamples - 1; i++) {
cval_stats_.StartTimer(MediaTiming::SbPlayerCreate, kPipelineIdentifier);
cval_stats_.StopTimer(MediaTiming::SbPlayerCreate, kPipelineIdentifier);
}
EXPECT_EQ(cval_stats_.GetBufferIndexForTest(), 99);
}
TEST(MediaCValStatsTest, CircularBufferWrapIndex) {
base::CValManager* cvm = base::CValManager::GetInstance();
EXPECT_TRUE(cvm);
CValStats cval_stats_;
cval_stats_.Enable(true);
for (int i = 0; i < kMaxSamples + 5; i++) {
cval_stats_.StartTimer(MediaTiming::SbPlayerCreate, kPipelineIdentifier);
cval_stats_.StopTimer(MediaTiming::SbPlayerCreate, kPipelineIdentifier);
}
EXPECT_EQ(cval_stats_.GetBufferIndexForTest(), 5);
}
} // namespace media
} // namespace cobalt