Index: pkg/analysis_server/test/index/page_node_manager_test.dart |
diff --git a/pkg/analysis_server/test/index/page_node_manager_test.dart b/pkg/analysis_server/test/index/page_node_manager_test.dart |
deleted file mode 100644 |
index 56dab610d0480f8f3c5fcaa3f28ce75351002c6a..0000000000000000000000000000000000000000 |
--- a/pkg/analysis_server/test/index/page_node_manager_test.dart |
+++ /dev/null |
@@ -1,434 +0,0 @@ |
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-library test.index.page_node_manager; |
- |
-import 'dart:math'; |
-import 'dart:typed_data'; |
- |
-import 'package:analysis_server/src/index/b_plus_tree.dart'; |
-import 'package:analysis_server/src/index/page_node_manager.dart'; |
-import 'package:typed_mock/typed_mock.dart'; |
-import 'package:unittest/unittest.dart'; |
- |
-import '../reflective_tests.dart'; |
- |
- |
-main() { |
- groupSep = ' | '; |
- group('_CachingNodeManagerTest', () { |
- runReflectiveTests(_CachingNodeManagerTest); |
- }); |
- group('FixedStringCodecTest', () { |
- runReflectiveTests(_FixedStringCodecTest); |
- }); |
- group('MemoryPageManager', () { |
- runReflectiveTests(_MemoryPageManagerTest); |
- }); |
- group('PageNodeManager', () { |
- runReflectiveTests(_PageNodeManagerTest); |
- }); |
- group('Uint32CodecTest', () { |
- runReflectiveTests(_Uint32CodecTest); |
- }); |
- test('B+ tree with PageNodeManager', _treeWithPageNodeManager); |
-} |
- |
- |
-int _intComparator(int a, int b) => a - b; |
- |
- |
-/** |
- * A stress test for [BPlusTree] using [PageNodeManager]. |
- */ |
-_treeWithPageNodeManager() { |
- int pageSize = 256; |
- MemoryPageManager pageManager = new MemoryPageManager(pageSize); |
- NodeManager<int, String, int> nodeManager = new PageNodeManager<int, String>( |
- pageManager, Uint32Codec.INSTANCE, new FixedStringCodec(7)); |
-// NodeManager<int, String, int> nodeManager = new MemoryNodeManager(); |
- BPlusTree<int, String, int> tree = new BPlusTree(_intComparator, nodeManager); |
- int maxKey = 1000000; |
- int tryCount = 1000; |
- Set<int> keys = new Set<int>(); |
- { |
- Random random = new Random(37); |
- for (int i = 0; i < tryCount; i++) { |
- int key = random.nextInt(maxKey); |
- keys.add(key); |
- tree.insert(key, 'V$key'); |
- } |
- } |
- // find every |
- for (int key in keys) { |
- expect(tree.find(key), 'V$key'); |
- } |
- // remove random keys |
- { |
- Random random = new Random(37); |
- for (int key in new Set<int>.from(keys)) { |
- if (random.nextBool()) { |
- keys.remove(key); |
- expect(tree.remove(key), 'V$key'); |
- } |
- } |
- } |
- // find every remaining key |
- for (int key in keys) { |
- expect(tree.find(key), 'V$key'); |
- } |
-} |
- |
- |
-@ReflectiveTestCase() |
-class _CachingNodeManagerTest { |
- _NodeManagerMock<int, String, int> delegate = new _NodeManagerMock<int, |
- String, int>(); |
- NodeManager<int, String, int> manager; |
- |
- void setUp() { |
- when(delegate.writeIndex).thenReturn((key, value) { |
- delegate.writeIndex(key, value); |
- }); |
- when(delegate.writeLeaf).thenReturn((key, value) { |
- delegate.writeLeaf(key, value); |
- }); |
- manager = new CachingNodeManager<int, String, int>(delegate, 4, 4); |
- resetInteractions(delegate); |
- } |
- |
- void test_createIndex() { |
- when(delegate.createIndex()).thenReturn(77); |
- expect(manager.createIndex(), 77); |
- } |
- |
- void test_createLeaf() { |
- when(delegate.createLeaf()).thenReturn(99); |
- expect(manager.createLeaf(), 99); |
- } |
- |
- void test_delete() { |
- manager.delete(42); |
- verify(delegate.delete(42)).once(); |
- } |
- |
- void test_isIndex() { |
- when(delegate.isIndex(1)).thenReturn(true); |
- when(delegate.isIndex(2)).thenReturn(false); |
- expect(manager.isIndex(1), isTrue); |
- expect(manager.isIndex(2), isFalse); |
- } |
- |
- void test_maxIndexKeys() { |
- when(delegate.maxIndexKeys).thenReturn(42); |
- expect(manager.maxIndexKeys, 42); |
- } |
- |
- void test_maxLeafKeys() { |
- when(delegate.maxLeafKeys).thenReturn(42); |
- expect(manager.maxLeafKeys, 42); |
- } |
- |
- void test_readIndex_cache_whenRead() { |
- var data = new IndexNodeData<int, int>([1, 2], [10, 20, 30]); |
- when(delegate.readIndex(2)).thenReturn(data); |
- expect(manager.readIndex(2), data); |
- verify(delegate.readIndex(2)).once(); |
- resetInteractions(delegate); |
- // we just read "2", so it should be cached |
- manager.readIndex(2); |
- verify(delegate.readIndex(2)).never(); |
- } |
- |
- void test_readIndex_cache_whenWrite() { |
- var data = new IndexNodeData<int, int>([1, 2], [10, 20, 30]); |
- manager.writeIndex(2, data); |
- expect(manager.readIndex(2), data); |
- verify(delegate.readLeaf(2)).never(); |
- // delete, forces request to the delegate |
- manager.delete(2); |
- manager.readIndex(2); |
- verify(delegate.readIndex(2)).once(); |
- } |
- |
- void test_readIndex_delegate() { |
- var data = new IndexNodeData<int, int>([1, 2], [10, 20, 30]); |
- when(delegate.readIndex(2)).thenReturn(data); |
- expect(manager.readIndex(2), data); |
- } |
- |
- void test_readLeaf_cache_whenRead() { |
- var data = new LeafNodeData<int, String>([1, 2, 3], ['A', 'B', 'C']); |
- when(delegate.readLeaf(2)).thenReturn(data); |
- expect(manager.readLeaf(2), data); |
- verify(delegate.readLeaf(2)).once(); |
- resetInteractions(delegate); |
- // we just read "2", so it should be cached |
- manager.readLeaf(2); |
- verify(delegate.readLeaf(2)).never(); |
- } |
- |
- void test_readLeaf_cache_whenWrite() { |
- var data = new LeafNodeData<int, String>([1, 2, 3], ['A', 'B', 'C']); |
- manager.writeLeaf(2, data); |
- expect(manager.readLeaf(2), data); |
- verify(delegate.readLeaf(2)).never(); |
- // delete, forces request to the delegate |
- manager.delete(2); |
- manager.readLeaf(2); |
- verify(delegate.readLeaf(2)).once(); |
- } |
- |
- void test_readLeaf_delegate() { |
- var data = new LeafNodeData<int, String>([1, 2, 3], ['A', 'B', 'C']); |
- when(delegate.readLeaf(2)).thenReturn(data); |
- expect(manager.readLeaf(2), data); |
- } |
- |
- void test_writeIndex() { |
- var data = new IndexNodeData<int, int>([1], [10, 20]); |
- manager.writeIndex(1, data); |
- manager.writeIndex(2, data); |
- manager.writeIndex(3, data); |
- manager.writeIndex(4, data); |
- manager.writeIndex(1, data); |
- verifyZeroInteractions(delegate); |
- // only 4 nodes can be cached, 5-th one cause write to the delegate |
- manager.writeIndex(5, data); |
- verify(delegate.writeIndex(2, data)).once(); |
- } |
- |
- void test_writeLeaf() { |
- var data = new LeafNodeData<int, String>([1, 2], ['A', 'B']); |
- manager.writeLeaf(1, data); |
- manager.writeLeaf(2, data); |
- manager.writeLeaf(3, data); |
- manager.writeLeaf(4, data); |
- manager.writeLeaf(1, data); |
- verifyZeroInteractions(delegate); |
- // only 4 nodes can be cached, 5-th one cause write to the delegate |
- manager.writeLeaf(5, data); |
- verify(delegate.writeLeaf(2, data)).once(); |
- } |
-} |
- |
- |
-@ReflectiveTestCase() |
-class _FixedStringCodecTest { |
- ByteData buffer; |
- Uint8List bytes = new Uint8List(2 + 2 * 4); |
- FixedStringCodec codec = new FixedStringCodec(4); |
- |
- void setUp() { |
- buffer = new ByteData.view(bytes.buffer); |
- } |
- |
- test_empty() { |
- // encode |
- codec.encode(buffer, ''); |
- expect(bytes, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); |
- // decode |
- expect(codec.decode(buffer), ''); |
- } |
- |
- test_fourChars() { |
- // encode |
- codec.encode(buffer, 'ABCD'); |
- expect(bytes, [0, 4, 0, 65, 0, 66, 0, 67, 0, 68]); |
- // decode |
- expect(codec.decode(buffer), 'ABCD'); |
- } |
- |
- test_russian() { |
- // encode |
- codec.encode(buffer, 'ЩУКА'); |
- expect(bytes, [0, 4, 4, 41, 4, 35, 4, 26, 4, 16]); |
- // decode |
- expect(codec.decode(buffer), 'ЩУКА'); |
- } |
- |
- test_tooManyChars() { |
- expect(() { |
- codec.encode(buffer, 'ABCDE'); |
- }, throws); |
- } |
- |
- test_twoChars() { |
- // encode |
- codec.encode(buffer, 'AB'); |
- expect(bytes, [0, 2, 0, 65, 0, 66, 0, 0, 0, 0]); |
- // decode |
- expect(codec.decode(buffer), 'AB'); |
- } |
-} |
- |
- |
-@ReflectiveTestCase() |
-class _MemoryPageManagerTest { |
- static const PAGE_SIZE = 8; |
- MemoryPageManager manager = new MemoryPageManager(PAGE_SIZE); |
- |
- test_alloc() { |
- int idA = manager.alloc(); |
- int idB = manager.alloc(); |
- expect(idB, isNot(idA)); |
- } |
- |
- test_free() { |
- int id = manager.alloc(); |
- manager.free(id); |
- // double free |
- expect(() { |
- manager.free(id); |
- }, throws); |
- } |
- |
- test_read() { |
- int id = manager.alloc(); |
- Uint8List page = manager.read(id); |
- expect(page.length, PAGE_SIZE); |
- } |
- |
- test_read_doesNotExist() { |
- expect(() { |
- manager.read(0); |
- }, throws); |
- } |
- |
- test_write() { |
- int id = manager.alloc(); |
- // do write |
- { |
- Uint8List page = new Uint8List(PAGE_SIZE); |
- page[3] = 42; |
- manager.write(id, page); |
- } |
- // now read |
- { |
- Uint8List page = manager.read(id); |
- expect(page.length, PAGE_SIZE); |
- expect(page[3], 42); |
- } |
- } |
- |
- test_write_doesNotExist() { |
- expect(() { |
- Uint8List page = new Uint8List(PAGE_SIZE); |
- manager.write(42, page); |
- }, throws); |
- } |
- |
- test_write_invalidLength() { |
- int id = manager.alloc(); |
- Uint8List page = new Uint8List(0); |
- expect(() { |
- manager.write(id, page); |
- }, throws); |
- } |
-} |
- |
- |
- |
-class _NodeManagerMock<K, V, N> extends TypedMock implements NodeManager<K, V, |
- N> { |
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
-} |
- |
- |
- |
-@ReflectiveTestCase() |
-class _PageNodeManagerTest { |
- static const Codec KEY_CODEC = Uint32Codec.INSTANCE; |
- static const int PAGE_SIZE = 128; |
- static const Codec VALUE_CODEC = const FixedStringCodec(4); |
- |
- PageNodeManager<int, String> nodeManager; |
- MemoryPageManager pageManager = new MemoryPageManager(PAGE_SIZE); |
- |
- setUp() { |
- nodeManager = new PageNodeManager<int, String>(pageManager, KEY_CODEC, |
- VALUE_CODEC); |
- } |
- |
- test_index_createDelete() { |
- int id = nodeManager.createIndex(); |
- expect(nodeManager.isIndex(id), isTrue); |
- // do delete |
- nodeManager.delete(id); |
- expect(nodeManager.isIndex(id), isFalse); |
- } |
- |
- test_index_readWrite() { |
- int id = nodeManager.createIndex(); |
- expect(nodeManager.isIndex(id), isTrue); |
- // write |
- { |
- var keys = [1, 2]; |
- var children = [10, 20, 30]; |
- nodeManager.writeIndex(id, new IndexNodeData<int, int>(keys, children)); |
- } |
- // check the page |
- { |
- Uint8List page = pageManager.read(id); |
- expect(page, [0, 0, 0, 2, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0, |
- 2, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
- 0, 0]); |
- } |
- // read |
- { |
- IndexNodeData<int, int> data = nodeManager.readIndex(id); |
- expect(data.keys, [1, 2]); |
- expect(data.children, [10, 20, 30]); |
- } |
- } |
- |
- test_leaf_readWrite() { |
- int id = nodeManager.createLeaf(); |
- expect(nodeManager.isIndex(id), isFalse); |
- // write |
- { |
- var keys = [1, 2, 3]; |
- var children = ['A', 'BB', 'CCC']; |
- nodeManager.writeLeaf(id, new LeafNodeData<int, String>(keys, children)); |
- } |
- // check the page |
- { |
- Uint8List page = pageManager.read(id); |
- expect(page, [0, 0, 0, 3, 0, 0, 0, 1, 0, 1, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, |
- 0, 2, 0, 2, 0, 66, 0, 66, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 67, 0, 67, 0, 67, 0, |
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
- 0, 0]); |
- } |
- // read |
- { |
- LeafNodeData<int, String> data = nodeManager.readLeaf(id); |
- expect(data.keys, [1, 2, 3]); |
- expect(data.values, ['A', 'BB', 'CCC']); |
- } |
- } |
-} |
- |
-@ReflectiveTestCase() |
-class _Uint32CodecTest { |
- ByteData buffer; |
- Uint8List bytes = new Uint8List(4); |
- Uint32Codec codec = Uint32Codec.INSTANCE; |
- |
- void setUp() { |
- buffer = new ByteData.view(bytes.buffer); |
- } |
- |
- test_all() { |
- // encode |
- codec.encode(buffer, 42); |
- expect(bytes, [0, 0, 0, 42]); |
- // decode |
- expect(codec.decode(buffer), 42); |
- } |
-} |