blob: c17e8158e1b22e74a4e32c7a5ab988cb38b06cb6 [file] [log] [blame]
/*
*
* Copyright (c) 2020 Google LLC.
* Copyright (c) 2016-2017 Nest Labs, Inc.
* All rights reserved.
*
* 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.
*/
/**
* @file
* This file implements a process to effect a functional test for
* the Weave profile status support string interfaces.
*
*/
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif
#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS
#endif
#include <nlunit-test.h>
#include <inttypes.h>
#include <stdio.h>
#include <Weave/Core/WeaveCore.h>
#include <Weave/Profiles/WeaveProfiles.h>
#include <Weave/Profiles/common/CommonProfile.h>
#if WEAVE_CONFIG_BDX_NAMESPACE == kWeaveManagedNamespace_Development
#include <Weave/Profiles/bulk-data-transfer/Development/BulkDataTransfer.h>
#else
#include <Weave/Profiles/bulk-data-transfer/BulkDataTransfer.h>
#endif
#include <Weave/Profiles/service-directory/ServiceDirectory.h>
#define WEAVE_CONFIG_DATA_MANAGEMENT_NAMESPACE kWeaveManagedNamespace_Current
#include <Weave/Profiles/data-management/Current/MessageDef.h>
#include <Weave/Profiles/device-control/DeviceControl.h>
#include <Weave/Profiles/fabric-provisioning/FabricProvisioning.h>
#include <Weave/Profiles/network-provisioning/NetworkProvisioning.h>
#include <Weave/Profiles/security/WeaveSecurity.h>
#include <Weave/Profiles/software-update/SoftwareUpdateProfile.h>
#include <Weave/Profiles/service-provisioning/ServiceProvisioning.h>
#include <Weave/Profiles/weave-tunneling/WeaveTunnelControl.h>
#include "ToolCommon.h"
using namespace nl::Weave::Profiles;
// Test input data.
struct Profile_Status {
WeaveProfileId id;
const char *fmt;
uint8_t statusCount;
uint16_t statusCodes[23];
};
static struct Profile_Status sContext[] = {
{
kWeaveProfile_BDX,
"[ BDX(%08" PRIX32 "):%" PRIu16 " ]",
#if WEAVE_CONFIG_BDX_NAMESPACE == kWeaveManagedNamespace_Development
7,
{
BulkDataTransfer::kStatus_Overflow,
BulkDataTransfer::kStatus_LengthTooShort,
BulkDataTransfer::kStatus_XferFailedUnknownErr,
BulkDataTransfer::kStatus_XferMethodNotSupported,
BulkDataTransfer::kStatus_UnknownFile,
BulkDataTransfer::kStatus_StartOffsetNotSupported,
BulkDataTransfer::kStatus_Unknown,
}
#else
15,
{
BulkDataTransfer::kStatus_Overflow,
BulkDataTransfer::kStatus_LengthTooLarge,
BulkDataTransfer::kStatus_LengthTooShort,
BulkDataTransfer::kStatus_LengthMismatch,
BulkDataTransfer::kStatus_LengthRequired,
BulkDataTransfer::kStatus_BadMessageContents,
BulkDataTransfer::kStatus_BadBlockCounter,
BulkDataTransfer::kStatus_XferFailedUnknownErr,
BulkDataTransfer::kStatus_ServerBadState,
BulkDataTransfer::kStatus_FailureToSend,
BulkDataTransfer::kStatus_XferMethodNotSupported,
BulkDataTransfer::kStatus_UnknownFile,
BulkDataTransfer::kStatus_StartOffsetNotSupported,
BulkDataTransfer::kStatus_VersionNotSupported,
BulkDataTransfer::kStatus_Unknown,
}
#endif // WEAVE_CONFIG_BDX_NAMESPACE == kWeaveManagedNamespace_Development
},
{
kWeaveProfile_Common,
"[ Common(%08" PRIX32 "):%" PRIu16 " ]",
14,
{
Common::kStatus_Success,
Common::kStatus_BadRequest,
Common::kStatus_UnsupportedMessage,
Common::kStatus_UnexpectedMessage,
Common::kStatus_AuthenticationRequired,
Common::kStatus_AccessDenied,
Common::kStatus_OutOfMemory,
Common::kStatus_NotAvailable,
Common::kStatus_LocalSetupRequired,
Common::kStatus_Relocated,
Common::kStatus_Busy,
Common::kStatus_Timeout,
Common::kStatus_InternalError,
Common::kStatus_Continue,
}
},
{
kWeaveProfile_WDM,
"[ WDM(%08" PRIX32 "):%" PRIu16 " ]",
21,
{
DataManagement_Legacy::kStatus_CancelSuccess,
DataManagement_Legacy::kStatus_InvalidPath,
DataManagement_Legacy::kStatus_UnknownTopic,
DataManagement_Legacy::kStatus_IllegalReadRequest,
DataManagement_Legacy::kStatus_IllegalWriteRequest,
DataManagement_Legacy::kStatus_InvalidVersion,
DataManagement_Legacy::kStatus_UnsupportedSubscriptionMode,
DataManagement_Current::kStatus_InvalidValueInNotification,
DataManagement_Current::kStatus_InvalidPath,
DataManagement_Current::kStatus_ExpiryTimeNotSupported,
DataManagement_Current::kStatus_NotTimeSyncedYet,
DataManagement_Current::kStatus_RequestExpiredInTime,
DataManagement_Current::kStatus_VersionMismatch,
DataManagement_Current::kStatus_GeneralProtocolError,
DataManagement_Current::kStatus_SecurityError,
DataManagement_Current::kStatus_InvalidSubscriptionID,
DataManagement_Current::kStatus_GeneralSchemaViolation,
DataManagement_Current::kStatus_UnpairedDeviceRejected,
DataManagement_Current::kStatus_IncompatibleDataSchemaVersion,
DataManagement_Current::kStatus_MultipleFailures,
DataManagement_Current::kStatus_UpdateOutOfSequence,
}
},
{
kWeaveProfile_DeviceControl,
"[ DeviceControl(%08" PRIX32 "):%" PRIu16 " ]",
9,
{
DeviceControl::kStatusCode_FailSafeAlreadyActive,
DeviceControl::kStatusCode_NoFailSafeActive,
DeviceControl::kStatusCode_NoMatchingFailSafeActive,
DeviceControl::kStatusCode_UnsupportedFailSafeMode,
DeviceControl::kStatusCode_RemotePassiveRendezvousTimedOut,
DeviceControl::kStatusCode_UnsecuredListenPreempted,
DeviceControl::kStatusCode_ResetSuccessCloseCon,
DeviceControl::kStatusCode_ResetNotAllowed,
DeviceControl::kStatusCode_NoSystemTestDelegate,
}
},
{
kWeaveProfile_FabricProvisioning,
"[ FabricProvisioning(%08" PRIX32 "):%" PRIu16 " ]",
3,
{
FabricProvisioning::kStatusCode_AlreadyMemberOfFabric,
FabricProvisioning::kStatusCode_NotMemberOfFabric,
FabricProvisioning::kStatusCode_InvalidFabricConfig,
}
},
{
kWeaveProfile_NetworkProvisioning,
"[ NetworkProvisioning(%08" PRIX32 "):%" PRIu16 " ]",
11,
{
NetworkProvisioning::kStatusCode_UnknownNetwork,
NetworkProvisioning::kStatusCode_TooManyNetworks,
NetworkProvisioning::kStatusCode_InvalidNetworkConfiguration,
NetworkProvisioning::kStatusCode_UnsupportedNetworkType,
NetworkProvisioning::kStatusCode_UnsupportedWiFiMode,
NetworkProvisioning::kStatusCode_UnsupportedWiFiRole,
NetworkProvisioning::kStatusCode_UnsupportedWiFiSecurityType,
NetworkProvisioning::kStatusCode_InvalidState,
NetworkProvisioning::kStatusCode_TestNetworkFailed,
NetworkProvisioning::kStatusCode_NetworkConnectFailed,
NetworkProvisioning::kStatusCode_NoRouterAvailable,
}
},
{
kWeaveProfile_Security,
"[ Security(%08" PRIX32 "):%" PRIu16 " ]",
23,
{
Security::kStatusCode_SessionAborted,
Security::kStatusCode_PASESupportsOnlyConfig1,
Security::kStatusCode_NoCommonPASEConfigurations,
Security::kStatusCode_UnsupportedEncryptionType,
Security::kStatusCode_InvalidKeyId,
Security::kStatusCode_DuplicateKeyId,
Security::kStatusCode_KeyConfirmationFailed,
Security::kStatusCode_InternalError,
Security::kStatusCode_AuthenticationFailed,
Security::kStatusCode_UnsupportedCASEConfiguration,
Security::kStatusCode_UnsupportedCertificate,
Security::kStatusCode_NoCommonPASEConfigurations,
Security::kStatusCode_KeyNotFound,
Security::kStatusCode_WrongEncryptionType,
Security::kStatusCode_UnknownKeyType,
Security::kStatusCode_InvalidUseOfSessionKey,
Security::kStatusCode_InternalKeyError,
Security::kStatusCode_NoCommonKeyExportConfiguration,
Security::kStatusCode_UnauthorizedKeyExportRequest,
Security::kStatusCode_NoNewOperationalCertRequired,
Security::kStatusCode_OperationalNodeIdInUse,
Security::kStatusCode_InvalidOperationalNodeId,
Security::kStatusCode_InvalidOperationalCertificate,
}
},
{
kWeaveProfile_ServiceDirectory,
"[ ServiceDirectory(%08" PRIX32 "):%" PRIu16 " ]",
1,
{
ServiceDirectory::kStatus_DirectoryUnavailable,
}
},
{
kWeaveProfile_ServiceProvisioning,
"[ ServiceProvisioning(%08" PRIX32 "):%" PRIu16 " ]",
11,
{
ServiceProvisioning::kStatusCode_TooManyServices,
ServiceProvisioning::kStatusCode_ServiceAlreadyRegistered,
ServiceProvisioning::kStatusCode_InvalidServiceConfig,
ServiceProvisioning::kStatusCode_NoSuchService,
ServiceProvisioning::kStatusCode_PairingServerError,
ServiceProvisioning::kStatusCode_InvalidPairingToken,
ServiceProvisioning::kStatusCode_PairingTokenOld,
ServiceProvisioning::kStatusCode_ServiceCommunicationError,
ServiceProvisioning::kStatusCode_ServiceConfigTooLarge,
ServiceProvisioning::kStatusCode_WrongFabric,
ServiceProvisioning::kStatusCode_TooManyFabrics,
}
},
{
kWeaveProfile_SWU,
"[ SWU(%08" PRIX32 "):%" PRIu16 " ]",
7,
{
SoftwareUpdate::kStatus_NoUpdateAvailable,
SoftwareUpdate::kStatus_UpdateFailed,
SoftwareUpdate::kStatus_InvalidInstructions,
SoftwareUpdate::kStatus_DownloadFailed,
SoftwareUpdate::kStatus_IntegrityCheckFailed,
SoftwareUpdate::kStatus_Abort,
SoftwareUpdate::kStatus_Retry,
}
},
#if WEAVE_CONFIG_ENABLE_TUNNELING
{
kWeaveProfile_Tunneling,
"[ WeaveTunnel(%08" PRIX32 "):%" PRIu16 " ]",
4,
{
WeaveTunnel::kStatusCode_TunnelOpenFail,
WeaveTunnel::kStatusCode_TunnelCloseFail,
WeaveTunnel::kStatusCode_TunnelRouteUpdateFail,
WeaveTunnel::kStatusCode_TunnelReconnectFail,
}
},
#endif
};
static const size_t kTestElements = sizeof(sContext) / sizeof(sContext[0]);
static void CheckStatusReportStrStart(nlTestSuite *inSuite, void *inContext)
{
char statusStr[1024];
// init statusStr with default status sting, which is for the status that does not have a well defined description string
// then compare the actural StatusReportStr(status) with statusStr to ensure that each status has its description sting
for (size_t ith = 0; ith < kTestElements; ith++)
{
for (uint16_t jth = 0; jth < sContext[ith].statusCount; jth++)
{
snprintf(statusStr, sizeof(statusStr), sContext[ith].fmt, sContext[ith].id, sContext[ith].statusCodes[jth]);
NL_TEST_ASSERT(inSuite, (strcmp(nl::StatusReportStr(sContext[ith].id, sContext[ith].statusCodes[jth]), statusStr) != 0));
}
}
}
/**
* Test Suite. It lists all the test functions.
*/
static const nlTest sTests[] = {
NL_TEST_DEF("StatusReportStr", CheckStatusReportStrStart),
NL_TEST_SENTINEL()
};
int main(void)
{
nlTestSuite theSuite = {
"status-report-strings",
&sTests[0],
NULL,
NULL
};
// Generate machine-readable, comma-separated value (CSV) output.
nl_test_set_output_style(OUTPUT_CSV);
// Run test suit againt one context.
nlTestRunner(&theSuite, &sContext);
return nlTestRunnerStats(&theSuite);
}