3ef7ff83ca
This is a fairly simple implementation of a copy-on-write tree. The node walk function starts off at the root, with 'inplace == true'. If it ever encounters a node with a refcount greater than one (including the root node), then that node is shared with other trees, and cannot be modified in place, so the inplace flag is cleared and we copy on write from there on down. Xenstore write has 'mkdir -p' semantics and will create the intermediate nodes if they don't already exist, so in that case we flip the inplace flag back to true as we populate the newly-created nodes. We put a copy of the absolute path into the buffer in the struct walk_op, with *two* NUL terminators at the end. As xs_node_walk() goes down the tree, it replaces the next '/' separator with a NUL so that it can use the 'child name' in place. The next recursion down then puts the '/' back and repeats the exercise for the next path element... if it doesn't hit that *second* NUL termination which indicates the true end of the path. Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> Reviewed-by: Paul Durrant <paul@xen.org>
196 lines
5.8 KiB
Meson
196 lines
5.8 KiB
Meson
|
|
testblock = declare_dependency(dependencies: [block], sources: 'iothread.c')
|
|
|
|
tests = {
|
|
'check-block-qdict': [],
|
|
'check-qdict': [],
|
|
'check-qnum': [],
|
|
'check-qstring': [],
|
|
'check-qlist': [],
|
|
'check-qnull': [],
|
|
'check-qobject': [],
|
|
'check-qjson': [],
|
|
'check-qlit': [],
|
|
'test-qobject-output-visitor': [testqapi],
|
|
'test-clone-visitor': [testqapi],
|
|
'test-qobject-input-visitor': [testqapi],
|
|
'test-forward-visitor': [testqapi],
|
|
'test-string-input-visitor': [testqapi],
|
|
'test-string-output-visitor': [testqapi],
|
|
'test-opts-visitor': [testqapi],
|
|
'test-visitor-serialization': [testqapi],
|
|
'test-bitmap': [],
|
|
# all code tested by test-x86-cpuid is inside topology.h
|
|
'test-x86-cpuid': [],
|
|
'test-cutils': [],
|
|
'test-div128': [],
|
|
'test-shift128': [],
|
|
'test-mul64': [],
|
|
# all code tested by test-int128 is inside int128.h
|
|
'test-int128': [],
|
|
'rcutorture': [],
|
|
'test-rcu-list': [],
|
|
'test-rcu-simpleq': [],
|
|
'test-rcu-tailq': [],
|
|
'test-rcu-slist': [],
|
|
'test-qdist': [],
|
|
'test-qht': [],
|
|
'test-bitops': [],
|
|
'test-bitcnt': [],
|
|
'test-qgraph': ['../qtest/libqos/qgraph.c'],
|
|
'check-qom-interface': [qom],
|
|
'check-qom-proplist': [qom],
|
|
'test-qemu-opts': [],
|
|
'test-keyval': [testqapi],
|
|
'test-logging': [],
|
|
'test-uuid': [],
|
|
'ptimer-test': ['ptimer-test-stubs.c', meson.project_source_root() / 'hw/core/ptimer.c'],
|
|
'test-qapi-util': [],
|
|
'test-interval-tree': [],
|
|
'test-xs-node': [qom],
|
|
}
|
|
|
|
if have_system or have_tools
|
|
tests += {
|
|
'test-qmp-event': [testqapi],
|
|
}
|
|
|
|
if seccomp.found()
|
|
tests += {'test-seccomp': ['../../softmmu/qemu-seccomp.c', seccomp]}
|
|
endif
|
|
endif
|
|
|
|
if have_block
|
|
tests += {
|
|
'test-coroutine': [testblock],
|
|
'test-aio': [testblock],
|
|
'test-aio-multithread': [testblock],
|
|
'test-throttle': [testblock],
|
|
'test-thread-pool': [testblock],
|
|
'test-hbitmap': [testblock],
|
|
'test-bdrv-drain': [testblock],
|
|
'test-bdrv-graph-mod': [testblock],
|
|
'test-blockjob': [testblock],
|
|
'test-blockjob-txn': [testblock],
|
|
'test-block-backend': [testblock],
|
|
'test-block-iothread': [testblock],
|
|
'test-write-threshold': [testblock],
|
|
'test-crypto-hash': [crypto],
|
|
'test-crypto-hmac': [crypto],
|
|
'test-crypto-cipher': [crypto],
|
|
'test-crypto-akcipher': [crypto],
|
|
'test-crypto-secret': [crypto, keyutils],
|
|
'test-crypto-der': [crypto],
|
|
'test-authz-simple': [authz],
|
|
'test-authz-list': [authz],
|
|
'test-authz-listfile': [authz],
|
|
'test-io-task': [testblock],
|
|
'test-io-channel-socket': ['socket-helpers.c', 'io-channel-helpers.c', io],
|
|
'test-io-channel-file': ['io-channel-helpers.c', io],
|
|
'test-io-channel-command': ['io-channel-helpers.c', io],
|
|
'test-io-channel-buffer': ['io-channel-helpers.c', io],
|
|
'test-io-channel-null': [io],
|
|
'test-crypto-ivgen': [io],
|
|
'test-crypto-afsplit': [io],
|
|
'test-crypto-block': [io],
|
|
}
|
|
if gnutls.found() and \
|
|
tasn1.found() and \
|
|
'CONFIG_POSIX' in config_host
|
|
tests += {
|
|
'test-crypto-tlscredsx509': ['crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c',
|
|
tasn1, crypto, gnutls],
|
|
'test-crypto-tlssession': ['crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', 'crypto-tls-psk-helpers.c',
|
|
tasn1, crypto, gnutls],
|
|
'test-io-channel-tls': ['io-channel-helpers.c', 'crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c',
|
|
tasn1, io, crypto, gnutls]}
|
|
endif
|
|
if pam.found()
|
|
tests += {'test-authz-pam': [authz]}
|
|
endif
|
|
if xts == 'private'
|
|
tests += {'test-crypto-xts': [crypto, io]}
|
|
endif
|
|
if 'CONFIG_POSIX' in config_host
|
|
tests += {'test-image-locking': [testblock]}
|
|
endif
|
|
if config_host_data.get('CONFIG_REPLICATION')
|
|
tests += {'test-replication': [testblock]}
|
|
endif
|
|
if nettle.found() or gcrypt.found()
|
|
tests += {'test-crypto-pbkdf': [io]}
|
|
endif
|
|
if config_host_data.get('CONFIG_EPOLL_CREATE1')
|
|
tests += {'test-fdmon-epoll': [testblock]}
|
|
endif
|
|
endif
|
|
|
|
if have_system
|
|
tests += {
|
|
'test-iov': [],
|
|
'test-qmp-cmds': [testqapi],
|
|
'test-xbzrle': [migration],
|
|
'test-timed-average': [],
|
|
'test-util-sockets': ['socket-helpers.c'],
|
|
'test-base64': [],
|
|
'test-bufferiszero': [],
|
|
'test-smp-parse': [qom, meson.project_source_root() / 'hw/core/machine-smp.c'],
|
|
'test-vmstate': [migration, io],
|
|
'test-yank': ['socket-helpers.c', qom, io, chardev]
|
|
}
|
|
if config_host_data.get('CONFIG_INOTIFY1')
|
|
tests += {'test-util-filemonitor': []}
|
|
endif
|
|
|
|
# Some tests: test-char, test-qdev-global-props, and test-qga,
|
|
# are not runnable under TSan due to a known issue.
|
|
# https://github.com/google/sanitizers/issues/1116
|
|
if 'CONFIG_TSAN' not in config_host
|
|
if 'CONFIG_POSIX' in config_host
|
|
tests += {
|
|
'test-char': ['socket-helpers.c', qom, io, chardev]
|
|
}
|
|
endif
|
|
|
|
tests += {
|
|
'test-qdev-global-props': [qom, hwcore]
|
|
}
|
|
endif
|
|
endif
|
|
|
|
if have_ga and targetos == 'linux'
|
|
tests += {'test-qga': ['../qtest/libqmp.c']}
|
|
test_deps += {'test-qga': qga}
|
|
endif
|
|
|
|
test_env = environment()
|
|
test_env.set('G_TEST_SRCDIR', meson.current_source_dir())
|
|
test_env.set('G_TEST_BUILDDIR', meson.current_build_dir())
|
|
|
|
slow_tests = {
|
|
'test-crypto-tlscredsx509': 45,
|
|
'test-crypto-tlssession': 45
|
|
}
|
|
|
|
foreach test_name, extra: tests
|
|
src = [test_name + '.c']
|
|
deps = [qemuutil]
|
|
if extra.length() > 0
|
|
# use a sourceset to quickly separate sources and deps
|
|
test_ss = ss.source_set()
|
|
test_ss.add(extra)
|
|
src += test_ss.all_sources()
|
|
deps += test_ss.all_dependencies()
|
|
endif
|
|
exe = executable(test_name, src, genh, dependencies: deps)
|
|
|
|
test(test_name, exe,
|
|
depends: test_deps.get(test_name, []),
|
|
env: test_env,
|
|
args: ['--tap', '-k'],
|
|
protocol: 'tap',
|
|
timeout: slow_tests.get(test_name, 30),
|
|
priority: slow_tests.get(test_name, 30),
|
|
suite: ['unit'])
|
|
endforeach
|