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