belle_sip_tester_windows.cpp 5.15 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 * Copyright (c) 2012-2019 Belledonne Communications SARL.
 *
 * This file is part of belle-sip.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
19 20 21 22
#include <string>

#include "belle_sip_tester_windows.h"

23
using namespace BelledonneCommunications::BelleSip::Tester;
24
using namespace Platform;
25
using namespace Windows::Foundation;
26
using namespace Windows::Storage;
27
using namespace Windows::System::Threading;
28

Ghislain MARY's avatar
Ghislain MARY committed
29
#define MAX_TRACE_SIZE		2048
30
#define MAX_SUITE_NAME_SIZE	128
31
#define MAX_WRITABLE_DIR_SIZE 1024
32 33 34 35

static OutputTraceListener^ sTraceListener;
static belle_sip_object_pool_t *pool;

36
NativeTester^ NativeTester::_instance = ref new NativeTester();
37

38 39 40 41 42 43 44
static void nativeOutputTraceHandler(int lev, const char *fmt, va_list args)
{
	if (sTraceListener) {
		wchar_t wstr[MAX_TRACE_SIZE];
		std::string str;
		str.resize(MAX_TRACE_SIZE);
		vsnprintf((char *)str.c_str(), MAX_TRACE_SIZE, fmt, args);
Ghislain MARY's avatar
Ghislain MARY committed
45
		mbstowcs(wstr, str.c_str(), MAX_TRACE_SIZE - 1);
46
		String^ msg = ref new String(wstr);
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
		String^ l;
		switch (lev) {
		case BELLE_SIP_LOG_FATAL:
		case BELLE_SIP_LOG_ERROR:
			l = ref new String(L"Error");
			break;
		case BELLE_SIP_LOG_WARNING:
			l = ref new String(L"Warning");
			break;
		case BELLE_SIP_LOG_MESSAGE:
			l = ref new String(L"Message");
			break;
		default:
			l = ref new String(L"Debug");
			break;
		}
		sTraceListener->outputTrace(l, msg);
64 65 66
	}
}

67
static void belleSipNativeOutputTraceHandler(void *info, const char *domain, BctbxLogLevel lev, const char *fmt, va_list args)
68 69 70 71
{
	nativeOutputTraceHandler((int)lev, fmt, args);
}

72

73
NativeTester::NativeTester()
74 75 76
{
}

77
NativeTester::~NativeTester()
78 79 80 81
{
	belle_sip_tester_uninit();
}

82
void NativeTester::setOutputTraceListener(OutputTraceListener^ traceListener)
83 84 85 86
{
	sTraceListener = traceListener;
}

87
void NativeTester::initialize(StorageFolder^ writableDirectory, Platform::Boolean ui)
88
{
89 90
	if (ui) {
		belle_sip_tester_init(nativeOutputTraceHandler);
91 92
	}
	else {
93 94
		belle_sip_tester_init(NULL);
		belle_sip_set_log_level(BELLE_SIP_LOG_DEBUG);
95 96 97 98
	}

	belle_sip_tester_set_root_ca_path("Assets/rootca.pem");
	pool = belle_sip_object_pool_push();
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114

	char writable_dir[MAX_WRITABLE_DIR_SIZE] = { 0 };
	const wchar_t *wwritable_dir = writableDirectory->Path->Data();
	wcstombs(writable_dir, wwritable_dir, sizeof(writable_dir));
	bc_tester_set_writable_dir_prefix(writable_dir);
	bc_tester_set_resource_dir_prefix("Assets");

	if (!ui) {
		char *xmlFile = bc_tester_file("BelleSipWindows10.xml");
		char *args[] = { "--xml-file", xmlFile };
		bc_tester_parse_args(2, args, 0);

		char *logFile = bc_tester_file("BelleSipWindows10.log");
		belle_sip_tester_set_log_file(logFile);
		free(logFile);
	}
115 116
}

117
bool NativeTester::run(Platform::String^ suiteName, Platform::String^ caseName, Platform::Boolean verbose)
118 119 120 121 122 123
{
	std::wstring all(L"ALL");
	std::wstring wssuitename = suiteName->Data();
	std::wstring wscasename = caseName->Data();
	char csuitename[MAX_SUITE_NAME_SIZE] = { 0 };
	char ccasename[MAX_SUITE_NAME_SIZE] = { 0 };
124
	bctbx_log_handler_t *log_handler = bctbx_create_log_handler(belleSipNativeOutputTraceHandler, NULL, NULL);
125 126 127
	wcstombs(csuitename, wssuitename.c_str(), sizeof(csuitename));
	wcstombs(ccasename, wscasename.c_str(), sizeof(ccasename));

128 129 130 131 132 133
	if (verbose) {
		belle_sip_set_log_level(BELLE_SIP_LOG_DEBUG);
	}
	else {
		belle_sip_set_log_level(BELLE_SIP_LOG_ERROR);
	}
134
	bctbx_add_log_handler(log_handler);
135
	return bc_tester_run_tests(wssuitename == all ? 0 : csuitename, wscasename == all ? 0 : ccasename, NULL) != 0;
136 137
}

138
void NativeTester::runAllToXml()
139 140
{
	auto workItem = ref new WorkItemHandler([this](IAsyncAction ^workItem) {
141
		bc_tester_start(NULL);
142 143 144 145 146
		bc_tester_uninit();
	});
	_asyncAction = ThreadPool::RunAsync(workItem);
}

147
unsigned int NativeTester::nbTestSuites()
148 149 150 151
{
	return bc_tester_nb_suites();
}

152
unsigned int NativeTester::nbTests(Platform::String^ suiteName)
153 154 155 156 157 158 159
{
	std::wstring suitename = suiteName->Data();
	char cname[MAX_SUITE_NAME_SIZE] = { 0 };
	wcstombs(cname, suitename.c_str(), sizeof(cname));
	return bc_tester_nb_tests(cname);
}

160
Platform::String^ NativeTester::testSuiteName(int index)
161 162 163 164 165 166 167
{
	const char *cname = bc_tester_suite_name(index);
	wchar_t wcname[MAX_SUITE_NAME_SIZE];
	mbstowcs(wcname, cname, sizeof(wcname));
	return ref new String(wcname);
}

168
Platform::String^ NativeTester::testName(Platform::String^ suiteName, int testIndex)
169 170 171 172 173 174 175 176 177
{
	std::wstring suitename = suiteName->Data();
	char csuitename[MAX_SUITE_NAME_SIZE] = { 0 };
	wcstombs(csuitename, suitename.c_str(), sizeof(csuitename));
	const char *cname = bc_tester_test_name(csuitename, testIndex);
	wchar_t wcname[MAX_SUITE_NAME_SIZE];
	mbstowcs(wcname, cname, sizeof(wcname));
	return ref new String(wcname);
}