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)31std::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