In some cases the license-identification header was missing, so I added that as well. Replaced the remaining headers that specifically identified "Versions 3.13.7 and higher". Makefiles and the build system were deliberately excluded.
156 lines
3.7 KiB
C
156 lines
3.7 KiB
C
/*************************************************************************\
|
|
* Copyright (c) 2018 Michael Davidsaver
|
|
* SPDX-License-Identifier: EPICS
|
|
* EPICS BASE is distributed subject to a Software License Agreement found
|
|
* in file LICENSE that is included with this distribution.
|
|
\*************************************************************************/
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <testMain.h>
|
|
#include <epicsUnitTest.h>
|
|
|
|
#include <errSymTbl.h>
|
|
#include <epicsString.h>
|
|
#include <osiFileName.h>
|
|
#include <errlog.h>
|
|
|
|
#include <asLib.h>
|
|
|
|
static char *asUser,
|
|
*asHost;
|
|
static int asAsl;
|
|
|
|
static void setUser(const char *name)
|
|
{
|
|
free(asUser);
|
|
asUser = epicsStrDup(name);
|
|
}
|
|
|
|
static void setHost(const char *name)
|
|
{
|
|
free(asHost);
|
|
asHost = epicsStrDup(name);
|
|
}
|
|
|
|
static void testAccess(const char *asg, unsigned mask)
|
|
{
|
|
ASMEMBERPVT asp = 0; /* aka dbCommon::asp */
|
|
ASCLIENTPVT client = 0;
|
|
long ret;
|
|
|
|
ret = asAddMember(&asp, asg);
|
|
if(ret) {
|
|
testFail("testAccess(ASG:%s, USER:%s, HOST:%s, ASL:%d) -> asAddMember error: %s",
|
|
asg, asUser, asHost, asAsl, errSymMsg(ret));
|
|
} else {
|
|
ret = asAddClient(&client, asp, asAsl, asUser, asHost);
|
|
}
|
|
if(ret) {
|
|
testFail("testAccess(ASG:%s, USER:%s, HOST:%s, ASL:%d) -> asAddClient error: %s",
|
|
asg, asUser, asHost, asAsl, errSymMsg(ret));
|
|
} else {
|
|
unsigned actual = 0;
|
|
actual |= asCheckGet(client) ? 1 : 0;
|
|
actual |= asCheckPut(client) ? 2 : 0;
|
|
testOk(actual==mask, "testAccess(ASG:%s, USER:%s, HOST:%s, ASL:%d) -> %x == %x",
|
|
asg, asUser, asHost, asAsl, actual, mask);
|
|
}
|
|
if(client) asRemoveClient(&client);
|
|
if(asp) asRemoveMember(&asp);
|
|
}
|
|
|
|
static void testSyntaxErrors(void)
|
|
{
|
|
static const char empty[] = "\n#almost empty file\n\n";
|
|
long ret;
|
|
|
|
testDiag("testSyntaxErrors()");
|
|
|
|
eltc(0);
|
|
ret = asInitMem(empty, NULL);
|
|
testOk(ret==S_asLib_badConfig, "load \"empty\" config -> %s", errSymMsg(ret));
|
|
eltc(1);
|
|
}
|
|
static const char hostname_config[] = ""
|
|
"HAG(foo) {localhost}\n"
|
|
"ASG(DEFAULT) {RULE(0, NONE)}\n"
|
|
"ASG(ro) {RULE(0, NONE)RULE(1, READ) {HAG(foo)}}\n"
|
|
"ASG(rw) {RULE(1, WRITE) {HAG(foo)}}\n"
|
|
;
|
|
|
|
static void testHostNames(void)
|
|
{
|
|
testDiag("testHostNames()");
|
|
asCheckClientIP = 0;
|
|
|
|
testOk1(asInitMem(hostname_config, NULL)==0);
|
|
|
|
setUser("testing");
|
|
setHost("localhost");
|
|
asAsl = 0;
|
|
|
|
testAccess("invalid", 0);
|
|
testAccess("DEFAULT", 0);
|
|
testAccess("ro", 1);
|
|
testAccess("rw", 3);
|
|
|
|
setHost("127.0.0.1");
|
|
|
|
testAccess("invalid", 0);
|
|
testAccess("DEFAULT", 0);
|
|
testAccess("ro", 0);
|
|
testAccess("rw", 0);
|
|
|
|
setHost("guaranteed.invalid.");
|
|
|
|
testAccess("invalid", 0);
|
|
testAccess("DEFAULT", 0);
|
|
testAccess("ro", 0);
|
|
testAccess("rw", 0);
|
|
}
|
|
|
|
static void testUseIP(void)
|
|
{
|
|
testDiag("testUseIP()");
|
|
asCheckClientIP = 1;
|
|
|
|
/* still host names in .acf */
|
|
testOk1(asInitMem(hostname_config, NULL)==0);
|
|
/* now resolved to IPs */
|
|
|
|
setUser("testing");
|
|
setHost("localhost"); /* will not match against resolved IP */
|
|
asAsl = 0;
|
|
|
|
testAccess("invalid", 0);
|
|
testAccess("DEFAULT", 0);
|
|
testAccess("ro", 0);
|
|
testAccess("rw", 0);
|
|
|
|
setHost("127.0.0.1");
|
|
|
|
testAccess("invalid", 0);
|
|
testAccess("DEFAULT", 0);
|
|
testAccess("ro", 1);
|
|
testAccess("rw", 3);
|
|
|
|
setHost("guaranteed.invalid.");
|
|
|
|
testAccess("invalid", 0);
|
|
testAccess("DEFAULT", 0);
|
|
testAccess("ro", 0);
|
|
testAccess("rw", 0);
|
|
}
|
|
|
|
MAIN(aslibtest)
|
|
{
|
|
testPlan(27);
|
|
testSyntaxErrors();
|
|
testHostNames();
|
|
testUseIP();
|
|
errlogFlush();
|
|
return testDone();
|
|
}
|