| Index: chrome/browser/copresence/chrome_whispernet_client_browsertest.cc
|
| diff --git a/chrome/browser/copresence/chrome_whispernet_client_browsertest.cc b/chrome/browser/copresence/chrome_whispernet_client_browsertest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..469a42d2f14b50d268535cca7fb2c6bce59c84a4
|
| --- /dev/null
|
| +++ b/chrome/browser/copresence/chrome_whispernet_client_browsertest.cc
|
| @@ -0,0 +1,179 @@
|
| +// Copyright 2014 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 "chrome/browser/copresence/chrome_whispernet_client.h"
|
| +
|
| +#include <cstdlib>
|
| +#include <string>
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/macros.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/run_loop.h"
|
| +#include "base/stl_util.h"
|
| +#include "chrome/browser/extensions/api/copresence_private/copresence_private_api.h"
|
| +#include "chrome/browser/extensions/extension_browsertest.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/ui/browser.h"
|
| +#include "chrome/test/base/in_process_browser_test.h"
|
| +#include "media/base/audio_bus.h"
|
| +
|
| +namespace {
|
| +
|
| +// Copied from src/components/copresence/mediums/audio/audio_recorder.cc
|
| +std::string AudioBusToString(scoped_refptr<media::AudioBusRefCounted> source) {
|
| + std::string buffer;
|
| + buffer.resize(source->frames() * source->channels() * sizeof(float));
|
| + float* buffer_view = reinterpret_cast<float*>(string_as_array(&buffer));
|
| +
|
| + const int channels = source->channels();
|
| + for (int ch = 0; ch < channels; ++ch) {
|
| + for (int si = 0, di = ch; si < source->frames(); ++si, di += channels)
|
| + buffer_view[di] = source->channel(ch)[si];
|
| + }
|
| +
|
| + return buffer;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +class ChromeWhispernetClientTest : public ExtensionBrowserTest {
|
| + public:
|
| + ChromeWhispernetClientTest() : initialized_(false) {}
|
| +
|
| + virtual ~ChromeWhispernetClientTest() {
|
| + if (client_)
|
| + extensions::SetWhispernetClientForTesting(NULL);
|
| + }
|
| +
|
| + void InitializeWhispernet() {
|
| + run_loop_.reset(new base::RunLoop());
|
| + client_.reset(new ChromeWhispernetClient(browser()->profile()));
|
| + extensions::SetWhispernetClientForTesting(client_.get());
|
| +
|
| + client_->Initialize(base::Bind(&ChromeWhispernetClientTest::InitCallback,
|
| + base::Unretained(this)));
|
| + run_loop_->Run();
|
| +
|
| + EXPECT_TRUE(initialized_);
|
| + }
|
| +
|
| + void EncodeTokenAndSaveSamples() {
|
| + ASSERT_TRUE(client_);
|
| +
|
| + // This is the base64 encoding for 000000.
|
| + const std::string kZeroToken = "MDAwMDAw";
|
| +
|
| + run_loop_.reset(new base::RunLoop());
|
| + client_->RegisterSamplesCallback(base::Bind(
|
| + &ChromeWhispernetClientTest::SamplesCallback, base::Unretained(this)));
|
| + expected_token_ = kZeroToken;
|
| +
|
| + client_->EncodeToken(kZeroToken);
|
| + run_loop_->Run();
|
| +
|
| + EXPECT_GT(saved_samples_->frames(), 0);
|
| + }
|
| +
|
| + void DecodeSamplesAndVerifyToken() {
|
| + ASSERT_TRUE(client_);
|
| +
|
| + const std::string kZeroToken = "MDAwMDAw";
|
| +
|
| + run_loop_.reset(new base::RunLoop());
|
| + client_->RegisterTokensCallback(base::Bind(
|
| + &ChromeWhispernetClientTest::TokensCallback, base::Unretained(this)));
|
| + expected_token_ = kZeroToken;
|
| +
|
| + ASSERT_GT(saved_samples_->frames(), 0);
|
| +
|
| + // Convert our single channel samples to two channel. Decode samples
|
| + // expects 2 channel data.
|
| + scoped_refptr<media::AudioBusRefCounted> samples_bus =
|
| + media::AudioBusRefCounted::Create(2, saved_samples_->frames());
|
| + memcpy(samples_bus->channel(0),
|
| + saved_samples_->channel(0),
|
| + sizeof(float) * saved_samples_->frames());
|
| + memcpy(samples_bus->channel(1),
|
| + saved_samples_->channel(0),
|
| + sizeof(float) * saved_samples_->frames());
|
| +
|
| + client_->DecodeSamples(AudioBusToString(samples_bus));
|
| + run_loop_->Run();
|
| + }
|
| +
|
| + void DetectBroadcast() {
|
| + ASSERT_TRUE(client_);
|
| +
|
| + run_loop_.reset(new base::RunLoop());
|
| + client_->RegisterDetectBroadcastCallback(
|
| + base::Bind(&ChromeWhispernetClientTest::DetectBroadcastCallback,
|
| + base::Unretained(this)));
|
| + client_->DetectBroadcast();
|
| + run_loop_->Run();
|
| + }
|
| +
|
| + protected:
|
| + void InitCallback(bool success) {
|
| + EXPECT_TRUE(success);
|
| + initialized_ = true;
|
| + ASSERT_TRUE(run_loop_);
|
| + run_loop_->Quit();
|
| + }
|
| +
|
| + void SamplesCallback(
|
| + const std::string& token,
|
| + const scoped_refptr<media::AudioBusRefCounted>& samples) {
|
| + EXPECT_EQ(expected_token_, token);
|
| + saved_samples_ = samples;
|
| + ASSERT_TRUE(run_loop_);
|
| + run_loop_->Quit();
|
| + }
|
| +
|
| + void TokensCallback(const std::vector<std::string>& tokens) {
|
| + ASSERT_TRUE(run_loop_);
|
| + run_loop_->Quit();
|
| +
|
| + EXPECT_EQ(expected_token_, tokens[0]);
|
| + }
|
| +
|
| + void DetectBroadcastCallback(bool success) {
|
| + EXPECT_TRUE(success);
|
| + ASSERT_TRUE(run_loop_);
|
| + run_loop_->Quit();
|
| + }
|
| +
|
| + private:
|
| + scoped_ptr<base::RunLoop> run_loop_;
|
| + scoped_ptr<ChromeWhispernetClient> client_;
|
| +
|
| + std::string expected_token_;
|
| + scoped_refptr<media::AudioBusRefCounted> saved_samples_;
|
| +
|
| + bool initialized_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ChromeWhispernetClientTest);
|
| +};
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, Initialize) {
|
| + InitializeWhispernet();
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, EncodeToken) {
|
| + InitializeWhispernet();
|
| + EncodeTokenAndSaveSamples();
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, DecodeSamples) {
|
| + InitializeWhispernet();
|
| + EncodeTokenAndSaveSamples();
|
| + DecodeSamplesAndVerifyToken();
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, DetectBroadcast) {
|
| + InitializeWhispernet();
|
| + EncodeTokenAndSaveSamples();
|
| + DecodeSamplesAndVerifyToken();
|
| + DetectBroadcast();
|
| +}
|
|
|