| // Copyright 2015 The Chromium OS 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 "chromeos-dbus-bindings/test_utils.h" |
| |
| #include <string> |
| #include <vector> |
| |
| #include <base/files/file_path.h> |
| #include <base/files/file_util.h> |
| #include <base/logging.h> |
| #include <brillo/process/process.h> |
| #include <gtest/gtest.h> |
| |
| using std::string; |
| using std::vector; |
| |
| namespace { |
| |
| // Return the diff between the texts |a| and |b|. |
| string GetUnifiedDiff(const string& a, const string& b) { |
| base::FilePath path_a, path_b; |
| if (!base::CreateTemporaryFile(&path_a) || |
| !base::CreateTemporaryFile(&path_b)) { |
| return "Error creating temporary file"; |
| } |
| WriteFile(path_a, a.data(), a.size()); |
| WriteFile(path_b, b.data(), b.size()); |
| |
| brillo::ProcessImpl proc; |
| proc.AddArg("diff"); |
| proc.AddArg("-u"); |
| proc.AddArg(path_a.value()); |
| proc.AddArg(path_b.value()); |
| proc.SetSearchPath(true); |
| proc.RedirectUsingPipe(STDOUT_FILENO, false); |
| proc.Start(); |
| |
| int fd = proc.GetPipe(STDOUT_FILENO); |
| vector<char> buffer(32 * 1024); |
| string output; |
| while (true) { |
| int rc = read(fd, buffer.data(), buffer.size()); |
| if (rc < 0) { |
| PLOG(ERROR) << "Reading from diff."; |
| break; |
| } else if (rc == 0) { |
| break; |
| } else { |
| output.append(buffer.data(), rc); |
| } |
| } |
| proc.Wait(); |
| |
| base::DeleteFile(path_a); |
| base::DeleteFile(path_b); |
| return output; |
| } |
| |
| } // namespace |
| |
| namespace chromeos_dbus_bindings { |
| namespace test_utils { |
| |
| void ExpectTextContained(const base::Location& from_here, |
| const string& expected_str, |
| const string& expected_expr, |
| const string& actual_str, |
| const string& actual_expr) { |
| if (string::npos != actual_str.find(expected_str)) |
| return; |
| |
| ADD_FAILURE_AT(from_here.file_name(), from_here.line_number()) |
| << "Expected to find " << expected_expr << " within " << actual_expr |
| << ".\nHere is the diff:\n" |
| << GetUnifiedDiff(expected_str, actual_str); |
| } |
| |
| } // namespace test_utils |
| } // namespace chromeos_dbus_bindings |