Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1426)

Unified Diff: chrome/browser/copresence/chrome_whispernet_client_browsertest.cc

Issue 438513002: Add the whispernet proxy. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
+}

Powered by Google App Engine
This is Rietveld 408576698