|  | // Copyright 2019 The Fuchsia 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 "src/developer/forensics/snapshot/snapshotter.h" | 
|  |  | 
|  | #include <lib/async-loop/cpp/loop.h> | 
|  | #include <lib/async-loop/default.h> | 
|  | #include <lib/sys/cpp/testing/service_directory_provider.h> | 
|  | #include <lib/syslog/cpp/macros.h> | 
|  | #include <zircon/errors.h> | 
|  |  | 
|  | #include <memory> | 
|  | #include <string> | 
|  |  | 
|  | #include <gtest/gtest.h> | 
|  |  | 
|  | #include "src/developer/forensics/testing/stubs/data_provider.h" | 
|  | #include "src/lib/files/file.h" | 
|  | #include "src/lib/files/scoped_temp_dir.h" | 
|  | #include "src/lib/fsl/vmo/strings.h" | 
|  | #include "src/lib/testing/loop_fixture/test_loop_fixture.h" | 
|  |  | 
|  | namespace forensics { | 
|  | namespace snapshot { | 
|  | namespace { | 
|  |  | 
|  | class SnapshotterTest : public gtest::TestLoopFixture { | 
|  | public: | 
|  | SnapshotterTest() | 
|  | : service_directory_provider_loop_(&kAsyncLoopConfigNoAttachToCurrentThread), | 
|  | service_directory_provider_(service_directory_provider_loop_.dispatcher()) {} | 
|  |  | 
|  | ~SnapshotterTest() { | 
|  | // Shut down before running member variable destructors in case tasks on the loop | 
|  | // hold references to member variables. | 
|  | service_directory_provider_loop_.Shutdown(); | 
|  | } | 
|  |  | 
|  | void SetUp() override { | 
|  | // We run the service directory provider in a different loop and thread so that the | 
|  | // MakeSnapshot can connect to the stub feedback data provider synchronously. | 
|  | FX_CHECK(service_directory_provider_loop_.StartThread("service directory provider thread") == | 
|  | ZX_OK); | 
|  |  | 
|  | FX_CHECK(tmp_dir_.NewTempFile(&snapshot_path_)); | 
|  | } | 
|  |  | 
|  | protected: | 
|  | void SetUpDataProviderServer(fuchsia::feedback::Attachment snapshot) { | 
|  | data_provider_server_ = std::make_unique<stubs::DataProviderSnapshotOnly>(std::move(snapshot)); | 
|  | FX_CHECK(service_directory_provider_.AddService(data_provider_server_->GetHandler()) == ZX_OK); | 
|  | } | 
|  |  | 
|  | private: | 
|  | async::Loop service_directory_provider_loop_; | 
|  |  | 
|  | protected: | 
|  | sys::testing::ServiceDirectoryProvider service_directory_provider_; | 
|  | std::string snapshot_path_; | 
|  |  | 
|  | private: | 
|  | std::unique_ptr<stubs::DataProviderBase> data_provider_server_; | 
|  | files::ScopedTempDir tmp_dir_; | 
|  | }; | 
|  |  | 
|  | TEST_F(SnapshotterTest, Basic) { | 
|  | const std::string payload = "technically a ZIP archive, but it doesn't matter for the unit test"; | 
|  |  | 
|  | fuchsia::feedback::Attachment snapshot; | 
|  | snapshot.key = "unused"; | 
|  | ASSERT_TRUE(fsl::VmoFromString(payload, &snapshot.value)); | 
|  | SetUpDataProviderServer(std::move(snapshot)); | 
|  |  | 
|  | ASSERT_TRUE(MakeSnapshot(service_directory_provider_.service_directory(), snapshot_path_.data())); | 
|  |  | 
|  | std::string snapshot_str; | 
|  | ASSERT_TRUE(files::ReadFileToString(snapshot_path_, &snapshot_str)); | 
|  | EXPECT_STREQ(snapshot_str.c_str(), payload.c_str()); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  | }  // namespace snapshot | 
|  | }  // namespace forensics |