1f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo// Copyright 2015 The Chromium OS Authors. All rights reserved. 2f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo// Use of this source code is governed by a BSD-style license that can be 3f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo// found in the LICENSE file. 4f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo 5f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo#include "chromeos-dbus-bindings/test_utils.h" 6f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo 7f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo#include <string> 8f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo#include <vector> 9f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo 10f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo#include <base/files/file_path.h> 11f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo#include <base/files/file_util.h> 12f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo#include <base/logging.h> 13be6240db3b8a0981ce0f800247105154ff8e4960Alex Vakulenko#include <brillo/process.h> 14f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo#include <gtest/gtest.h> 15f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo 16f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymousing std::string; 17f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymousing std::vector; 18f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo 19f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymonamespace { 20f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo 21f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo// Return the diff between the texts |a| and |b|. 22f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymostring GetUnifiedDiff(const string& a, const string& b) { 23f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo base::FilePath path_a, path_b; 24f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo if (!base::CreateTemporaryFile(&path_a) || 25f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo !base::CreateTemporaryFile(&path_b)) { 26f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo return "Error creating temporary file"; 27f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo } 28f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo WriteFile(path_a, a.data(), a.size()); 29f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo WriteFile(path_b, b.data(), b.size()); 30f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo 31be6240db3b8a0981ce0f800247105154ff8e4960Alex Vakulenko brillo::ProcessImpl proc; 32f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo proc.AddArg("diff"); 33f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo proc.AddArg("-u"); 34f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo proc.AddArg(path_a.value()); 35f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo proc.AddArg(path_b.value()); 36f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo proc.SetSearchPath(true); 37f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo proc.RedirectUsingPipe(STDOUT_FILENO, false); 38f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo proc.Start(); 39f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo 40f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo int fd = proc.GetPipe(STDOUT_FILENO); 41f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo vector<char> buffer(32 * 1024); 42f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo string output; 43f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo while (true) { 44f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo int rc = read(fd, buffer.data(), buffer.size()); 45f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo if (rc < 0) { 46f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo PLOG(ERROR) << "Reading from diff."; 47f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo break; 48f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo } else if (rc == 0) { 49f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo break; 50f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo } else { 51f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo output.append(buffer.data(), rc); 52f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo } 53f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo } 54f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo proc.Wait(); 55f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo 56f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo base::DeleteFile(path_a, false); 57f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo base::DeleteFile(path_b, false); 58f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo return output; 59f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo} 60f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo 61f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo} // namespace 62f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo 63f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymonamespace chromeos_dbus_bindings { 64f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymonamespace test_utils { 65f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo 66f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymovoid ExpectTextContained(const tracked_objects::Location& from_here, 67f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo const string& expected_str, 68f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo const string& expected_expr, 69f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo const string& actual_str, 70f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo const string& actual_expr) { 71f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo if (string::npos != actual_str.find(expected_str)) 72f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo return; 73f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo 74f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo ADD_FAILURE_AT(from_here.file_name(), from_here.line_number()) 75f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo << "Expected to find " << expected_expr << " within " << actual_expr 76f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo << ".\nHere is the diff:\n" 77f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo << GetUnifiedDiff(expected_str, actual_str); 78f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo} 79f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo 80f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo} // namespace test_utils 81f211ae662aee9b2d4cb8538e9845b5389ba0cc3eAlex Deymo} // namespace chromeos_dbus_bindings 82