| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/copresence/chrome_whispernet_client.h" | 5 #include "chrome/browser/copresence/chrome_whispernet_client.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <cstdlib> | 8 #include <cstdlib> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "media/base/audio_bus.h" | 26 #include "media/base/audio_bus.h" |
| 27 #include "media/base/audio_converter.h" | 27 #include "media/base/audio_converter.h" |
| 28 | 28 |
| 29 using audio_modem::WhispernetClient; | 29 using audio_modem::WhispernetClient; |
| 30 using audio_modem::AUDIBLE; | 30 using audio_modem::AUDIBLE; |
| 31 using audio_modem::INAUDIBLE; | 31 using audio_modem::INAUDIBLE; |
| 32 using audio_modem::TokenParameters; | 32 using audio_modem::TokenParameters; |
| 33 | 33 |
| 34 namespace { | 34 namespace { |
| 35 | 35 |
| 36 // TODO(rkc): Add more varied test input. | 36 // TODO(ckehoe): Use randomly generated tokens instead. |
| 37 const char kSixZeros[] = "MDAwMDAw"; | 37 const char kSixZeros[] = "MDAwMDAw"; |
| 38 const char kEightZeros[] = "MDAwMDAwMDA"; | 38 const char kEightZeros[] = "MDAwMDAwMDA"; |
| 39 const char kNineZeros[] = "MDAwMDAwMDAw"; | 39 const char kNineZeros[] = "MDAwMDAwMDAw"; |
| 40 | 40 |
| 41 const size_t kTokenLengths[2] = {6, 6}; | 41 const size_t kTokenLengths[2] = {6, 6}; |
| 42 | 42 |
| 43 // Copied from src/components/copresence/mediums/audio/audio_recorder.cc | 43 // Copied from src/components/copresence/mediums/audio/audio_recorder.cc |
| 44 std::string AudioBusToString(scoped_refptr<media::AudioBusRefCounted> source) { | 44 std::string AudioBusToString(scoped_refptr<media::AudioBusRefCounted> source) { |
| 45 std::string buffer; | 45 std::string buffer; |
| 46 buffer.resize(source->frames() * source->channels() * sizeof(float)); | 46 buffer.resize(source->frames() * source->channels() * sizeof(float)); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 media::AudioParameters::NO_EFFECTS); | 107 media::AudioParameters::NO_EFFECTS); |
| 108 | 108 |
| 109 converter_.reset(new media::AudioConverter( | 109 converter_.reset(new media::AudioConverter( |
| 110 coder_params_, default_params_, | 110 coder_params_, default_params_, |
| 111 default_params_.sample_rate() == coder_params_.sample_rate())); | 111 default_params_.sample_rate() == coder_params_.sample_rate())); |
| 112 converter_->AddInput(this); | 112 converter_->AddInput(this); |
| 113 } | 113 } |
| 114 | 114 |
| 115 void EncodeTokenAndSaveSamples(WhispernetClient* client, | 115 void EncodeTokenAndSaveSamples(WhispernetClient* client, |
| 116 bool audible, | 116 bool audible, |
| 117 const std::string& token) { | 117 const std::string& token, |
| 118 const TokenParameters token_params[2]) { |
| 118 run_loop_.reset(new base::RunLoop()); | 119 run_loop_.reset(new base::RunLoop()); |
| 119 client->RegisterSamplesCallback( | 120 client->RegisterSamplesCallback( |
| 120 base::Bind(&ChromeWhispernetClientTest::SamplesCallback, | 121 base::Bind(&ChromeWhispernetClientTest::SamplesCallback, |
| 121 base::Unretained(this))); | 122 base::Unretained(this))); |
| 122 expected_token_ = token; | 123 expected_token_ = token; |
| 123 expected_audible_ = audible; | 124 expected_audible_ = audible; |
| 124 | 125 |
| 125 TokenParameters token_params[2]; | |
| 126 client->EncodeToken(token, audible ? AUDIBLE : INAUDIBLE, token_params); | 126 client->EncodeToken(token, audible ? AUDIBLE : INAUDIBLE, token_params); |
| 127 run_loop_->Run(); | 127 run_loop_->Run(); |
| 128 | 128 |
| 129 EXPECT_GT(saved_samples_->frames(), 0); | 129 EXPECT_GT(saved_samples_->frames(), 0); |
| 130 } | 130 } |
| 131 | 131 |
| 132 void DecodeSamplesAndVerifyToken(WhispernetClient* client, | 132 void DecodeSamplesAndVerifyToken(WhispernetClient* client, |
| 133 bool expect_audible, | 133 bool expect_audible, |
| 134 const std::string& expected_token, | 134 const std::string& expected_token, |
| 135 const TokenParameters token_params[2]) { | 135 const TokenParameters token_params[2]) { |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 media::AudioParameters coder_params_; | 229 media::AudioParameters coder_params_; |
| 230 | 230 |
| 231 DISALLOW_COPY_AND_ASSIGN(ChromeWhispernetClientTest); | 231 DISALLOW_COPY_AND_ASSIGN(ChromeWhispernetClientTest); |
| 232 }; | 232 }; |
| 233 | 233 |
| 234 // These tests are irrelevant if NACL is disabled. See crbug.com/449198 | 234 // These tests are irrelevant if NACL is disabled. See crbug.com/449198 |
| 235 #if defined(DISABLE_NACL) | 235 #if defined(DISABLE_NACL) |
| 236 #define MAYBE_Initialize DISABLED_Initialize | 236 #define MAYBE_Initialize DISABLED_Initialize |
| 237 #define MAYBE_EncodeAndDecode DISABLED_EncodeAndDecode | 237 #define MAYBE_EncodeAndDecode DISABLED_EncodeAndDecode |
| 238 #define MAYBE_TokenLengths DISABLED_TokenLengths | 238 #define MAYBE_TokenLengths DISABLED_TokenLengths |
| 239 #define MAYBE_Crc DISABLED_Crc |
| 239 #define MAYBE_MultipleClients DISABLED_MultipleClients | 240 #define MAYBE_MultipleClients DISABLED_MultipleClients |
| 240 #else | 241 #else |
| 241 #define MAYBE_Initialize Initialize | 242 #define MAYBE_Initialize Initialize |
| 242 #define MAYBE_EncodeAndDecode EncodeAndDecode | 243 #define MAYBE_EncodeAndDecode EncodeAndDecode |
| 243 #define MAYBE_TokenLengths TokenLengths | 244 #define MAYBE_TokenLengths TokenLengths |
| 245 #define MAYBE_Crc Crc |
| 244 #define MAYBE_MultipleClients MultipleClients | 246 #define MAYBE_MultipleClients MultipleClients |
| 245 #endif | 247 #endif |
| 246 | 248 |
| 247 IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, MAYBE_Initialize) { | 249 IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, MAYBE_Initialize) { |
| 248 InitializeWhispernet(); | 250 InitializeWhispernet(); |
| 249 } | 251 } |
| 250 | 252 |
| 251 IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, MAYBE_EncodeAndDecode) { | 253 IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, MAYBE_EncodeAndDecode) { |
| 252 scoped_ptr<WhispernetClient> client( | 254 scoped_ptr<WhispernetClient> client( |
| 253 new ChromeWhispernetClient(browser()->profile())); | 255 new ChromeWhispernetClient(browser()->profile())); |
| 254 client->Initialize(base::Bind(&IgnoreResult)); | 256 client->Initialize(base::Bind(&IgnoreResult)); |
| 255 SetupDecode(); | 257 SetupDecode(); |
| 256 | 258 |
| 257 TokenParameters token_params[2]; | 259 TokenParameters token_params[2]; |
| 258 GetTokenParamsForLengths(kTokenLengths, token_params); | 260 GetTokenParamsForLengths(kTokenLengths, token_params); |
| 259 | 261 |
| 260 EncodeTokenAndSaveSamples(client.get(), true, kSixZeros); | 262 EncodeTokenAndSaveSamples(client.get(), true, kSixZeros, token_params); |
| 261 DecodeSamplesAndVerifyToken(client.get(), true, kSixZeros, token_params); | 263 DecodeSamplesAndVerifyToken(client.get(), true, kSixZeros, token_params); |
| 262 | 264 |
| 263 EncodeTokenAndSaveSamples(client.get(), false, kSixZeros); | 265 EncodeTokenAndSaveSamples(client.get(), false, kSixZeros, token_params); |
| 264 DecodeSamplesAndVerifyToken(client.get(), false, kSixZeros, token_params); | 266 DecodeSamplesAndVerifyToken(client.get(), false, kSixZeros, token_params); |
| 265 } | 267 } |
| 266 | 268 |
| 267 IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, MAYBE_TokenLengths) { | 269 IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, MAYBE_TokenLengths) { |
| 268 scoped_ptr<WhispernetClient> client( | 270 scoped_ptr<WhispernetClient> client( |
| 269 new ChromeWhispernetClient(browser()->profile())); | 271 new ChromeWhispernetClient(browser()->profile())); |
| 270 client->Initialize(base::Bind(&IgnoreResult)); | 272 client->Initialize(base::Bind(&IgnoreResult)); |
| 271 SetupDecode(); | 273 SetupDecode(); |
| 272 | 274 |
| 273 const size_t kLongTokenLengths[2] = {8, 9}; | 275 const size_t kLongTokenLengths[2] = {8, 9}; |
| 274 TokenParameters token_params[2]; | 276 TokenParameters token_params[2]; |
| 275 GetTokenParamsForLengths(kLongTokenLengths, token_params); | 277 GetTokenParamsForLengths(kLongTokenLengths, token_params); |
| 276 | 278 |
| 277 EncodeTokenAndSaveSamples(client.get(), true, kEightZeros); | 279 EncodeTokenAndSaveSamples(client.get(), true, kEightZeros, token_params); |
| 278 DecodeSamplesAndVerifyToken(client.get(), true, kEightZeros, token_params); | 280 DecodeSamplesAndVerifyToken(client.get(), true, kEightZeros, token_params); |
| 279 | 281 |
| 280 EncodeTokenAndSaveSamples(client.get(), false, kNineZeros); | 282 EncodeTokenAndSaveSamples(client.get(), false, kNineZeros, token_params); |
| 281 DecodeSamplesAndVerifyToken(client.get(), false, kNineZeros, token_params); | 283 DecodeSamplesAndVerifyToken(client.get(), false, kNineZeros, token_params); |
| 282 } | 284 } |
| 283 | 285 |
| 286 IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, MAYBE_Crc) { |
| 287 scoped_ptr<WhispernetClient> client( |
| 288 new ChromeWhispernetClient(browser()->profile())); |
| 289 client->Initialize(base::Bind(&IgnoreResult)); |
| 290 SetupDecode(); |
| 291 |
| 292 TokenParameters token_params[2]; |
| 293 GetTokenParamsForLengths(kTokenLengths, token_params); |
| 294 token_params[0].crc = true; |
| 295 token_params[1].crc = true; |
| 296 |
| 297 EncodeTokenAndSaveSamples(client.get(), true, kSixZeros, token_params); |
| 298 DecodeSamplesAndVerifyToken(client.get(), true, kSixZeros, token_params); |
| 299 |
| 300 EncodeTokenAndSaveSamples(client.get(), false, kSixZeros, token_params); |
| 301 DecodeSamplesAndVerifyToken(client.get(), false, kSixZeros, token_params); |
| 302 } |
| 303 |
| 284 IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, MAYBE_MultipleClients) { | 304 IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, MAYBE_MultipleClients) { |
| 285 scoped_ptr<WhispernetClient> client_1( | 305 scoped_ptr<WhispernetClient> client_1( |
| 286 new ChromeWhispernetClient(browser()->profile())); | 306 new ChromeWhispernetClient(browser()->profile())); |
| 287 scoped_ptr<WhispernetClient> client_2( | 307 scoped_ptr<WhispernetClient> client_2( |
| 288 new ChromeWhispernetClient(browser()->profile())); | 308 new ChromeWhispernetClient(browser()->profile())); |
| 289 scoped_ptr<WhispernetClient> client_3( | 309 scoped_ptr<WhispernetClient> client_3( |
| 290 new ChromeWhispernetClient(browser()->profile())); | 310 new ChromeWhispernetClient(browser()->profile())); |
| 291 SetupDecode(); | 311 SetupDecode(); |
| 292 | 312 |
| 293 TokenParameters token_params[2]; | 313 TokenParameters token_params[2]; |
| 294 GetTokenParamsForLengths(kTokenLengths, token_params); | 314 GetTokenParamsForLengths(kTokenLengths, token_params); |
| 295 | 315 |
| 296 // Test concurrent initialization. | 316 // Test concurrent initialization. |
| 297 client_1->Initialize(base::Bind(&IgnoreResult)); | 317 client_1->Initialize(base::Bind(&IgnoreResult)); |
| 298 client_2->Initialize(base::Bind(&IgnoreResult)); | 318 client_2->Initialize(base::Bind(&IgnoreResult)); |
| 299 | 319 |
| 300 EncodeTokenAndSaveSamples(client_1.get(), true, kSixZeros); | 320 EncodeTokenAndSaveSamples(client_1.get(), true, kSixZeros, token_params); |
| 301 DecodeSamplesAndVerifyToken(client_1.get(), true, kSixZeros, token_params); | 321 DecodeSamplesAndVerifyToken(client_1.get(), true, kSixZeros, token_params); |
| 302 | 322 |
| 303 EncodeTokenAndSaveSamples(client_2.get(), false, kSixZeros); | 323 EncodeTokenAndSaveSamples(client_2.get(), false, kSixZeros, token_params); |
| 304 DecodeSamplesAndVerifyToken(client_2.get(), false, kSixZeros, token_params); | 324 DecodeSamplesAndVerifyToken(client_2.get(), false, kSixZeros, token_params); |
| 305 | 325 |
| 306 // Test sequential initialization. | 326 // Test sequential initialization. |
| 307 client_3->Initialize(base::Bind(&IgnoreResult)); | 327 client_3->Initialize(base::Bind(&IgnoreResult)); |
| 308 | 328 |
| 309 EncodeTokenAndSaveSamples(client_3.get(), true, kSixZeros); | 329 EncodeTokenAndSaveSamples(client_3.get(), true, kSixZeros, token_params); |
| 310 DecodeSamplesAndVerifyToken(client_3.get(), true, kSixZeros, token_params); | 330 DecodeSamplesAndVerifyToken(client_3.get(), true, kSixZeros, token_params); |
| 311 | 331 |
| 312 const size_t kLongTokenLengths[2] = {8, 9}; | 332 const size_t kLongTokenLengths[2] = {8, 9}; |
| 313 GetTokenParamsForLengths(kLongTokenLengths, token_params); | 333 GetTokenParamsForLengths(kLongTokenLengths, token_params); |
| 314 | 334 |
| 315 EncodeTokenAndSaveSamples(client_2.get(), true, kEightZeros); | 335 EncodeTokenAndSaveSamples(client_2.get(), true, kEightZeros, token_params); |
| 316 DecodeSamplesAndVerifyToken(client_2.get(), true, kEightZeros, token_params); | 336 DecodeSamplesAndVerifyToken(client_2.get(), true, kEightZeros, token_params); |
| 317 } | 337 } |
| 318 | |
| 319 // TODO(ckehoe): Test crc and parity | |
| 320 // TODO(ckehoe): More multi-client testing | |
| OLD | NEW |