test_utils.cc revision 49fdf1889b965be25f929eeebc5b60cd40b9043
149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// Use of this source code is governed by a BSD-style license that can be
349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// found in the LICENSE file.
449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <sys/stat.h>
649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <sys/types.h>
749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <stdio.h>
849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <stdlib.h>
949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <unistd.h>
1049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <string>
1149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <vector>
1249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include "update_engine/test_utils.h"
1349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include "glog/logging.h"
1449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
1549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include "update_engine/file_writer.h"
1649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
1749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comusing std::string;
1849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comusing std::vector;
1949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
2049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comnamespace chromeos_update_engine {
2149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
2249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comvector<char> ReadFile(const string& path) {
2349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  vector<char> ret;
2449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  FILE* fp = fopen(path.c_str(), "r");
2549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  if (!fp)
2649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    return ret;
2749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  const size_t kChunkSize(1024);
2849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  size_t read_size;
2949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  do {
3049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    char buf[kChunkSize];
3149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    read_size = fread(buf, 1, kChunkSize, fp);
3249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    ret.insert(ret.end(), buf, buf + read_size);
3349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  } while (read_size == kChunkSize);
3449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  fclose(fp);
3549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  return ret;
3649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}
3749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
3849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.combool WriteFile(const std::string& path, const std::vector<char>& data) {
3949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  DirectFileWriter writer;
4049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  if (0 != writer.Open(path.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0644)) {
4149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    return false;
4249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  }
4349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  if (static_cast<int>(data.size()) != writer.Write(&data[0], data.size())) {
4449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    writer.Close();
4549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    return false;
4649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  }
4749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  writer.Close();
4849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  return true;
4949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}
5049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
5149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comoff_t FileSize(const string& path) {
5249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  struct stat stbuf;
5349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  int rc = stat(path.c_str(), &stbuf);
5449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  CHECK_EQ(0, rc);
5549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  if (rc < 0)
5649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    return rc;
5749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  return stbuf.st_size;
5849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}
5949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
6049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comstd::vector<char> GzipCompressData(const std::vector<char>& data) {
6149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  const char fname[] = "/tmp/GzipCompressDataTemp";
6249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  if (!WriteFile(fname, data)) {
6349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    system((string("rm ") + fname).c_str());
6449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    return vector<char>();
6549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  }
6649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  system((string("cat ") + fname + "|gzip>" + fname + ".gz").c_str());
6749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  system((string("rm ") + fname).c_str());
6849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  vector<char> ret = ReadFile(string(fname) + ".gz");
6949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  system((string("rm ") + fname + ".gz").c_str());
7049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  return ret;
7149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}
7249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
7349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}  // namespace chromeos_update_engine
74