前期准备:
测试之前需要下载gtest
我用的是gtest1.7.0 链接: https://pan.baidu.com/s/1jHEyazk 密码: cbvg
如果从官网下载gtest,需要多一步自己编译gtest/msvc下的VC工程文件gtest.sln。
建立测试工程,将gtest/include添加到头文件路径中;将gtestd.lib或者gtest.lib添加到包含库中。
开始测试:
我先对CreateFile进行了简单的测试:
因为我需要对C盘和挂载盘进行测试对比,所以一开始定义了两个盘符变量。
#include "stdafx.h"
#include <gtest/gtest.h>
#include <string>
#include <afx.h>
char test_0[] = "A:/";
char test_c_0[] = "C:/";
class CreateTest : public::testing::TestWithParam<::testing::tuple<DWORD, DWORD, DWORD>> {};
TEST_P(CreateTest, HandleTrueReturn1) { //CREATE_NEW 文件不存在时
//获取CreateFile各种参数的组合情况
DWORD n1 = ::testing::get<0>(GetParam());
DWORD n2 = ::testing::get<1>(GetParam());
DWORD n3 = ::testing::get<2>(GetParam());
//路径拼接+字符串类型变换
char test_path_c[100];
strcpy_s(test_path_c, test_c_0);
strcat_s(test_path_c, "1.txt");
CString cstr_c = test_path_c;
LPCTSTR path_c = (LPCTSTR)cstr_c;
HANDLE fFile01_c = (HANDLE)CreateFile(path_c, n1, n2, NULL, CREATE_NEW, n3, NULL);
DWORD lss = GetLastError();
CloseHandle(fFile01_c);
DeleteFile(path_c);
char test_path[100];
strcpy_s(test_path, test_0);
strcat_s(test_path, "1.txt");
CString cstr = test_path;
LPCTSTR path = (LPCTSTR)cstr;
HANDLE fFile01 = (HANDLE)CreateFile(path, n1, n2, NULL, CREATE_NEW, n3, NULL);
DWORD lss2 = GetLastError();
CloseHandle(fFile01);
DeleteFile(path);
EXPECT_EQ(lss, lss2);
}
TEST_P(CreateTest, HandleTrueReturn2) { //CREATE_NEW 文件存在时
DWORD n1 = ::testing::get<0>(GetParam());
DWORD n2 = ::testing::get<1>(GetParam());
DWORD n3 = ::testing::get<2>(GetParam());
char test_path_c[100];
strcpy_s(test_path_c, test_c_0);
strcat_s(test_path_c, "2.txt");
CString cstr_c = test_path_c;
LPCTSTR path_c = (LPCTSTR)cstr_c;
HANDLE fFile01_c = (HANDLE)CreateFile(path_c, n1, n2, NULL, CREATE_NEW, n3, NULL);
CloseHandle(fFile01_c);
HANDLE fFile1_c = (HANDLE)CreateFile(path_c, n1, n2, NULL, CREATE_NEW, n3, NULL);
DWORD lss = GetLastError();
CloseHandle(fFile1_c);
DeleteFile(path_c);
char test_path[100];
strcpy_s(test_path, test_0);
strcat_s(test_path, "2.txt");
CString cstr = test_path;
LPCTSTR path = (LPCTSTR)cstr;
HANDLE fFile01 = (HANDLE)CreateFile(path, n1, n2, NULL, CREATE_NEW, n3, NULL);
CloseHandle(fFile01);
HANDLE fFile1 = (HANDLE)CreateFile(path, n1, n2, NULL, CREATE_NEW, n3, NULL);
DWORD lss2 = GetLastError();
CloseHandle(fFile1);
DeleteFile(path);
EXPECT_EQ(lss, lss2);
}
DWORD A_0[4] = { GENERIC_WRITE ,GENERIC_READ,0,GENERIC_READ | GENERIC_WRITE };
DWORD B_0[4] = { 0,FILE_SHARE_DELETE,FILE_SHARE_READ,FILE_SHARE_WRITE };
DWORD D_0[4] = {FILE_ATTRIBUTE_ENCRYPTED,FILE_ATTRIBUTE_HIDDEN,FILE_ATTRIBUTE_NORMAL,FILE_ATTRIBUTE_READONLY};
//gtest框里的combine函数可以将给定值进行排列组合
INSTANTIATE_TEST_CASE_P(Return, CreateTest, testing::Combine(testing::Values(A_0[0],
A_0[1], A_0[2], A_0[3]), testing::Values(B_0[0], B_0[1], B_0[2], B_0[3]),
testing::Values(D_0[0], D_0[1], D_0[2])
));
int main(int argc, _TCHAR* argv[]) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
接下来是枚举文件的测试,同样是C盘与挂载盘:
#include "stdafx.h"
#include <gtest/gtest.h>
#include <iostream>
#include <string.h>
#include <Strsafe.h>
#include <afx.h>
using namespace std;
char test_7[] = "A:/";
char test_c_7[] = "C:/";
class EnumFileTest : public::testing::TestWithParam<int> {
};
DWORD TraverseDirectory(wchar_t Dir[MAX_PATH], char flag) //传入路径
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
//定义要遍历的文件夹的目录
wchar_t DirSpec[MAX_PATH];
// DWORD dwError;
StringCchCopy(DirSpec, MAX_PATH, Dir);
//定义要遍历的文件夹的完整路径\*
StringCchCat(DirSpec, MAX_PATH, TEXT("\\*"));
//找到文件夹中的第一个文件
hFind = FindFirstFile(DirSpec, &FindFileData);
DWORD lss = GetLastError();
//如果hFind句柄创建失败,输出错误信息
if (hFind == INVALID_HANDLE_VALUE)
{
FindClose(hFind);
return lss;
}
else
{
//当文件或者文件夹存在时
while (FindNextFile(hFind, &FindFileData) != 0)
{
//判断是文件夹&&表示为"."||表示为".."
if ((FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) != 0 &&
wcscmp(FindFileData.cFileName, L".") == 0 ||
wcscmp(FindFileData.cFileName, L"..") == 0)
{
continue;
}
//判断如果是文件夹
if ((FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) != 0)
{
wchar_t DirAdd[MAX_PATH];
StringCchCopy(DirAdd, MAX_PATH, Dir);
StringCchCat(DirAdd, MAX_PATH, TEXT("\\"));
//拼接得到此文件夹的完整路径
StringCchCat(DirAdd, MAX_PATH, FindFileData.cFileName);
//递归调用
TraverseDirectory(DirAdd, flag);
}
//如果不是文件夹的情况
if ((FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) == 0)
{
//输出完整路径
wcout << Dir << "\\" << FindFileData.cFileName << endl;
if (flag == 'A') {
wchar_t Dir0[MAX_PATH];
char test_path_c[MAX_PATH];
test_path_c[0] = 'C';
for (int i = 1; i < MAX_PATH; i++)
{
test_path_c[i] = Dir[i];
}
strcat_s(test_path_c, "\\");
char file_na[256];
int iLength = WideCharToMultiByte(CP_ACP, 0, FindFileData.cFileName, -1,
NULL, 0, NULL, NULL);
//将tchar值赋给_char
WideCharToMultiByte(CP_ACP, 0, FindFileData.cFileName, -1, file_na, iLength,
NULL, NULL);
strcat_s(test_path_c, file_na);
CString cstr_c = test_path_c;
LPCTSTR path_c = (LPCTSTR)cstr_c;
//简单判断下是否另一个盘是否有这个文件
//该判断只写了个单向的,真正判断两个盘枚举文件的正确性需要再写一个判断
HANDLE fFile = (HANDLE)CreateFile(path_c, GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
DWORD lss0 = GetLastError();
CloseHandle(fFile);
if (lss0 == 2) {
wcout << "--------------------------------------------------------"
<< "---------------------------The another disk is no this file "
<< "!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
}
}
}
}
FindClose(hFind);
return 0;
}
}
TEST_P(EnumFileTest, HandleTrueReturn1) {
char test_path_c[100];
strcpy_s(test_path_c, test_c_7);
strcat_s(test_path_c, "EnumFileTest");
size_t len_c = strlen(test_path_c) + 1;
size_t converted_c = 0;
wchar_t *path_c = (wchar_t*)malloc(len_c * sizeof(wchar_t));
mbstowcs_s(&converted_c, path_c, len_c, test_path_c, _TRUNCATE);
DWORD lss1 = TraverseDirectory(path_c, 'C');
char test_path[100];
strcpy_s(test_path, test_7);
strcat_s(test_path, "EnumFileTest");
size_t len = strlen(test_path) + 1;
size_t converted = 0;
wchar_t *path = (wchar_t*)malloc(len * sizeof(wchar_t));
mbstowcs_s(&converted, path, len, test_path, _TRUNCATE);
DWORD lss2 = TraverseDirectory(path, 'A');
EXPECT_EQ(lss1, lss2);
}
INSTANTIATE_TEST_CASE_P(Return, EnumFileTest, testing::Values(0));