Commit graph

85 commits

Author SHA1 Message Date
Thomas Haller
1a9892620e
test-client: pass LIBNM_CLIENT_DEBUG to nmcli
For debugging libnm, LIBNM_CLIENT_DEBUG can be very useful.

As the tests compare stdout/stderr from nmcli with expected output, just
enabling it will break the tests. However, in combination with
LIBNM_CLIENT_DEBUG_FILE this can be very useful.

Preserve and pass on the environment variables, if set.

(cherry picked from commit 1630009234)
2023-02-08 10:53:06 +01:00
Thomas Haller
0694ecfcc5
test-client: cleanup imports
Sort imports by name. Also avoid "from signal import SIGINT". I find
it ugly to import names in the current namespace. "SIGINT" should be
refered to by its full name, including the package/namespace.

(cherry picked from commit ee17346cee)
2023-02-08 10:53:05 +01:00
Thomas Haller
ba5cbedd2c
test-client: add valgrind support for call_nmcli_pexpect() tests
This will allow to find some memory leaks and memory corruptions.

The bulk of the nmcli calls are still not hooked up with valgrind.
Since we call nmcli a thousand time, we could not just run valgrind with
all of them. We would have instead to enable it randomly. This is
more work.

(cherry picked from commit debf78dbed)
2023-02-08 10:53:05 +01:00
Thomas Haller
0e13811a4b
test-client: drop unused NmTestBase base class
The base class is not used, and it's not clear that it would be useful.
Sure, we could extend "test-client.py" will various non-nmcli tests. That
might make sense. And then it might make sense to have more unit test classes.
So far, we don't need that. Drop the unused base class NmTestBase.

(cherry picked from commit d1e6d53013)
2023-02-08 10:53:05 +01:00
Thomas Haller
05e5a2fefd
test-client: cleanup start/shutdown of stub service
(cherry picked from commit 3e574dda22)
2023-02-08 10:53:05 +01:00
Thomas Haller
c9951d5d32
test-client: accept yes/true/no/false for boolean arguments
(cherry picked from commit b08f7a9c19)
2023-02-08 10:53:05 +01:00
Thomas Haller
d0896a13ee
test-client: add Util.shlex_join() helper
(cherry picked from commit 5da7301ec9)
2023-02-08 10:53:05 +01:00
Thomas Haller
ae4f5a1861
client/tests: temporarily disable failing test test_monitor()
(cherry picked from commit 65ea47580f)
2023-02-01 10:50:13 +01:00
Thomas Haller
5c3b70a1b3
tests/client: increase timeout for nmcli command
Under normal circumstances, the timeout is not supposed to be hit.
I see it hit on gitlab-ci. Was that because the machine was very
busy? It's hard to say whether there was a legitimate problem here,
and more importantly, what that problem was.

Try to increase the timeout. If there is a real problem, we probably
will still hit the timeout.
2022-11-17 13:23:35 +01:00
Lubomir Rintel
aaa9a9cd25 libnm/client: don't reset properties when interface goes away
In case the D-Bus interfaces start dropping off (typically all off them go
one by one when the object is being deleted), don't reset all the properties.

In particular, keep most properties around, only tear down "o" and "ao",
so that the object dependencies get torn down, but we still get enough
properties around to identify what the dead object was its heyday.

One example of where this is not good is when the device-removed signal
is emmitted, the device no longer has the ifname:

  $ nmcli monitor
  <quit NetworkManager>
  (null): device removed
  (null): device removed
  ...
2022-11-13 15:25:19 +01:00
Lubomir Rintel
253bb3579f tests/client: test nmcli monitor
Some basic tests for nmcli monitor. Note that they now assert against
behavior that I find incorrect. Will be fixed separately.
2022-11-13 15:25:01 +01:00
Thomas Haller
36ad9855d1
tests: fix "test-client.py" for early python3 versions
ModuleNotFoundError was only introduced in later python 3 versions.
Use just "ImportError", which is the parent class anyway.

Fixes: f7e484c8ed ('tests: fix "test-client.py" ignoring missing "NM" module')
(cherry picked from commit 9902373c6d)
2022-08-26 00:01:12 +02:00
Thomas Haller
d6d76f900f
tests: fix "test-client.py" ignoring missing "NM" module
Fixes: 8959083784 ('tests: skip test in "test-client.py" if the pexepect dependency is not available')
(cherry picked from commit f7e484c8ed)
2022-08-26 00:01:12 +02:00
Thomas Haller
3dc5943134
tests: skip test in "test-client.py" if the pexepect dependency is not available
(cherry picked from commit 8959083784)
2022-08-26 00:01:11 +02:00
Lubomir Rintel
9a70d4e819 tests/client: add interactive add test 2022-06-30 10:20:44 +02:00
Lubomir Rintel
a3f0db06e4 tests/client: do not consult expected result files if no checks require them
Perhaps the test is not using call_nmcli*(), but still wants to use
@nm_test decorator to set up the mock service.
2022-06-30 10:20:44 +02:00
Lubomir Rintel
9570224e86 tests/client: add a pexpect-based test runner
Useful for testing interactive commands against a mock service.
2022-06-30 10:20:44 +02:00
Thomas Haller
7fd6804e2a
tests/client: improve readme for how to get test-client.py regenerate the test data 2022-05-02 19:03:32 +02:00
Thomas Haller
26a0307b8f
clients/tests: declare encoding of utf-8 python source "test-client.py"
The source file now contains UTF-8 (non ASCII) characters. Python2
doesn't like that:

  "./src/tests/client/test-client.sh" "." "." "/usr/bin/python"
    File "/builddir/build/BUILD/NetworkManager-1.39.2/src/tests/client/test-client.py", line 1730
  SyntaxError: Non-ASCII character '\xe2' in file /builddir/build/BUILD/NetworkManager-1.39.2/src/tests/client/test-client.py on line 1730, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
2022-04-21 12:01:20 +02:00
Thomas Haller
c041b02744
clients/tests: rename function Util.ReplaceTextUsingRegex to Util.ReplaceTextRegex
Seems to be the better name.
2022-04-20 15:47:57 +02:00
Thomas Haller
e35eceb9e3
clients/tests: add code comment and extend pattern in test_offline() 2022-04-20 15:47:01 +02:00
Thomas Haller
6aef83a556
clients/tests: workaround unexpected output for offline test
This test calls "nmcli g" with a bogus D-Bus bus address. We expect
a failure on stderr.

On alpine:latest, the error however looks slightly different:
  b'size: 258\nlocation: src/tests/client/test-client.py:test_offline()/1\ncmd: $NMCLI g\nlang: C\nreturncode: 1\nstderr: 136 bytes\n>>>\nError: Could not create NMClient object: Key/Value pair 0, *invalid*, in address element *very:invalid* does not contain an equal sign.\n\n<<<\n'
On ubuntu:16.04 and debian:9 we got:
  b"size: 258\nlocation: src/tests/client/test-client.py:test_offline()/1\ncmd: $NMCLI g\nlang: C\nreturncode: 1\nstderr: 136 bytes\n>>>\nError: Could not create NMClient object: Key/Value pair 0, 'invalid', in address element 'very:invalid' does not contain an equal sign.\n\n<<<\n"
On fedora and most recent systemd we got:
  b'size: 258\nlocation: src/tests/client/test-client.py:test_offline()/1\ncmd: $NMCLI g\nlang: C\nreturncode: 1\nstderr: 136 bytes\n>>>\nError: Could not create NMClient object: Key/Value pair 0, ?invalid?, in address element ?very:invalid? does not contain an equal sign.\n\n<<<\n'

This depends on the glib version (whether to print `%s', '%s', or “%s”).
Also, as we run the application with lang=C, so that libc (I think)
replaces Unicode with an ASCII character. Here musl and glibc behave
differently.

Workaround by replace the unexpected text.
2022-04-20 15:34:38 +02:00
Thomas Haller
2140da73a4
clients/tests: add code comment for how to get Polish translations on Fedora 2022-04-20 12:29:45 +02:00
Thomas Haller
7986ea8c1a
clients/tests: rework Util.replace_text() to uniformly accept a callable
Let the replace_arr parameter of Util.replace_text() only contain
callables, and don't special case the argument. Previously, we
either expected a regex or a 2-tuple, and the code would check
each explicitly.

Aside that the tuples are hard to follow, it also makes
Util.replace_text() strongly tied to those types. By instead accepting
and arbitrary function, each element can implement its own replacement.

Also, make text that was replaced by regex atomic. Meaning, if we
first match (and replace) a certain part of the text with the regex,
then the replacement cannot be split again. This is done by returning
a 1-tuple from the replace function.
2022-04-20 12:29:45 +02:00
Thomas Haller
a3038d4f5a
clients/tests: fix regular expression match in Util.replace_text()
Seems the previous code did not work properly:
With python36-3.6.8-38.module+el8.5.0+12207+5c5719bc.x86_6 on rhel-8.6:

  Traceback (most recent call last):
    File "/root/nm-build/NetworkManager/src/tests/client/test-client.py", line 1157, in f
      func(self)
    File "/root/nm-build/NetworkManager/src/tests/client/test-client.py", line 1724, in test_offline
      replace_stdout=replace_uuids,
    File "/root/nm-build/NetworkManager/src/tests/client/test-client.py", line 797, in call_nmcli
      frame,
    File "/root/nm-build/NetworkManager/src/tests/client/test-client.py", line 997, in _call_nmcli
      self.async_start(wait_all=sync_barrier)
    File "/root/nm-build/NetworkManager/src/tests/client/test-client.py", line 1032, in async_start
      async_job.wait_and_complete()
    File "/root/nm-build/NetworkManager/src/tests/client/test-client.py", line 670, in wait_and_complete
      self._complete_cb(self, return_code, stdout, stderr)
    File "/root/nm-build/NetworkManager/src/tests/client/test-client.py", line 919, in complete_cb
      stdout = Util.replace_text(stdout, replace_stdout)
    File "/root/nm-build/NetworkManager/src/tests/client/test-client.py", line 362, in replace_text
      if Util.is_regex_pattern(v_search):
    File "/root/nm-build/NetworkManager/src/tests/client/test-client.py", line 208, in is_regex_pattern
      t = re.Pattern
  AttributeError: module 're' has no attribute 'Pattern'

On this python version, re.compile() give an object of type
_sre.SRE_Pattern.

  # python -c 'import re; print(type(re.compile("a")))'
  <class '_sre.SRE_Pattern'>

Fixes: beebde9e56 ('client/test: allow matching and replacing regex-es in nmcli output')
2022-04-20 11:01:15 +02:00
Lubomir Rintel
97857dbacd client/test: add test for --offline behavior
Currently, only "add" and negative cases are tested. Testing "modify"
would require an ability to provide input. Perhaps at some later point.
2022-04-19 14:27:22 +02:00
Lubomir Rintel
e733357c91 client/test: add @nm_test_no_dbus decorator
Same as @nm_test, apart from that it doesn't spawn the mock D-Bus
service.
2022-04-19 14:12:43 +02:00
Lubomir Rintel
9108f8ecfc client/test: allow overriding all environment variables
Set extra variables after the pre-defined ones have been set. This
allows overriding then.

In particular, this allows overriding DBUS_SESSION_BUS_ADDRESS so that
the test can check the behavior of the client is correct when it's set
to some garbage.
2022-04-19 14:12:43 +02:00
Lubomir Rintel
beebde9e56 client/test: allow matching and replacing regex-es in nmcli output
This allows us to sanitize unpredictable UUIDs in client output in
--offline mode (where we can't just ask the mock service about the
actual UUID).
2022-04-19 14:12:43 +02:00
Thomas Haller
101a7cb56d
tests: improve documentation how to generate files for "/test-client.py" 2021-08-26 13:47:04 +02:00
Thomas Haller
56707a09ae
client/tests: check output of plain nmcli in "test-client.py" 2021-07-29 13:25:59 +02:00
Thomas Haller
10567386f0
cli/tests: add unit test for checking setting/getting of "gsm.apn"
"gsm.apn" is special, because it can both be %NULL and "".

Add a test for how we handle that.
2021-05-03 10:11:24 +02:00
Thomas Haller
c2265dd8a9
Revert "tests/client: increase timeout to wait for process"
This didn't help and was not necessary. Instead, there was an issue
that is fixed now.

This reverts commit b4c25f9131.
2021-03-19 11:35:18 +01:00
Thomas Haller
b4c25f9131
tests/client: increase timeout to wait for process
We now get unit test failures hitting this timeout. That is
likely a new bug introduced somewhere, but to rule out that
the timeout is simply too short, increase it.
2021-03-17 10:57:52 +01:00
Thomas Haller
019bc3233a
client/tests: move "clients/tests/test-client.py" to "src/tests/client/"
Note that "test-client.py" currently only tests nmcli. But what it does
is to spawn test-networkmanager-service.py and run nmcli against it.

As such, it could really be used to test any NetworkManager client
against the stub service. Hence this test is not under
"src/nmcli/tests", but under "src/tests/client/" where it is more
general.
2021-03-15 17:10:55 +01:00
Renamed from clients/tests/test-client.py (Browse further)