From 16e689746e15a08d9998bcb84d0e4120ef1e646a Mon Sep 17 00:00:00 2001
From: Nickolay Olshevsky <o.nickolay@gmail.com>
Date: Thu, 26 Sep 2024 16:38:41 +0300
Subject: [PATCH] CI: update test cases with more date parsing cases

---
 src/tests/cli_tests.py | 90 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 90 insertions(+)

diff --git a/src/tests/cli_tests.py b/src/tests/cli_tests.py
index c74818681b..3cc7b8cac1 100755
--- a/src/tests/cli_tests.py
+++ b/src/tests/cli_tests.py
@@ -3712,6 +3712,96 @@ def test_set_current_time(self):
         RNP2 = RNPDIR + '2'
         os.mkdir(RNP2, 0o700)
 
+        # Too old date
+        is64bit = sys.maxsize > 2 ** 32
+        gparam = ['--homedir', RNP2, '--notty', '--password', PASSWORD, '--generate-key', '--numbits', '1024', '--current-time']
+        rparam = ['--homedir', RNP2, '--notty', '--remove-key']
+        ret, out, err = run_proc(RNPK, gparam + ['1950-01-02', '--userid', 'key-1950'])
+        self.assertEqual(ret, 0)
+        self.assertRegex(err, r'(?s)^.*invalid date: 1950-01-02.*$')
+        self.assertRegex(out, r'(?s)^.*Generating a new key\.\.\..*$')
+        ret, _, _ = run_proc(RNPK, rparam + ['key-1950'], 'y\n')
+        self.assertEqual(ret, 0)
+
+        # Old unix timestamp
+        ret, out, _ = run_proc(RNPK, gparam + ['1000', '--userid', 'key-ts-1000'])
+        self.assertEqual(ret, 0)
+        self.assertRegex(out, r'(?s)^.*Generating a new key\.\.\..*sec.*1970\-01\-0.*EXPIRES 1972\-.*ssb.*1970\-01\-0.*EXPIRES 1972\-.*$')
+        ret, _, _ = run_proc(RNPK, rparam + ['key-ts-1000'], 'y\n')
+        self.assertEqual(ret, 0)
+
+        # Modern timestamp
+        ret, out, _ = run_proc(RNPK, gparam + ['1727777777', '--userid', 'key-ts-modern'])
+        self.assertEqual(ret, 0)
+        self.assertRegex(out, r'(?s)^.*Generating a new key\.\.\..*sec.*2024\-10\-.*EXPIRES 2026\-.*ssb.*2024\-10\-0.*EXPIRES 2026\-.*$')
+        ret, _, _ = run_proc(RNPK, rparam + ['key-ts-modern'], 'y\n')
+        self.assertEqual(ret, 0)
+
+        # Try day 31 of the 30-day month
+        ret, out, err = run_proc(RNPK, gparam + ['2024-06-31', '--userid', 'key-31'])
+        self.assertEqual(ret, 0)
+        self.assertRegex(err, r'(?s)^.*invalid date: 2024-06-31.*$')
+        self.assertRegex(out, r'(?s)^.*Generating a new key\.\.\..*$')
+        ret, _, _ = run_proc(RNPK, rparam + ['key-31'], 'y\n')
+        self.assertEqual(ret, 0)
+
+        # Try day 32 of the 31-day month
+        ret, out, err = run_proc(RNPK, gparam + ['2024-05-32', '--userid', 'key-32'])
+        self.assertEqual(ret, 0)
+        self.assertRegex(err, r'(?s)^.*invalid date: 2024-05-32.*$')
+        self.assertRegex(out, r'(?s)^.*Generating a new key\.\.\..*$')
+        ret, _, _ = run_proc(RNPK, rparam + ['key-32'], 'y\n')
+        self.assertEqual(ret, 0)
+
+        # Try 29 of February for non-leap year
+        ret, out, err = run_proc(RNPK, gparam + ['2022-02-29', '--userid', 'key-2922'])
+        self.assertEqual(ret, 0)
+        self.assertRegex(err, r'(?s)^.*invalid date: 2022-02-29.*$')
+        self.assertRegex(out, r'(?s)^.*Generating a new key\.\.\..*$')
+        ret, _, _ = run_proc(RNPK, rparam + ['key-2922'], 'y\n')
+        self.assertEqual(ret, 0)
+
+        # Try 29 of February for leap year
+        ret, out, err = run_proc(RNPK, gparam + ['2024-02-29', '--userid', 'key-2924'])
+        self.assertEqual(ret, 0)
+        self.assertNotRegex(err, r'(?s)^.*invalid date.*$')
+        self.assertRegex(out, r'(?s)^.*Generating a new key\.\.\..*sec.*2024\-02\-.*EXPIRES 2026\-.*ssb.*2024\-02\-.*EXPIRES 2026\-.*$')
+        ret, _, _ = run_proc(RNPK, rparam + ['key-2924'], 'y\n')
+        self.assertEqual(ret, 0)
+
+        # Try wrong month number
+        ret, out, err = run_proc(RNPK, gparam + ['2022-17-29', '--userid', 'key-17m'])
+        self.assertEqual(ret, 0)
+        self.assertRegex(err, r'(?s)^.*invalid date: 2022-17-29.*$')
+        self.assertRegex(out, r'(?s)^.*Generating a new key\.\.\..*$')
+        ret, _, _ = run_proc(RNPK, rparam + ['key-17m'], 'y\n')
+        self.assertEqual(ret, 0)
+
+        # Try too large expiration month value
+        ret, _, err = run_proc(RNPK, gparam + ['2024-02-29', '--expiration', '9999999999999m', '--userid', 'key-2924'])
+        self.assertEqual(ret, 1)
+        self.assertRegex(err, r'(?s)^.*Invalid expiration \'9999999999999\'.*$')
+        self.assertRegex(err, r'(?s)^.*Failed to set primary key expiration..*$')
+
+        # Try too large expiration in years
+        ret, _, err = run_proc(RNPK, gparam + ['2024-02-29', '--expiration', '1000y', '--userid', 'key-2924'])
+        self.assertEqual(ret, 1)
+        self.assertRegex(err, r'(?s)^.*Expiration value exceed 32 bit.*$')
+        self.assertRegex(err, r'(?s)^.*Failed to set primary key expiration..*$')
+
+        # Try too distant date for expiration
+        ret, out, err = run_proc(RNPK, gparam + ['2024-02-29', '--expiration', '3024-02-29', '--userid', 'key-2924'])
+        if is64bit:
+            self.assertEqual(ret, 1)
+            self.assertRegex(err, r'(?s)^.*Expiration time exceeds 32-bit value.*$')
+            self.assertRegex(err, r'(?s)^.*Failed to set primary key expiration..*$')
+        else:
+            self.assertEqual(ret, 0)
+            self.assertRegex(err, r'(?s)^.*Warning: date 3024-02-29 is beyond of 32-bit time_t, so timestamp was reduced to maximum supported value.*$')
+            self.assertRegex(out, r'(?s)^.*EXPIRES >=2038-01-19.*$')
+            ret, _, _ = run_proc(RNPK, rparam + ['key-2924'], 'y\n')
+            self.assertEqual(ret, 0)
+
         # Generate key back in the past
         ret, out, _ = run_proc(RNPK, ['--homedir', RNP2, '--notty', '--password', PASSWORD, '--generate-key', '--current-time', '2015-02-02', '--userid', 'key-2015'])
         self.assertEqual(ret, 0)