temp_file_unittest.cpp 3.25 KB
Newer Older
gejun's avatar
gejun committed
1
// Copyright (c) 2014 Baidu, Inc.
gejun's avatar
gejun committed
2 3 4 5 6 7
//
// Author: Yan,Lin(yanlin@baidu.com)  Ge,Jun(gejun@baidu.com)
// Date: Thu Oct 28 15:20:57 2010

#include <gtest/gtest.h>
#include <errno.h>                     // errno
8
#include "butil/files/temp_file.h"
gejun's avatar
gejun committed
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

namespace {

class TempFileTest : public ::testing::Test{
protected:
    TempFileTest(){};
    virtual ~TempFileTest(){};
    virtual void SetUp() {
    };
    virtual void TearDown() {
    };
};

TEST_F(TempFileTest, should_create_tmp_file)
{
24
    butil::TempFile tmp;
gejun's avatar
gejun committed
25 26 27 28 29 30 31
    struct stat st;
    //check if existed
    ASSERT_EQ(0, stat(tmp.fname(), &st));
}

TEST_F(TempFileTest, should_write_string)
{
32
    butil::TempFile tmp;
gejun's avatar
gejun committed
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
    const char *exp = "a test file";
    ASSERT_EQ(0, tmp.save(exp));

    FILE *fp = fopen(tmp.fname(), "r");
    ASSERT_NE((void*)0, fp);

    char buf[1024];
    char *act = fgets(buf, 1024, fp);
    fclose(fp);

    EXPECT_STREQ(exp, act);
}

TEST_F(TempFileTest, temp_with_specific_ext)
{
48
    butil::TempFile tmp("blah");
gejun's avatar
gejun committed
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
    const char *exp = "a test file";
    ASSERT_EQ(0, tmp.save(exp));
    struct stat st;
    ASSERT_EQ(0, stat(tmp.fname(), &st));

    ASSERT_STREQ(".blah", strrchr(tmp.fname(), '.'));
    FILE *fp = fopen(tmp.fname(), "r");
    ASSERT_NE((void*)0, fp) << strerror(errno);

    char buf[1024];
    char *act = fgets(buf, 1024, fp);
    fclose(fp);

    EXPECT_STREQ(exp, act);
}

TEST_F(TempFileTest, should_delete_when_exit)
{
    std::string fname;
    struct stat st;
    {
70
        butil::TempFile tmp;
gejun's avatar
gejun committed
71 72 73 74 75 76 77 78 79 80 81 82
        //check if existed
        ASSERT_EQ(0, stat(tmp.fname(), &st));
        fname = tmp.fname();
    }

    //check if existed
    ASSERT_EQ(-1, stat(fname.c_str(), &st));
    ASSERT_EQ(ENOENT, errno);
}

TEST_F(TempFileTest, should_save_with_format)
{
83
    butil::TempFile tmp;
gejun's avatar
gejun committed
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
    tmp.save_format("%s%d%ld%s", "justmp", 1, 98L, "hello world");

    FILE *fp = fopen(tmp.fname(), "r");
    ASSERT_NE((void*)0, fp);

    char buf[1024];
    char *act = fgets(buf, 1024, fp);
    fclose(fp);

    EXPECT_STREQ("justmp198hello world", act);
}

TEST_F(TempFileTest, should_save_with_format_in_long_string)
{
    char buf[2048];
    memset(buf, 'a', sizeof(buf));
    buf[2047] = '\0';

102
    butil::TempFile tmp;
gejun's avatar
gejun committed
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
    tmp.save_format("%s", buf);

    FILE *fp = fopen(tmp.fname(), "r");
    ASSERT_NE((void*)0, fp);

    char buf2[2048];
    char *act = fgets(buf2, 2048, fp);
    fclose(fp);    
    EXPECT_STREQ(buf, act);
}

struct test_t {
    int a;
    int b;
    char c[4];
};

TEST_F(TempFileTest, save_binary_twice)
{
122
    test_t data = {12, -34, {'B', 'E', 'E', 'F'}};
123
    butil::TempFile tmp;
gejun's avatar
gejun committed
124 125 126 127 128 129
    ASSERT_EQ(0, tmp.save_bin(&data, sizeof(data)));

    FILE *fp = fopen(tmp.fname(), "r");
    ASSERT_NE((void*)0, fp);
    test_t act_data;
    bzero(&act_data, sizeof(act_data));
gejun's avatar
gejun committed
130
    ASSERT_EQ((size_t)1, fread(&act_data, sizeof(act_data), 1, fp));
gejun's avatar
gejun committed
131 132 133 134 135
    fclose(fp);

    ASSERT_EQ(0, memcmp(&data, &act_data, sizeof(data)));

    // save twice
136
    test_t data2 = { 89, 1000, {'E', 'C', 'A', 'Z'}};
gejun's avatar
gejun committed
137 138 139 140 141
    ASSERT_EQ(0, tmp.save_bin(&data2, sizeof(data2)));
    
    fp = fopen(tmp.fname(), "r");
    ASSERT_NE((void*)0, fp);
    bzero(&act_data, sizeof(act_data));
gejun's avatar
gejun committed
142
    ASSERT_EQ((size_t)1, fread(&act_data, sizeof(act_data), 1, fp));
gejun's avatar
gejun committed
143 144 145 146 147 148
    fclose(fp);
    
    ASSERT_EQ(0, memcmp(&data2, &act_data, sizeof(data2)));

}
}