diff options
author | Aqua-sama <aqua@iserlohn-fortress.net> | 2018-10-16 17:25:40 +0200 |
---|---|---|
committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2018-10-16 17:25:40 +0200 |
commit | c74367d82c1c7bec393548d2e5014c794333822f (patch) | |
tree | 909bcde935c84e566db528b1ab25d81778e13036 /test/adblock | |
parent | Add workaround for QTBUG-62511 (diff) | |
download | smolbote-c74367d82c1c7bec393548d2e5014c794333822f.tar.xz |
urlfilter: Add FilterTree class
FilterTree is a class that holds filter rules, sorted by the domain they
are to be applied on. The rules are to follow FilterLeaf as interface.
- Add a hostlist rule format to FilterTree.
- Add a test for hostlist format.
Diffstat (limited to 'test/adblock')
-rw-r--r-- | test/adblock/adblocktest.cpp | 65 | ||||
-rw-r--r-- | test/adblock/adblocktest.h | 13 |
2 files changed, 78 insertions, 0 deletions
diff --git a/test/adblock/adblocktest.cpp b/test/adblock/adblocktest.cpp new file mode 100644 index 0000000..b31d965 --- /dev/null +++ b/test/adblock/adblocktest.cpp @@ -0,0 +1,65 @@ +#include "adblocktest.h" +#include <QtTest/QtTest> +#include "filterrule.h" +#include "formats/adblockrule.h" + +inline bool check(const std::vector<AdBlockRule> rules, const QUrl &url) +{ + for(const AdBlockRule &rule : rules) { + if(rule.matchesDomain(qHash(url.host())) && rule.matchesUrl(url)) + return true; + } + return false; +} + +void AdBlockTest::parseList() +{ + std::vector<AdBlockRule> rules; + + QFile list("adblock.txt"); + int ruleCount = 0; + QCOMPARE(list.open(QIODevice::ReadOnly | QIODevice::Text), true); + { + QTextStream l(&list); + QString line; + while(l.readLineInto(&line)) { + AdBlockRule rule(line); + if(rule.isEnabled()) { + rules.emplace_back(std::move(rule)); + ruleCount++; + qDebug("added rule: %s", qUtf8Printable(line)); + } + } + } + list.close(); + + // there should be 3 rules + QCOMPARE(rules.size(), ruleCount); + + // block by address part + QCOMPARE(check(rules, QUrl("http://example.com/banner/foo/img")), true); + QCOMPARE(check(rules, QUrl("http://example.com/banner/foo/bar/img?param")), true); + QCOMPARE(check(rules, QUrl("http://example.com/banner//img/foo")), true); + QCOMPARE(check(rules, QUrl("http://example.com/banner/img")), false); + QCOMPARE(check(rules, QUrl("http://example.com/banner/foo/imgraph")), false); + QCOMPARE(check(rules, QUrl("http://example.com/banner/foo/img.gif")), false); + + // block by domain + QCOMPARE(check(rules, QUrl("http://ads.example.com/foo.gif")), true); + QCOMPARE(check(rules, QUrl("http://server1.ads.example.com/foo.gif")), true); + QCOMPARE(check(rules, QUrl("https://ads.example.com:8000/")), true); + QCOMPARE(check(rules, QUrl("http://ads.example.com.ua/foo.gif")), false); + QCOMPARE(check(rules, QUrl("http://example.com/redirect/http://ads.example.com/")), false); + + // block exact address + QCOMPARE(check(rules, QUrl("http://example.com/")), true); + QCOMPARE(check(rules, QUrl("http://example.com/foo.gif")), false); + QCOMPARE(check(rules, QUrl("http://example.info/redirect/http://example.com/")), false); + + // regular expression + QCOMPARE(check(rules, QUrl("http://another.com/banner123")), true); + QCOMPARE(check(rules, QUrl("http://another.com/banner321")), true); + QCOMPARE(check(rules, QUrl("http://another.com/banners")), false); +} + +QTEST_GUILESS_MAIN(AdBlockTest) diff --git a/test/adblock/adblocktest.h b/test/adblock/adblocktest.h new file mode 100644 index 0000000..95cb7e2 --- /dev/null +++ b/test/adblock/adblocktest.h @@ -0,0 +1,13 @@ +#ifndef ADBLOCKTEST_H +#define ADBLOCKTEST_H + +#include <QObject> +class AdBlockTest : public QObject +{ + Q_OBJECT + +private slots: + void parseList(); +}; + +#endif // ADBLOCKTEST_H |