synapse 2.180.1__py311-none-any.whl → 2.182.0__py311-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of synapse might be problematic. Click here for more details.

Files changed (90) hide show
  1. synapse/assets/__init__.py +35 -0
  2. synapse/assets/storm/migrations/model-0.2.28.storm +355 -0
  3. synapse/common.py +2 -1
  4. synapse/cortex.py +49 -35
  5. synapse/cryotank.py +1 -1
  6. synapse/datamodel.py +30 -0
  7. synapse/lib/ast.py +12 -7
  8. synapse/lib/auth.py +17 -0
  9. synapse/lib/cell.py +7 -9
  10. synapse/lib/chop.py +0 -1
  11. synapse/lib/drive.py +8 -8
  12. synapse/lib/layer.py +55 -13
  13. synapse/lib/lmdbslab.py +26 -5
  14. synapse/lib/modelrev.py +28 -1
  15. synapse/lib/modules.py +1 -0
  16. synapse/lib/nexus.py +1 -1
  17. synapse/lib/node.py +5 -0
  18. synapse/lib/parser.py +23 -16
  19. synapse/lib/scrape.py +1 -1
  20. synapse/lib/slabseqn.py +2 -2
  21. synapse/lib/snap.py +129 -0
  22. synapse/lib/storm.lark +16 -2
  23. synapse/lib/storm.py +20 -3
  24. synapse/lib/storm_format.py +1 -0
  25. synapse/lib/stormhttp.py +34 -1
  26. synapse/lib/stormlib/auth.py +5 -3
  27. synapse/lib/stormlib/cortex.py +5 -2
  28. synapse/lib/stormlib/easyperm.py +2 -2
  29. synapse/lib/stormlib/ipv6.py +2 -2
  30. synapse/lib/stormlib/model.py +114 -12
  31. synapse/lib/stormlib/project.py +1 -1
  32. synapse/lib/stormtypes.py +81 -7
  33. synapse/lib/types.py +7 -0
  34. synapse/lib/version.py +2 -2
  35. synapse/lib/view.py +47 -0
  36. synapse/models/inet.py +10 -3
  37. synapse/models/infotech.py +2 -1
  38. synapse/models/language.py +4 -0
  39. synapse/models/math.py +50 -0
  40. synapse/models/orgs.py +8 -0
  41. synapse/models/risk.py +9 -0
  42. synapse/tests/files/stormcov/pragma-nocov.storm +18 -0
  43. synapse/tests/test_assets.py +25 -0
  44. synapse/tests/test_cortex.py +129 -0
  45. synapse/tests/test_datamodel.py +6 -0
  46. synapse/tests/test_lib_cell.py +12 -0
  47. synapse/tests/test_lib_grammar.py +7 -1
  48. synapse/tests/test_lib_layer.py +35 -0
  49. synapse/tests/test_lib_lmdbslab.py +11 -9
  50. synapse/tests/test_lib_modelrev.py +655 -1
  51. synapse/tests/test_lib_slabseqn.py +5 -4
  52. synapse/tests/test_lib_snap.py +4 -0
  53. synapse/tests/test_lib_storm.py +110 -1
  54. synapse/tests/test_lib_stormhttp.py +99 -1
  55. synapse/tests/test_lib_stormlib_auth.py +15 -0
  56. synapse/tests/test_lib_stormlib_cortex.py +21 -4
  57. synapse/tests/test_lib_stormlib_iters.py +8 -5
  58. synapse/tests/test_lib_stormlib_model.py +45 -6
  59. synapse/tests/test_lib_stormtypes.py +158 -2
  60. synapse/tests/test_lib_types.py +6 -0
  61. synapse/tests/test_model_inet.py +10 -0
  62. synapse/tests/test_model_language.py +4 -0
  63. synapse/tests/test_model_math.py +22 -0
  64. synapse/tests/test_model_orgs.py +6 -2
  65. synapse/tests/test_model_risk.py +4 -0
  66. synapse/tests/test_tools_storm.py +1 -1
  67. synapse/tests/test_utils_stormcov.py +5 -0
  68. synapse/tests/utils.py +18 -5
  69. synapse/utils/stormcov/plugin.py +31 -1
  70. synapse/vendor/cpython/LICENSE +279 -0
  71. synapse/vendor/cpython/__init__.py +0 -0
  72. synapse/vendor/cpython/lib/__init__.py +0 -0
  73. synapse/vendor/cpython/lib/email/__init__.py +0 -0
  74. synapse/vendor/cpython/lib/email/_parseaddr.py +560 -0
  75. synapse/vendor/cpython/lib/email/utils.py +505 -0
  76. synapse/vendor/cpython/lib/ipaddress.py +2366 -0
  77. synapse/vendor/cpython/lib/test/__init__.py +0 -0
  78. synapse/vendor/cpython/lib/test/support/__init__.py +114 -0
  79. synapse/vendor/cpython/lib/test/test_email/__init__.py +0 -0
  80. synapse/vendor/cpython/lib/test/test_email/test_email.py +480 -0
  81. synapse/vendor/cpython/lib/test/test_email/test_utils.py +167 -0
  82. synapse/vendor/cpython/lib/test/test_ipaddress.py +2672 -0
  83. synapse/vendor/utils.py +4 -3
  84. {synapse-2.180.1.dist-info → synapse-2.182.0.dist-info}/METADATA +3 -3
  85. {synapse-2.180.1.dist-info → synapse-2.182.0.dist-info}/RECORD +88 -71
  86. {synapse-2.180.1.dist-info → synapse-2.182.0.dist-info}/WHEEL +1 -1
  87. synapse/lib/jupyter.py +0 -505
  88. synapse/tests/test_lib_jupyter.py +0 -224
  89. {synapse-2.180.1.dist-info → synapse-2.182.0.dist-info}/LICENSE +0 -0
  90. {synapse-2.180.1.dist-info → synapse-2.182.0.dist-info}/top_level.txt +0 -0
@@ -4827,6 +4827,45 @@ class CortexBasicTest(s_t_utils.SynTest):
4827
4827
  q = '$valu={[test:str=foo]} switch $valu { foo: {test:str=foo return($node.value()) } }'
4828
4828
  self.eq('foo', await core.callStorm(q))
4829
4829
 
4830
+ # multi-value switch cases
4831
+ q = '''
4832
+ [test:str=$inval]
4833
+ switch $node.value() {
4834
+ "foo": { return($node.value()) }
4835
+ ("boo", "bar"): { return($node.value()) }
4836
+ (coo, car): { return($node.value()) }
4837
+ ('doo', 'dar'): { return($node.value()) }
4838
+ ("goo", 'gar', gaz): { return($node.value()) }
4839
+ }
4840
+ $lib.raise(BadArg, `Failed match on {$inval}`)
4841
+ '''
4842
+ for inval in ('foo', 'boo', 'bar', 'coo', 'car', 'doo', 'dar', 'goo', 'gar', 'gaz'):
4843
+ valu = await core.callStorm(q, opts={'vars': {'inval': inval}})
4844
+ self.eq(valu, inval)
4845
+
4846
+ # bare asterisk is allowed as a multi-value
4847
+ valu = await core.callStorm('$foo="*" switch $foo { *:{ return(default) } (someval, *): { return(multi) } }')
4848
+ self.eq(valu, 'multi')
4849
+
4850
+ # multiple default cases is invalid
4851
+ msgs = await core.stormlist('$foo=foo switch $foo { *:{} *:{} }')
4852
+ self.stormIsInErr('Switch statements cannot have more than one default case. Found 2.', msgs)
4853
+
4854
+ # multi-value case without a comma
4855
+ msgs = await core.stormlist('$foo=foo switch $foo { (foo bar): { $lib.print(woot) } }')
4856
+ self.stormIsInErr('Unexpected token', msgs)
4857
+ self.stormIsInErr('expecting one of: case multi-value, double-quoted string, single-quoted string', msgs)
4858
+
4859
+ # multi-value case without a second value
4860
+ msgs = await core.stormlist('$foo=foo switch $foo { (foo, ): { $lib.print(woot) } }')
4861
+ self.stormIsInErr('Unexpected token', msgs)
4862
+ self.stormIsInErr('expecting one of: case multi-value, double-quoted string, single-quoted string', msgs)
4863
+
4864
+ # multi-value case without a comma or second value
4865
+ msgs = await core.stormlist('$foo=foo switch $foo { (foo): { $lib.print(woot) } }')
4866
+ self.stormIsInErr('Unexpected token', msgs)
4867
+ self.stormIsInErr('expecting one of: ,', msgs)
4868
+
4830
4869
  async def test_storm_tagvar(self):
4831
4870
 
4832
4871
  async with self.getTestCore() as core:
@@ -7861,17 +7900,23 @@ class CortexBasicTest(s_t_utils.SynTest):
7861
7900
  'view': view.iden,
7862
7901
  })
7863
7902
 
7903
+ othr = s_common.guid()
7864
7904
  info4 = await core.addHttpExtApi({
7905
+ 'iden': othr,
7865
7906
  'path': 'another/item',
7866
7907
  'owner': unfo.get('iden'),
7867
7908
  'view': view.iden,
7868
7909
  })
7910
+ self.eq(info4.get('iden'), othr)
7869
7911
 
7870
7912
  iden = info.get('iden')
7871
7913
 
7872
7914
  adef = await core.getHttpExtApi(iden)
7873
7915
  self.eq(adef, info)
7874
7916
 
7917
+ adef = await core.getHttpExtApi(othr)
7918
+ self.eq(adef, info4)
7919
+
7875
7920
  adef, args = await core.getHttpExtApiByPath('test/path/hehe/wow')
7876
7921
  self.eq(adef, info)
7877
7922
  self.eq(args, ('hehe', 'wow'))
@@ -7916,6 +7961,23 @@ class CortexBasicTest(s_t_utils.SynTest):
7916
7961
 
7917
7962
  # Sad path
7918
7963
 
7964
+ with self.raises(s_exc.SchemaViolation):
7965
+ await core.addHttpExtApi({
7966
+ 'iden': 'lolnope',
7967
+ 'path': 'not/gonna/happen',
7968
+ 'owner': unfo.get('iden'),
7969
+ 'view': view.iden
7970
+ })
7971
+
7972
+ with self.raises(s_exc.DupIden) as ectx:
7973
+ await core.addHttpExtApi({
7974
+ 'iden': othr,
7975
+ 'path': 'bad/dup',
7976
+ 'owner': unfo.get('iden'),
7977
+ 'view': view.iden
7978
+ })
7979
+ self.eq(ectx.exception.get('iden'), othr)
7980
+
7919
7981
  with self.raises(s_exc.SynErr):
7920
7982
  await core.setHttpApiIndx(newp, 0)
7921
7983
 
@@ -7953,6 +8015,10 @@ class CortexBasicTest(s_t_utils.SynTest):
7953
8015
 
7954
8016
  async def test_cortex_query_offload(self):
7955
8017
 
8018
+ async def _hang(*args, **kwargs):
8019
+ await asyncio.sleep(6)
8020
+ return
8021
+
7956
8022
  async with self.getTestAha() as aha:
7957
8023
 
7958
8024
  async with await s_base.Base.anit() as base:
@@ -8028,8 +8094,61 @@ class CortexBasicTest(s_t_utils.SynTest):
8028
8094
  self.isin('Offloading Storm query', data)
8029
8095
  self.notin('Timeout', data)
8030
8096
 
8097
+ with patch('synapse.cortex.CoreApi.getNexsIndx', _hang):
8098
+
8099
+ with self.getLoggerStream('synapse') as stream:
8100
+ msgs = await alist(core00.storm('inet:asn=0'))
8101
+ self.len(1, [m for m in msgs if m[0] == 'node'])
8102
+
8103
+ stream.seek(0)
8104
+ data = stream.read()
8105
+ self.notin('Offloading Storm query', data)
8106
+ self.isin('Timeout waiting for pool mirror [01.core.synapse] Nexus offset', data)
8107
+ self.notin('Timeout waiting for query mirror', data)
8108
+
8109
+ await core00.stormpool.waitready(timeout=12)
8110
+
8111
+ with patch('synapse.telepath.Proxy.getPoolLink', _hang):
8112
+
8113
+ with self.getLoggerStream('synapse') as stream:
8114
+ msgs = await alist(core00.storm('inet:asn=0'))
8115
+ self.len(1, [m for m in msgs if m[0] == 'node'])
8116
+
8117
+ stream.seek(0)
8118
+ data = stream.read()
8119
+ self.notin('Offloading Storm query', data)
8120
+ self.isin('Timeout waiting for pool mirror [01.core.synapse] Nexus offset', data)
8121
+ self.notin('Timeout waiting for query mirror', data)
8122
+
8123
+ await core00.stormpool.waitready(timeout=12)
8124
+
8125
+ with self.getLoggerStream('synapse') as stream:
8126
+ msgs = await alist(core00.storm('inet:asn=0'))
8127
+ self.len(1, [m for m in msgs if m[0] == 'node'])
8128
+
8129
+ stream.seek(0)
8130
+ data = stream.read()
8131
+ self.isin('Offloading Storm query', data)
8132
+ self.notin('Timeout waiting for pool mirror', data)
8133
+ self.notin('Timeout waiting for query mirror', data)
8134
+
8031
8135
  core01.nexsroot.nexslog.indx = 0
8032
8136
 
8137
+ with patch('synapse.cortex.MAX_NEXUS_DELTA', 1):
8138
+
8139
+ nexsoffs = await core00.getNexsIndx()
8140
+
8141
+ with self.getLoggerStream('synapse') as stream:
8142
+ msgs = await alist(core00.storm('inet:asn=0'))
8143
+ self.len(1, [m for m in msgs if m[0] == 'node'])
8144
+
8145
+ stream.seek(0)
8146
+ data = stream.read()
8147
+ explog = (f'Pool mirror [01.core.synapse] Nexus offset delta too large '
8148
+ f'({nexsoffs} > 1), running query locally')
8149
+ self.isin(explog, data)
8150
+ self.notin('Offloading Storm query', data)
8151
+
8033
8152
  with self.getLoggerStream('synapse') as stream:
8034
8153
  msgs = await alist(core00.storm('inet:asn=0'))
8035
8154
  self.len(1, [m for m in msgs if m[0] == 'node'])
@@ -8076,6 +8195,16 @@ class CortexBasicTest(s_t_utils.SynTest):
8076
8195
  with self.raises(s_exc.TimeOut):
8077
8196
  await core00.count('inet:asn=0', opts=opts)
8078
8197
 
8198
+ core00.stormpool.ready.clear()
8199
+
8200
+ with self.getLoggerStream('synapse') as stream:
8201
+ msgs = await alist(core00.storm('inet:asn=0'))
8202
+ self.len(1, [m for m in msgs if m[0] == 'node'])
8203
+
8204
+ stream.seek(0)
8205
+ data = stream.read()
8206
+ self.isin('Timeout waiting for pool mirror, running query locally', data)
8207
+
8079
8208
  await core01.fini()
8080
8209
 
8081
8210
  with self.getLoggerStream('synapse') as stream:
@@ -63,6 +63,12 @@ class DataModelTest(s_t_utils.SynTest):
63
63
  with self.raises(s_exc.BadFormDef):
64
64
  core.model.addForm('woot:two', {}, ())
65
65
 
66
+ with self.raises(s_exc.NoSuchForm):
67
+ core.model.reqForm('newp:newp')
68
+
69
+ with self.raises(s_exc.NoSuchProp):
70
+ core.model.reqForm('inet:asn').reqProp('newp')
71
+
66
72
  async def test_datamodel_formname(self):
67
73
  modl = s_datamodel.Model()
68
74
  mods = (
@@ -2355,6 +2355,18 @@ class CellTest(s_t_utils.SynTest):
2355
2355
 
2356
2356
  async with self.getTestCore() as core:
2357
2357
 
2358
+ # This tmp_reason assertion seems counter-intuitive at first; but it's really
2359
+ # asserting that the message which was incorrectly being logged is no longer logged.
2360
+ log_enable_writes = f'Free space on {core.dirn} above minimum threshold'
2361
+ with self.getAsyncLoggerStream('synapse.lib.cell', log_enable_writes) as stream:
2362
+ await core.nexsroot.addWriteHold(tmp_reason := 'something else')
2363
+ self.false(await stream.wait(1))
2364
+ stream.seek(0)
2365
+ self.eq(stream.read(), '')
2366
+
2367
+ await core.nexsroot.delWriteHold(tmp_reason)
2368
+ revt.clear()
2369
+
2358
2370
  self.len(1, await core.nodes('[inet:fqdn=vertex.link]'))
2359
2371
 
2360
2372
  with mock.patch('shutil.disk_usage', full_disk):
@@ -619,6 +619,10 @@ Queries = [
619
619
  switch $foo {
620
620
  bar: { [ +#ohai ] break }
621
621
  baz: { [ +#visi ] continue }
622
+ (far, faz): { [ +#multi.far ] continue }
623
+ ("gar", "gaz"): { [ +#multi.gar ] continue }
624
+ ('har', 'haz'): { [ +#multi.har ] continue }
625
+ ("kar", 'kaz', koo): { [ +#multi.kar ] continue }
622
626
  }
623
627
 
624
628
  [ inet:ipv4=5.6.7.8 ]
@@ -1251,7 +1255,9 @@ _ParseResults = [
1251
1255
  'Query: [EditNodeAdd: [FormName: [Const: test:str], Const: =, Const: c], SwitchCase: [VarValue: [Const: woot], CaseEntry: [Const: hehe, SubQuery: [Query: [EditTagAdd: [TagName: [Const: baz]]]]], CaseEntry: [SubQuery: [Query: [EditTagAdd: [TagName: [Const: jaz]]]]]]]',
1252
1256
  'Query: [EditNodeAdd: [FormName: [Const: test:str], Const: =, Const: c], SwitchCase: [VarValue: [Const: woot], CaseEntry: [Const: hehe, SubQuery: [Query: [EditTagAdd: [TagName: [Const: baz]]]]], CaseEntry: [Const: haha hoho, SubQuery: [Query: [EditTagAdd: [TagName: [Const: faz]]]]], CaseEntry: [Const: lolz:lulz, SubQuery: [Query: [EditTagAdd: [TagName: [Const: jaz]]]]]]]',
1253
1257
  'Query: [EditNodeAdd: [FormName: [Const: inet:ipv4], Const: =, Const: 1.2.3.4], SwitchCase: [VarValue: [Const: foo], CaseEntry: [Const: bar, SubQuery: [Query: [EditTagAdd: [TagName: [Const: hehe, Const: haha]]]]], CaseEntry: [Const: baz faz, SubQuery: [Query: []]]]]',
1254
- 'Query: [ForLoop: [Const: foo, VarValue: [Const: foos], SubQuery: [Query: [EditNodeAdd: [FormName: [Const: inet:ipv4], Const: =, Const: 1.2.3.4], SwitchCase: [VarValue: [Const: foo], CaseEntry: [Const: bar, SubQuery: [Query: [EditTagAdd: [TagName: [Const: ohai]], BreakOper: []]]], CaseEntry: [Const: baz, SubQuery: [Query: [EditTagAdd: [TagName: [Const: visi]], ContinueOper: []]]]], EditNodeAdd: [FormName: [Const: inet:ipv4], Const: =, Const: 5.6.7.8], EditTagAdd: [TagName: [Const: hehe]]]]]]',
1258
+
1259
+ 'Query: [ForLoop: [Const: foo, VarValue: [Const: foos], SubQuery: [Query: [EditNodeAdd: [FormName: [Const: inet:ipv4], Const: =, Const: 1.2.3.4], SwitchCase: [VarValue: [Const: foo], CaseEntry: [Const: bar, SubQuery: [Query: [EditTagAdd: [TagName: [Const: ohai]], BreakOper: []]]], CaseEntry: [Const: baz, SubQuery: [Query: [EditTagAdd: [TagName: [Const: visi]], ContinueOper: []]]], CaseEntry: [Const: far, Const: faz, SubQuery: [Query: [EditTagAdd: [TagName: [Const: multi, Const: far]], ContinueOper: []]]], CaseEntry: [Const: gar, Const: gaz, SubQuery: [Query: [EditTagAdd: [TagName: [Const: multi, Const: gar]], ContinueOper: []]]], CaseEntry: [Const: har, Const: haz, SubQuery: [Query: [EditTagAdd: [TagName: [Const: multi, Const: har]], ContinueOper: []]]], CaseEntry: [Const: kar, Const: kaz, Const: koo, SubQuery: [Query: [EditTagAdd: [TagName: [Const: multi, Const: kar]], ContinueOper: []]]]], EditNodeAdd: [FormName: [Const: inet:ipv4], Const: =, Const: 5.6.7.8], EditTagAdd: [TagName: [Const: hehe]]]]]]',
1260
+
1255
1261
  'Query: [SwitchCase: [VarValue: [Const: a], CaseEntry: [Const: a, SubQuery: [Query: []]]]]',
1256
1262
  'Query: [SwitchCase: [VarValue: [Const: a], CaseEntry: [Const: test:str, SubQuery: [Query: []]], CaseEntry: [SubQuery: [Query: []]]]]',
1257
1263
  'Query: [SwitchCase: [VarValue: [Const: a], CaseEntry: [Const: test:this:works:, SubQuery: [Query: []]], CaseEntry: [SubQuery: [Query: []]]]]',
@@ -2238,3 +2238,38 @@ class LayerTest(s_t_utils.SynTest):
2238
2238
  self.false(layr.nodeeditslab.lenv.flags()['readahead'])
2239
2239
  self.false(layr.dataslab.readahead)
2240
2240
  self.false(layr.dataslab.lenv.flags()['readahead'])
2241
+
2242
+ async def test_layer_delete_with_nodedata(self):
2243
+
2244
+ async with self.getTestCore() as core:
2245
+
2246
+ fork00 = await core.view.fork()
2247
+ infork00 = {'view': fork00['iden']}
2248
+ layr00 = core.getLayer(fork00['layers'][0]['iden'])
2249
+
2250
+ iden = await core.callStorm('[ inet:ipv4=1.2.3.4 ] return($node.iden())')
2251
+
2252
+ sodes = await s_t_utils.alist(layr00.getStorNodesByForm('inet:ipv4'))
2253
+ self.len(0, sodes)
2254
+
2255
+ q = '''
2256
+ inet:ipv4=1.2.3.4
2257
+ $node.data.set("key", "valu")
2258
+ '''
2259
+ await core.callStorm(q, opts=infork00)
2260
+
2261
+ sodes = await s_t_utils.alist(layr00.getStorNodesByForm('inet:ipv4'))
2262
+ self.len(1, sodes)
2263
+
2264
+ q = '''
2265
+ view.exec $fork00 {
2266
+ yield $iden
2267
+ $lib.print($node)
2268
+ delnode --deledges --force
2269
+ }
2270
+ '''
2271
+ opts = {'vars': {'iden': iden, 'fork00': fork00['iden']}}
2272
+ await core.callStorm(q, opts=opts)
2273
+
2274
+ sodes = await s_t_utils.alist(layr00.getStorNodesByForm('inet:ipv4'))
2275
+ self.len(0, sodes)
@@ -295,8 +295,9 @@ class LmdbSlabTest(s_t_utils.SynTest):
295
295
  self.eq(items, ((b'\x00\x02', b'haha'), (b'\x00\x01', b'hehe')))
296
296
 
297
297
  # Copy a database inside the same slab
298
- self.raises(s_exc.DataAlreadyExists, slab.copydb, foo, slab, 'bar')
299
- self.eq(3, slab.copydb(foo, slab, 'foo2'))
298
+ with self.raises(s_exc.DataAlreadyExists):
299
+ await slab.copydb(foo, slab, 'bar')
300
+ self.eq(3, await slab.copydb(foo, slab, 'foo2'))
300
301
 
301
302
  # Increase the size of the new source DB to trigger a resize on the next copydb
302
303
  foo2 = slab.initdb('foo2')
@@ -312,7 +313,7 @@ class LmdbSlabTest(s_t_utils.SynTest):
312
313
  async with await s_lmdbslab.Slab.anit(path2, map_size=512 * 1024) as slab2:
313
314
  with patch('synapse.lib.lmdbslab.PROGRESS_PERIOD', 2):
314
315
 
315
- self.eq(4, slab.copydb(foo2, slab2, destdbname='foo2', progresscb=progfunc))
316
+ self.eq(4, await slab.copydb(foo2, slab2, destdbname='foo2', progresscb=progfunc))
316
317
  self.gt(vardict.get('prog', 0), 0)
317
318
 
318
319
  # Test slab.drop and slab.dbexists
@@ -808,7 +809,8 @@ class LmdbSlabTest(s_t_utils.SynTest):
808
809
  self.raises(s_exc.IsReadOnly, newdb.replace, b'1234', b'3456')
809
810
  self.raises(s_exc.IsReadOnly, newdb.pop, b'1234')
810
811
  self.raises(s_exc.IsReadOnly, newdb.delete, b'1234')
811
- self.raises(s_exc.IsReadOnly, newdb.putmulti, ((b'1234', b'3456'),))
812
+ with self.raises(s_exc.IsReadOnly):
813
+ await newdb.putmulti((b'1234', b'3456'))
812
814
 
813
815
  # While we have the DB open in readonly, have another process write a bunch of data to cause the
814
816
  # map size to be increased
@@ -836,7 +838,7 @@ class LmdbSlabTest(s_t_utils.SynTest):
836
838
  # A putmulti across a grow
837
839
  before_mapsize = slab.mapsize
838
840
  kvpairs = [(x, x) for x in data]
839
- retn = slab.putmulti(kvpairs)
841
+ retn = await slab.putmulti(kvpairs)
840
842
  self.eq(retn, (1000, 1000))
841
843
 
842
844
  after_mapsize1 = slab.mapsize
@@ -844,7 +846,7 @@ class LmdbSlabTest(s_t_utils.SynTest):
844
846
 
845
847
  # A putmulti across a grow with a generator passed in
846
848
  kvpairs = ((b' ' + x, x) for x in data)
847
- retn = slab.putmulti(kvpairs)
849
+ retn = await slab.putmulti(kvpairs)
848
850
  self.eq(retn, (1000, 1000))
849
851
  after_mapsize2 = slab.mapsize
850
852
  self.gt(after_mapsize2, after_mapsize1)
@@ -1011,7 +1013,7 @@ class LmdbSlabTest(s_t_utils.SynTest):
1011
1013
  async with await s_lmdbslab.Slab.anit(path, map_size=32000, growsize=5000) as slab:
1012
1014
  slab.initdb('foo')
1013
1015
  kvpairs = [(x, x) for x in data]
1014
- slab.putmulti(kvpairs)
1016
+ await slab.putmulti(kvpairs)
1015
1017
  slab.forcecommit()
1016
1018
  before_mapsize = slab.mapsize
1017
1019
  slab.dropdb('foo')
@@ -1029,7 +1031,7 @@ class LmdbSlabTest(s_t_utils.SynTest):
1029
1031
  async with await s_lmdbslab.Slab.anit(path, map_size=32000, growsize=5000) as slab:
1030
1032
  slab.initdb('foo')
1031
1033
  kvpairs = [(x, x) for x in data]
1032
- slab.putmulti(kvpairs)
1034
+ await slab.putmulti(kvpairs)
1033
1035
  slab.forcecommit()
1034
1036
 
1035
1037
  asyncio.run(workloop())
@@ -1047,7 +1049,7 @@ class LmdbSlabTest(s_t_utils.SynTest):
1047
1049
 
1048
1050
  proc = mpctx.Process(target=self.make_slab, args=(path,))
1049
1051
  proc.start()
1050
- proc.join(10)
1052
+ proc.join(20)
1051
1053
  self.nn(proc.exitcode)
1052
1054
  slab.initdb('foo')
1053
1055
  self.true(True)