]> git.ipfire.org Git - thirdparty/squid.git/blame - src/tests/testUfs.cc
Maintenance: Removed most NULLs using modernize-use-nullptr (#1075)
[thirdparty/squid.git] / src / tests / testUfs.cc
CommitLineData
4e0938ef 1/*
bf95c10a 2 * Copyright (C) 1996-2022 The Squid Software Foundation and contributors
4e0938ef
AJ
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
f7f3304a 9#include "squid.h"
c8f4eac4 10#include "DiskIO/DiskIOModule.h"
d7ca82e6 11#include "fde.h"
582c2af2
FC
12#include "fs/ufs/UFSSwapDir.h"
13#include "globals.h"
c8f4eac4 14#include "HttpHeader.h"
15#include "HttpReply.h"
58373ff8 16#include "MemObject.h"
f206b652 17#include "RequestFlags.h"
4d5904f7 18#include "SquidConfig.h"
58373ff8 19#include "Store.h"
2745fea5 20#include "store/Disks.h"
582c2af2
FC
21#include "testStoreSupport.h"
22#include "testUfs.h"
7f861c77
AJ
23#include "unitTestMain.h"
24
27e059d4 25#include <stdexcept>
27e059d4 26
0795b38d 27#define TESTDIR "testUfs_Store"
2e050051 28
c8f4eac4 29CPPUNIT_TEST_SUITE_REGISTRATION( testUfs );
30
2745fea5 31typedef RefCount<Fs::Ufs::UFSSwapDir> MySwapDirPointer;
f53969cc 32extern REMOVALPOLICYCREATE createRemovalPolicy_lru; /* XXX fails with --enable-removal-policies=heap */
c8f4eac4 33
34static void
2745fea5 35addSwapDir(MySwapDirPointer aStore)
c8f4eac4 36{
5d84beb5 37 allocate_new_swapdir(Config.cacheSwap);
c8f4eac4 38 Config.cacheSwap.swapDirs[Config.cacheSwap.n_configured] = aStore.getRaw();
39 ++Config.cacheSwap.n_configured;
40}
41
c8f4eac4 42static bool cbcalled;
43
44static void
8b082ed9 45searchCallback(void *)
c8f4eac4 46{
47 cbcalled = true;
48}
49
50void
b7717b61 51testUfs::commonInit()
c8f4eac4 52{
b7717b61 53 static bool inited = false;
c8f4eac4 54
b7717b61 55 if (inited)
56 return;
c8f4eac4 57
58 Config.Store.avgObjectSize = 1024;
c8f4eac4 59 Config.Store.objectsPerBucket = 20;
c8f4eac4 60 Config.Store.maxObjectSize = 2048;
61
62 Config.store_dir_select_algorithm = xstrdup("round-robin");
63
64 Config.replPolicy = new RemovalPolicySettings;
86c63190 65 Config.replPolicy->type = xstrdup("lru");
c8f4eac4 66
c50b35b5
AJ
67 Config.memShared.defaultTo(false);
68
c8f4eac4 69 /* garh garh */
70 storeReplAdd("lru", createRemovalPolicy_lru);
71
72 Mem::Init();
73
d7ca82e6
EB
74 fde::Init();
75
c8f4eac4 76 comm_init();
77
f53969cc 78 httpHeaderInitModule(); /* must go before any header processing (e.g. the one in errorInitialize) */
c8f4eac4 79
b7717b61 80 inited = true;
81}
82
83void
84testUfs::testUfsSearch()
85{
86 /* test sequence
87 * make a valid working ufs swapdir
88 * put two entries in it and sync logs
89 * search the ufs dir
90 * check the entries we find are what we want
91 */
92
93 if (0 > system ("rm -rf " TESTDIR))
94 throw std::runtime_error("Failed to clean test work directory");
95
2745fea5 96 Store::Init();
b7717b61 97
2745fea5 98 MySwapDirPointer aStore (new Fs::Ufs::UFSSwapDir("ufs", "Blocking"));
b7717b61 99
58373ff8 100 aStore->IO = new Fs::Ufs::UFSStrategy(DiskIOModule::Find("Blocking")->createStrategy());
b7717b61 101
102 addSwapDir(aStore);
103
104 commonInit();
c8f4eac4 105 mem_policy = createRemovalPolicy(Config.replPolicy);
106
2e050051 107 char *path=xstrdup(TESTDIR);
c8f4eac4 108
2eceb328 109 char *config_line=xstrdup("100 1 1");
c8f4eac4 110
474dfa84 111 visible_appname_string = xstrdup(PACKAGE "/" VERSION);
112
2eceb328 113 ConfigParser::SetCfgLine(config_line);
c8f4eac4 114
115 aStore->parse(0, path);
b51ec8c8 116 store_maxobjsize = 1024*1024*2;
c8f4eac4 117
118 safe_free(path);
119
120 safe_free(config_line);
121
122 /* ok, ready to create */
123 aStore->create();
124
8ff3fa2e 125 /* ok, ready to use - inits store & hash too */
c8f4eac4 126 Store::Root().init();
127
bef81ea5 128 /* our swapdir must be scheduled to rebuild */
1f8dc0fb 129 CPPUNIT_ASSERT_EQUAL(2, StoreController::store_dirs_rebuilding);
bef81ea5 130
8ff3fa2e 131 /* rebuild is a scheduled event */
132 StockEventLoop loop;
133
02c267b0 134 while (StoreController::store_dirs_rebuilding)
bef81ea5 135 loop.runOnce();
c8f4eac4 136
bef81ea5 137 /* cannot use loop.run(); as the loop will never idle: the store-dir
26ac0430 138 * clean() scheduled event prevents it
bef81ea5 139 */
c8f4eac4 140
bef81ea5 141 /* nothing left to rebuild */
02c267b0 142 CPPUNIT_ASSERT_EQUAL(0, StoreController::store_dirs_rebuilding);
c8f4eac4 143
144 /* add an entry */
145 {
146 /* Create "vary" base object */
f206b652 147 RequestFlags flags;
e857372a 148 flags.cachable = true;
c2a7cefd 149 StoreEntry *pe = storeCreateEntry("dummy url", "dummy log url", flags, Http::METHOD_GET);
66d51f4f
AR
150 auto &reply = pe->mem().adjustableBaseReply();
151 reply.setHeaders(Http::scOkay, "dummy test object", "x-squid-internal/test", 0, -1, squid_curtime + 100000);
c8f4eac4 152
d88e3c49 153 pe->setPublicKey();
c8f4eac4 154
3900307b 155 pe->buffer();
66d51f4f 156 pe->mem().freshestReply().packHeadersUsingSlowPacker(*pe);
3900307b 157 pe->flush();
158 pe->timestampsSet();
c8f4eac4 159 pe->complete();
c07cbbf4 160 pe->swapOut();
5d1dff27
FC
161 CPPUNIT_ASSERT_EQUAL(0, pe->swap_dirn);
162 CPPUNIT_ASSERT_EQUAL(0, pe->swap_filen);
acc5dc4c 163 pe->unlock("testUfs::testUfsSearch vary");
c8f4eac4 164 }
165
166 storeDirWriteCleanLogs(0);
167
168 /* here we cheat: we know that UFSSwapDirs search off disk. If we did an init call to a new
169 * swapdir instance, we'd not be testing a clean build.
170 */
2745fea5 171 StoreSearchPointer search = Store::Root().search(); /* search for everything in the store */
c8f4eac4 172
5d1dff27
FC
173 CPPUNIT_ASSERT_EQUAL(false, search->error());
174 CPPUNIT_ASSERT_EQUAL(false, search->isDone());
aee3523a 175 CPPUNIT_ASSERT_EQUAL(static_cast<StoreEntry *>(nullptr), search->currentItem());
c8f4eac4 176
177 /* trigger a callback */
178 cbcalled = false;
aee3523a 179 search->next(searchCallback, nullptr);
5d1dff27 180 CPPUNIT_ASSERT_EQUAL(true, cbcalled);
c8f4eac4 181
182 /* we should have access to a entry now, that matches the entry we had before */
5d1dff27
FC
183 //CPPUNIT_ASSERT_EQUAL(false, search->next());
184 CPPUNIT_ASSERT_EQUAL(false, search->error());
185 CPPUNIT_ASSERT_EQUAL(false, search->isDone());
aee3523a 186 CPPUNIT_ASSERT(search->currentItem() != nullptr);
c8f4eac4 187
188 /* trigger another callback */
189 cbcalled = false;
aee3523a 190 search->next(searchCallback, nullptr);
5d1dff27 191 CPPUNIT_ASSERT_EQUAL(true, cbcalled);
c8f4eac4 192
193 /* now we should have no error, we should have finished and have no current item */
5d1dff27
FC
194 //CPPUNIT_ASSERT_EQUAL(false, search->next());
195 CPPUNIT_ASSERT_EQUAL(false, search->error());
196 CPPUNIT_ASSERT_EQUAL(true, search->isDone());
aee3523a 197 CPPUNIT_ASSERT_EQUAL(static_cast<StoreEntry *>(nullptr), search->currentItem());
c8f4eac4 198
2745fea5 199 Store::FreeMemory();
d5d5493b 200
c8f4eac4 201 free_cachedir(&Config.cacheSwap);
202
9837567d 203 // TODO: here we should test a dirty rebuild
c8f4eac4 204
b7717b61 205 safe_free(Config.replPolicy->type);
206 delete Config.replPolicy;
207
208 if (0 > system ("rm -rf " TESTDIR))
209 throw std::runtime_error("Failed to clean test work directory");
210}
211
26ac0430 212/* The UFS store should always configure an IO engine even if none is
b7717b61 213 * supplied on the configuration line.
214 */
215void
216testUfs::testUfsDefaultEngine()
217{
218 /* boring common test boilerplate */
219 if (0 > system ("rm -rf " TESTDIR))
220 throw std::runtime_error("Failed to clean test work directory");
221
fe36168c 222 // This assertion may fail if previous test cases fail.
223 // Apparently, CPPUNIT_ASSERT* failure may prevent destructors of local
224 // objects such as "StorePointer aRoot" from being called.
225 CPPUNIT_ASSERT(!store_table); // or StoreHashIndex ctor will abort below
226
2745fea5
AR
227 Store::Init();
228 MySwapDirPointer aStore (new Fs::Ufs::UFSSwapDir("ufs", "Blocking"));
b7717b61 229 addSwapDir(aStore);
230 commonInit();
231 Config.replPolicy = new RemovalPolicySettings;
86c63190 232 Config.replPolicy->type = xstrdup("lru");
b7717b61 233 mem_policy = createRemovalPolicy(Config.replPolicy);
234
235 char *path=xstrdup(TESTDIR);
2eceb328
CT
236 char *config_line=xstrdup("100 1 1");
237 ConfigParser::SetCfgLine(config_line);
b7717b61 238 aStore->parse(0, path);
239 safe_free(path);
240 safe_free(config_line);
aee3523a 241 CPPUNIT_ASSERT(aStore->IO->io != nullptr);
b7717b61 242
2745fea5 243 Store::FreeMemory();
d5d5493b 244 free_cachedir(&Config.cacheSwap);
c8f4eac4 245 safe_free(Config.replPolicy->type);
246 delete Config.replPolicy;
247
2e050051 248 if (0 > system ("rm -rf " TESTDIR))
c8f4eac4 249 throw std::runtime_error("Failed to clean test work directory");
250}
f53969cc 251