1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2009 The Android Open Source Project 3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License"); 5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License. 6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at 7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// http://www.apache.org/licenses/LICENSE-2.0 9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software 11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS, 12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and 14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License. 15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 1649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 1739910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/payload_consumer/file_writer.h" 18b5ba9e41b98ccdeacf069bb5036d98e76a574cc4Alex Deymo 19c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com#include <errno.h> 2049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <string.h> 2149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <unistd.h> 22b5ba9e41b98ccdeacf069bb5036d98e76a574cc4Alex Deymo 2349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <string> 2449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <vector> 25b5ba9e41b98ccdeacf069bb5036d98e76a574cc4Alex Deymo 263f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/secure_blob.h> 2739910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include <gtest/gtest.h> 28b5ba9e41b98ccdeacf069bb5036d98e76a574cc4Alex Deymo 2939910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/test_utils.h" 3039910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/utils.h" 3149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 3249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comusing std::string; 3349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comusing std::vector; 3449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 3549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comnamespace chromeos_update_engine { 3649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 3749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass FileWriterTest : public ::testing::Test { }; 3849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 3949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comTEST(FileWriterTest, SimpleTest) { 40cfc836c024f8e0dbb8a2a1e05bf10d34e8aa818aGilad Arnold // Create a uniquely named file for testing. 41cfc836c024f8e0dbb8a2a1e05bf10d34e8aa818aGilad Arnold string path; 4288b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko ASSERT_TRUE(utils::MakeTempFile("FileWriterTest-XXXXXX", &path, nullptr)); 43cfc836c024f8e0dbb8a2a1e05bf10d34e8aa818aGilad Arnold ScopedPathUnlinker path_unlinker(path); 44cfc836c024f8e0dbb8a2a1e05bf10d34e8aa818aGilad Arnold 4549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com DirectFileWriter file_writer; 46e410e0ff57c820e7d5f5bf6abcea56fe6951111bDon Garrett EXPECT_EQ(0, file_writer.Open(path.c_str(), 4749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com O_CREAT | O_LARGEFILE | O_TRUNC | O_WRONLY, 4849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 0644)); 49e410e0ff57c820e7d5f5bf6abcea56fe6951111bDon Garrett EXPECT_TRUE(file_writer.Write("test", 4)); 503f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko brillo::Blob actual_data; 51c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com EXPECT_TRUE(utils::ReadFile(path, &actual_data)); 5249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 53f68bbbc952aa9a71898e4939b5f36187fa564a50Alex Vakulenko EXPECT_FALSE(memcmp("test", actual_data.data(), actual_data.size())); 5449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com EXPECT_EQ(0, file_writer.Close()); 5549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} 5649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 5749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comTEST(FileWriterTest, ErrorTest) { 5849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com DirectFileWriter file_writer; 5949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com const string path("/tmp/ENOENT/FileWriterTest"); 6049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com EXPECT_EQ(-ENOENT, file_writer.Open(path.c_str(), 6149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com O_CREAT | O_LARGEFILE | O_TRUNC, 0644)); 6249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} 6349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 6449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comTEST(FileWriterTest, WriteErrorTest) { 65cfc836c024f8e0dbb8a2a1e05bf10d34e8aa818aGilad Arnold // Create a uniquely named file for testing. 66cfc836c024f8e0dbb8a2a1e05bf10d34e8aa818aGilad Arnold string path; 6788b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko ASSERT_TRUE(utils::MakeTempFile("FileWriterTest-XXXXXX", &path, nullptr)); 68cfc836c024f8e0dbb8a2a1e05bf10d34e8aa818aGilad Arnold ScopedPathUnlinker path_unlinker(path); 69cfc836c024f8e0dbb8a2a1e05bf10d34e8aa818aGilad Arnold 7049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com DirectFileWriter file_writer; 7149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com EXPECT_EQ(0, file_writer.Open(path.c_str(), 7249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com O_CREAT | O_LARGEFILE | O_TRUNC | O_RDONLY, 7349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 0644)); 74e410e0ff57c820e7d5f5bf6abcea56fe6951111bDon Garrett EXPECT_FALSE(file_writer.Write("x", 1)); 7549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com EXPECT_EQ(0, file_writer.Close()); 7649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} 7749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 7849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com 7949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com} // namespace chromeos_update_engine 80