You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdelibs/kioslave/http/kcookiejar/tests/kcookiejartest.cpp

271 lines
6.5 KiB

/*
This file is part of KDE
Copyright (C) 2004 Waldo Bastian (bastian@kde.org)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
version 2 as published by the Free Software Foundation.
This software 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 library; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include <stdio.h>
#include <stdlib.h>
#include <tqdatetime.h>
#include <tqstring.h>
#include <kapplication.h>
#include <kaboutdata.h>
#include <kcmdlineargs.h>
#include <kstandarddirs.h>
#include "../kcookiejar.cpp"
static const char *description = "KCookiejar regression test";
static KCookieJar *jar;
static TQCString *lastYear;
static TQCString *nextYear;
static KConfig *config = 0;
static KCmdLineOptions options[] =
{
{ "+testfile", "Regression test to run", 0},
KCmdLineLastOption
};
static void FAIL(const TQString &msg)
{
qWarning("%s", msg.local8Bit().data());
exit(1);
}
static void popArg(TQCString &command, TQCString & line)
{
int i = line.find(' ');
if (i != -1)
{
command = line.left(i);
line = line.mid(i+1);
}
else
{
command = line;
line = 0;
}
}
static void popArg(TQString &command, TQCString & line)
{
int i = line.find(' ');
if (i != -1)
{
command = TQString::tqfromLatin1(line.left(i));
line = line.mid(i+1);
}
else
{
command = TQString::tqfromLatin1(line);
line = 0;
}
}
static void clearConfig()
{
delete config;
TQString file = locateLocal("config", "kcookiejar-testconfig");
TQFile::remove(file);
config = new KConfig(file);
config->setGroup("Cookie Policy");
config->writeEntry("RejectCrossDomainCookies", false);
config->writeEntry("AcceptSessionCookies", false);
config->writeEntry("IgnoreExpirationDate", false);
config->writeEntry("CookieGlobalAdvice", "Ask");
jar->loadConfig(config, false);
}
static void clearCookies()
{
jar->eatAllCookies();
}
static void saveCookies()
{
TQString file = locateLocal("config", "kcookiejar-testcookies");
TQFile::remove(file);
jar->saveCookies(file);
delete jar;
jar = new KCookieJar();
clearConfig();
jar->loadCookies(file);
}
static void processCookie(TQCString &line)
{
TQString policy;
popArg(policy, line);
KCookieAdvice expectedAdvice = KCookieJar::strToAdvice(policy);
if (expectedAdvice == KCookieDunno)
FAIL(TQString("Unknown accept policy '%1'").arg(policy));
TQString urlStr;
popArg(urlStr, line);
KURL url(urlStr);
if (!url.isValid())
FAIL(TQString("Invalid URL '%1'").arg(urlStr));
if (url.isEmpty())
FAIL(TQString("Missing URL"));
line.replace("%LASTYEAR%", *lastYear);
line.replace("%NEXTYEAR%", *nextYear);
KHttpCookieList list = jar->makeCookies(urlStr, line, 0);
if (list.isEmpty())
FAIL(TQString("Failed to make cookies from: '%1'").arg(line));
for(KHttpCookie *cookie = list.first();
cookie; cookie = list.next())
{
KCookieAdvice cookieAdvice = jar->cookieAdvice(cookie);
if (cookieAdvice != expectedAdvice)
FAIL(urlStr+TQString("\n'%2'\nGot advice '%3' expected '%4'").arg(line)
.arg(KCookieJar::adviceToStr(cookieAdvice))
.arg(KCookieJar::adviceToStr(expectedAdvice)));
jar->addCookie(cookie);
}
}
static void processCheck(TQCString &line)
{
TQString urlStr;
popArg(urlStr, line);
KURL url(urlStr);
if (!url.isValid())
FAIL(TQString("Invalid URL '%1'").arg(urlStr));
if (url.isEmpty())
FAIL(TQString("Missing URL"));
TQString expectedCookies = TQString::tqfromLatin1(line);
TQString cookies = jar->findCookies(urlStr, false, 0, 0).stripWhiteSpace();
if (cookies != expectedCookies)
FAIL(urlStr+TQString("\nGot '%1' expected '%2'")
.arg(cookies, expectedCookies));
}
static void processClear(TQCString &line)
{
if (line == "CONFIG")
clearConfig();
else if (line == "COOKIES")
clearCookies();
else
FAIL(TQString("Unknown command 'CLEAR %1'").arg(line));
}
static void processConfig(TQCString &line)
{
TQCString key;
popArg(key, line);
if (key.isEmpty())
FAIL(TQString("Missing Key"));
config->setGroup("Cookie Policy");
config->writeEntry(key.data(), line.data());
jar->loadConfig(config, false);
}
static void processLine(TQCString line)
{
if (line.isEmpty())
return;
if (line[0] == '#')
{
if (line[1] == '#')
qWarning("%s", line.data());
return;
}
TQCString command;
popArg(command, line);
if (command.isEmpty())
return;
if (command == "COOKIE")
processCookie(line);
else if (command == "CHECK")
processCheck(line);
else if (command == "CLEAR")
processClear(line);
else if (command == "CONFIG")
processConfig(line);
else if (command == "SAVE")
saveCookies();
else
FAIL(TQString("Unknown command '%1'").arg(command));
}
static void runRegression(const TQString &filename)
{
FILE *file = fopen(filename.local8Bit(), "r");
if (!file)
FAIL(TQString("Can't open '%1'").arg(filename));
char buf[4096];
while (fgets(buf, sizeof(buf), file))
{
int l = strlen(buf);
if (l)
{
l--;
buf[l] = 0;
}
processLine(buf);
}
qWarning("%s OK", filename.local8Bit().data());
}
int main(int argc, char *argv[])
{
TQString arg1;
TQCString arg2;
TQString result;
lastYear = new TQCString(TQString("Fri, 04-May-%1 01:00:00 GMT").arg(TQDate::tqcurrentDate().year()-1).utf8());
nextYear = new TQCString(TQString(" expires=Fri, 04-May-%1 01:00:00 GMT").arg(TQDate::tqcurrentDate().year()+1).utf8());
KAboutData about("kcookietest", "kcookietest", "1.0", description, KAboutData::License_GPL, "(C) 2004 Waldo Bastian");
KCmdLineArgs::init( argc, argv, &about);
KCmdLineArgs::addCmdLineOptions( options );
KInstance a("kcookietest");
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
if (args->count() != 1)
KCmdLineArgs::usage();
jar = new KCookieJar;
clearConfig();
TQString file = args->url(0).path();
runRegression(file);
return 0;
}