blob: 16494ca77e4ea6846db7c7e71c4524f145870ea1 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "extensions/browser/api/feedback_private/log_source_access_manager.h"
#include "base/bind.h"
#include "base/run_loop.h"
#include "base/strings/stringprintf.h"
#include "extensions/browser/api/feedback_private/feedback_private_api_unittest_base_chromeos.h"
namespace extensions {
namespace {
using api::feedback_private::LOG_SOURCE_MESSAGES;
using api::feedback_private::LOG_SOURCE_UILATEST;
using api::feedback_private::ReadLogSourceResult;
using api::feedback_private::ReadLogSourceParams;
constexpr int kMaxReadersPerSource =
LogSourceAccessManager::kMaxReadersPerSource;
void DummyCallback(std::unique_ptr<ReadLogSourceResult>) {}
} // namespace
using LogSourceAccessManagerTest = FeedbackPrivateApiUnittestBase;
TEST_F(LogSourceAccessManagerTest, MaxNumberOfOpenLogSourcesSameExtension) {
const base::TimeDelta timeout(base::TimeDelta::FromMilliseconds(0));
LogSourceAccessManager::SetRateLimitingTimeoutForTesting(&timeout);
LogSourceAccessManager manager(browser_context());
const std::string extension_id = "extension";
// Open 10 readers for LOG_SOURCE_MESSAGES from the same extension.
ReadLogSourceParams messages_params;
messages_params.incremental = false;
messages_params.source = LOG_SOURCE_MESSAGES;
for (size_t i = 0; i < kMaxReadersPerSource; ++i) {
EXPECT_TRUE(manager.FetchFromSource(messages_params, extension_id,
base::BindOnce(&DummyCallback)))
<< base::StringPrintf("Unable to read from log source with i=%zu", i);
EXPECT_EQ(i + 1,
manager.GetNumActiveResourcesForSource(LOG_SOURCE_MESSAGES));
}
EXPECT_EQ(0U, manager.GetNumActiveResourcesForSource(LOG_SOURCE_UILATEST));
// Open 10 readers for LOG_SOURCE_UILATEST from the same extension.
ReadLogSourceParams ui_latest_params;
ui_latest_params.incremental = false;
ui_latest_params.source = LOG_SOURCE_UILATEST;
for (size_t i = 0; i < kMaxReadersPerSource; ++i) {
EXPECT_TRUE(manager.FetchFromSource(ui_latest_params, extension_id,
base::BindOnce(&DummyCallback)))
<< base::StringPrintf("Unable to read from log source with i=%zu", i);
EXPECT_EQ(i + 1,
manager.GetNumActiveResourcesForSource(LOG_SOURCE_UILATEST));
}
EXPECT_EQ(10U, manager.GetNumActiveResourcesForSource(LOG_SOURCE_MESSAGES));
// Can't open more readers for LOG_SOURCE_MESSAGES or LOG_SOURCE_UILATEST.
EXPECT_FALSE(manager.FetchFromSource(messages_params, extension_id,
base::BindOnce(&DummyCallback)));
EXPECT_FALSE(manager.FetchFromSource(ui_latest_params, extension_id,
base::BindOnce(&DummyCallback)));
EXPECT_EQ(10U, manager.GetNumActiveResourcesForSource(LOG_SOURCE_MESSAGES));
EXPECT_EQ(10U, manager.GetNumActiveResourcesForSource(LOG_SOURCE_UILATEST));
// Wait for all asynchronous operations to complete.
base::RunLoop().RunUntilIdle();
}
TEST_F(LogSourceAccessManagerTest,
MaxNumberOfOpenLogSourcesDifferentExtensions) {
const base::TimeDelta timeout(base::TimeDelta::FromMilliseconds(0));
LogSourceAccessManager::SetRateLimitingTimeoutForTesting(&timeout);
LogSourceAccessManager manager(browser_context());
int count = 0;
// Open 10 readers for LOG_SOURCE_MESSAGES from different extensions.
ReadLogSourceParams messages_params;
messages_params.incremental = false;
messages_params.source = LOG_SOURCE_MESSAGES;
for (size_t i = 0; i < kMaxReadersPerSource; ++i, ++count) {
EXPECT_TRUE(manager.FetchFromSource(
messages_params, base::StringPrintf("extension %d", count),
base::BindOnce(&DummyCallback)))
<< base::StringPrintf(
"Unable to read from log source with i=%zu and count=%d", i,
count);
EXPECT_EQ(i + 1,
manager.GetNumActiveResourcesForSource(LOG_SOURCE_MESSAGES));
}
EXPECT_EQ(0U, manager.GetNumActiveResourcesForSource(LOG_SOURCE_UILATEST));
// Open 10 readers for LOG_SOURCE_UILATEST from different extensions.
ReadLogSourceParams ui_latest_params;
ui_latest_params.incremental = false;
ui_latest_params.source = LOG_SOURCE_UILATEST;
for (size_t i = 0; i < kMaxReadersPerSource; ++i, ++count) {
EXPECT_TRUE(manager.FetchFromSource(
ui_latest_params, base::StringPrintf("extension %d", count),
base::BindOnce(&DummyCallback)))
<< base::StringPrintf(
"Unable to read from log source with i=%zu and count=%d", i,
count);
EXPECT_EQ(i + 1,
manager.GetNumActiveResourcesForSource(LOG_SOURCE_UILATEST));
}
EXPECT_EQ(10U, manager.GetNumActiveResourcesForSource(LOG_SOURCE_MESSAGES));
// Can't open more readers for LOG_SOURCE_MESSAGES.
EXPECT_FALSE(manager.FetchFromSource(
messages_params, base::StringPrintf("extension %d", count),
base::BindOnce(&DummyCallback)));
EXPECT_EQ(10U, manager.GetNumActiveResourcesForSource(LOG_SOURCE_MESSAGES));
EXPECT_EQ(10U, manager.GetNumActiveResourcesForSource(LOG_SOURCE_UILATEST));
// Can't open more readers for LOG_SOURCE_UILATEST.
EXPECT_FALSE(manager.FetchFromSource(
ui_latest_params, base::StringPrintf("extension %d", count),
base::BindOnce(&DummyCallback)));
EXPECT_EQ(10U, manager.GetNumActiveResourcesForSource(LOG_SOURCE_MESSAGES));
EXPECT_EQ(10U, manager.GetNumActiveResourcesForSource(LOG_SOURCE_UILATEST));
// Wait for all asynchronous operations to complete.
base::RunLoop().RunUntilIdle();
}
} // namespace extensions