| 
1 | 1 | import os  | 
 | 2 | +import stat  | 
2 | 3 | import sys  | 
3 | 4 | import unittest  | 
4 | 5 | from contextlib import closing  | 
@@ -115,6 +116,40 @@ def test_readonly_open_without_wal_shm(self):  | 
115 | 116 |         self.assertEqual(self.db[b"key"], b"value")  | 
116 | 117 | 
 
  | 
117 | 118 | 
 
  | 
 | 119 | +class ReadOnlyFilesystem(unittest.TestCase):  | 
 | 120 | + | 
 | 121 | +    def setUp(self):  | 
 | 122 | +        self.test_dir = os_helper.TESTFN  | 
 | 123 | +        os.mkdir(self.test_dir)  | 
 | 124 | +        self.db_path = os.path.join(self.test_dir, "test.db")  | 
 | 125 | + | 
 | 126 | +        db = dbm_sqlite3.open(self.db_path, "c")  | 
 | 127 | +        db[b"key"] = b"value"  | 
 | 128 | +        db.close()  | 
 | 129 | + | 
 | 130 | +    def tearDown(self):  | 
 | 131 | +        os.chmod(self.db_path, stat.S_IWRITE)  | 
 | 132 | +        os.chmod(self.test_dir, stat.S_IWRITE | stat.S_IEXEC | stat.S_IREAD)  | 
 | 133 | +        os_helper.rmtree(self.test_dir)  | 
 | 134 | + | 
 | 135 | +    def test_open_readonly_dir_success_ro(self):  | 
 | 136 | +        os.chmod(self.test_dir, stat.S_IREAD | stat.S_IEXEC)  | 
 | 137 | +        with dbm_sqlite3.open(self.db_path, "r") as db:  | 
 | 138 | +            self.assertEqual(db[b"key"], b"value")  | 
 | 139 | + | 
 | 140 | +    def test_open_readonly_file_success(self):  | 
 | 141 | +        os.chmod(self.db_path, stat.S_IREAD)  | 
 | 142 | +        with dbm_sqlite3.open(self.db_path, "r") as db:  | 
 | 143 | +            self.assertEqual(db[b"key"], b"value")  | 
 | 144 | + | 
 | 145 | +    def test_open_readonly_file_fail_rw(self):  | 
 | 146 | +        os.chmod(self.db_path, stat.S_IREAD)  | 
 | 147 | +        with dbm_sqlite3.open(self.db_path, "w") as db:  | 
 | 148 | +            with self.assertRaises(OSError):  | 
 | 149 | +                db[b"newkey"] = b"newvalue"  | 
 | 150 | + | 
 | 151 | + | 
 | 152 | + | 
118 | 153 | class ReadWrite(_SQLiteDbmTests):  | 
119 | 154 | 
 
  | 
120 | 155 |     def setUp(self):  | 
 | 
0 commit comments