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