1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "storage/browser/test/blob_test_utils.h"
6 #include "base/run_loop.h"
7 #include "mojo/public/cpp/system/data_pipe_drainer.h"
8 
9 namespace storage {
10 
11 namespace {
12 
13 // Helper class to copy a blob to a string.
14 class DataPipeDrainerClient : public mojo::DataPipeDrainer::Client {
15  public:
DataPipeDrainerClient(std::string * output)16   explicit DataPipeDrainerClient(std::string* output) : output_(output) {}
Run()17   void Run() { run_loop_.Run(); }
18 
OnDataAvailable(const void * data,size_t num_bytes)19   void OnDataAvailable(const void* data, size_t num_bytes) override {
20     output_->append(reinterpret_cast<const char*>(data), num_bytes);
21   }
OnDataComplete()22   void OnDataComplete() override { run_loop_.Quit(); }
23 
24  private:
25   base::RunLoop run_loop_;
26   std::string* output_;
27 };
28 
29 }  // namespace
30 
BlobToString(blink::mojom::Blob * blob)31 std::string BlobToString(blink::mojom::Blob* blob) {
32   std::string output;
33   mojo::ScopedDataPipeProducerHandle producer;
34   mojo::ScopedDataPipeConsumerHandle consumer;
35   CHECK_EQ(MOJO_RESULT_OK,
36            mojo::CreateDataPipe(/*options=*/nullptr, &producer, &consumer));
37   blob->ReadAll(std::move(producer), mojo::NullRemote());
38   DataPipeDrainerClient client(&output);
39   mojo::DataPipeDrainer drainer(&client, std::move(consumer));
40   client.Run();
41   return output;
42 }
43 
44 }  // namespace storage