Milestone 5: deliver embedded RDP sessions and lifecycle hardening
This commit is contained in:
149
third_party/FreeRDP/libfreerdp/codec/test/TestFreeRDPHelpers.c
vendored
Normal file
149
third_party/FreeRDP/libfreerdp/codec/test/TestFreeRDPHelpers.c
vendored
Normal file
@@ -0,0 +1,149 @@
|
||||
/**
|
||||
* FreeRDP: A Remote Desktop Protocol Implementation
|
||||
*
|
||||
* Copyright 2025 Thincast Technologies GmbH
|
||||
* Copyright 2025 Armin Novak <anovak@thincast.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <winpr/path.h>
|
||||
#include <winpr/file.h>
|
||||
#include <winpr/debug.h>
|
||||
#include <winpr/print.h>
|
||||
|
||||
#include "TestFreeRDPHelpers.h"
|
||||
|
||||
static char* get_path(const char* codec, const char* type, const char* name)
|
||||
{
|
||||
char path[500] = WINPR_C_ARRAY_INIT;
|
||||
(void)snprintf(path, sizeof(path), "%s-%s-%s.bin", codec, type, name);
|
||||
char* s1 = GetCombinedPath(CMAKE_CURRENT_SOURCE_DIR, codec);
|
||||
if (!s1)
|
||||
return nullptr;
|
||||
|
||||
char* s2 = GetCombinedPath(s1, path);
|
||||
free(s1);
|
||||
return s2;
|
||||
}
|
||||
|
||||
static FILE* open_path(const char* codec, const char* type, const char* name, const char* mode)
|
||||
{
|
||||
WINPR_ASSERT(type);
|
||||
WINPR_ASSERT(name);
|
||||
WINPR_ASSERT(mode);
|
||||
|
||||
char* path = get_path(codec, type, name);
|
||||
if (!path)
|
||||
{
|
||||
(void)printf("%s: get_path %s %s failed\n", __func__, type, name);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
FILE* fp = winpr_fopen(path, mode);
|
||||
if (!fp)
|
||||
{
|
||||
char buffer[128] = WINPR_C_ARRAY_INIT;
|
||||
(void)printf("%s: %s %s: fopen(%s, %s) failed: %s\n", __func__, type, name, path, mode,
|
||||
winpr_strerror(errno, buffer, sizeof(buffer)));
|
||||
}
|
||||
free(path);
|
||||
return fp;
|
||||
}
|
||||
|
||||
void* test_codec_helper_read_data(const char* codec, const char* type, const char* name,
|
||||
size_t* plength)
|
||||
{
|
||||
WINPR_ASSERT(type);
|
||||
WINPR_ASSERT(name);
|
||||
WINPR_ASSERT(plength);
|
||||
|
||||
void* rc = nullptr;
|
||||
void* cmp = nullptr;
|
||||
|
||||
*plength = 0;
|
||||
FILE* fp = open_path(codec, type, name, "rb");
|
||||
if (!fp)
|
||||
goto fail;
|
||||
|
||||
if (_fseeki64(fp, 0, SEEK_END) != 0)
|
||||
goto fail;
|
||||
|
||||
const size_t pos = _ftelli64(fp);
|
||||
|
||||
if (_fseeki64(fp, 0, SEEK_SET) != 0)
|
||||
goto fail;
|
||||
|
||||
cmp = calloc(pos, 1);
|
||||
if (!cmp)
|
||||
goto fail;
|
||||
|
||||
if (fread(cmp, 1, pos, fp) != pos)
|
||||
goto fail;
|
||||
|
||||
*plength = pos;
|
||||
rc = cmp;
|
||||
cmp = nullptr;
|
||||
|
||||
fail:
|
||||
(void)printf("%s: [%s] %s %s -> %p\n", __func__, codec, type, name, rc);
|
||||
free(cmp);
|
||||
if (fp)
|
||||
(void)fclose(fp);
|
||||
return rc;
|
||||
}
|
||||
|
||||
void test_codec_helper_write_data(const char* codec, const char* type, const char* name,
|
||||
const void* data, size_t length)
|
||||
{
|
||||
FILE* fp = open_path(codec, type, name, "wb");
|
||||
if (!fp)
|
||||
return;
|
||||
|
||||
if (fwrite(data, 1, length, fp) != length)
|
||||
goto fail;
|
||||
|
||||
fail:
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
bool test_codec_helper_compare(const char* codec, const char* type, const char* name,
|
||||
const void* data, size_t length)
|
||||
{
|
||||
bool rc = false;
|
||||
size_t cmplen = 0;
|
||||
void* cmp = test_codec_helper_read_data(codec, type, name, &cmplen);
|
||||
if (!cmp)
|
||||
goto fail;
|
||||
if (cmplen != length)
|
||||
{
|
||||
(void)printf("%s: [%s] %s %s: length mismatch: %" PRIuz " vs %" PRIuz "\n", __func__, codec,
|
||||
type, name, cmplen, length);
|
||||
goto fail;
|
||||
}
|
||||
if (memcmp(data, cmp, length) != 0)
|
||||
{
|
||||
(void)printf("%s: [%s] %s %s: data mismatch\n", __func__, codec, type, name);
|
||||
winpr_HexDump(__func__, WLOG_WARN, data, length);
|
||||
winpr_HexDump(__func__, WLOG_WARN, cmp, cmplen);
|
||||
goto fail;
|
||||
}
|
||||
rc = true;
|
||||
fail:
|
||||
(void)printf("%s: [%s] %s %s -> %s\n", __func__, codec, type, name, rc ? "SUCCESS" : "FAILED");
|
||||
free(cmp);
|
||||
return rc;
|
||||
}
|
||||
Reference in New Issue
Block a user