def virtual_test(self): references = References() references[va].add('a.h') code = ( 'def virtual(settings):\n\tif(settings.os.family == "windows"):return "win"\n' '\telse: return "nix"') a = Resource(VirtualCell('user/blocka/a.h', code, {'win', 'nix'})) awin = Resource(SimpleCell('user/blocka/win/a.h')) anix = Resource(SimpleCell('user/blocka/nix/a.h')) b = Resource(SimpleCell('user/blockb/b.h')) d1 = Resource(SimpleCell('user/blockd/d.h')) awin.cell.dependencies.explicit.add(b.name) anix.cell.dependencies.explicit.add(d1.name) tables = {va: [vb, vd1], vb: [], vd1: []} api = FakeApi(zip([va, va, va, vb, vd1], [a, awin, anix, b, d1]), tables) #With windows settings settings = Settings(OSInfo(OSFamily("Windows"))) biiout = OutputStream() graph, closure, _ = build_closure(api, references, {}, settings, biiout) expected_graph = BlockVersionGraph() expected_graph.add_nodes([va, vb]) expected_graph.add_edge(va, vb) self.assertEqual(expected_graph, graph) expected_closure = Closure({ a.name: ClosureItem(a, va), awin.name: ClosureItem(awin, va), b.name: ClosureItem(b, vb), }) self.assertEqual(expected_closure, closure) self.assertEqual("", str(biiout)) #Change settings settings = Settings(OSInfo(OSFamily("Linux"))) biiout = OutputStream() graph, closure, _ = build_closure(api, references, {}, settings, biiout) expected_graph = BlockVersionGraph() expected_graph.add_nodes([va, vd1]) expected_graph.add_edge(va, vd1) self.assertEqual(expected_graph, graph) expected_closure = Closure({ a.name: ClosureItem(a, va), anix.name: ClosureItem(anix, va), d1.name: ClosureItem(d1, vd1), }) self.assertEqual(expected_closure, closure) self.assertEqual("", str(biiout))
def dep_overwriten_in_blocks_test(self): """ Blocks: C, B (None version) Deps: A C -> A -> B """ references = References() references[va].add('a.h') vbn = BlockVersion(vb.block, None) b = Resource(SimpleCell('user/blockb/b.h')) a = Resource(SimpleCell('user/blocka/a.h')) a2 = Resource(SimpleCell('user/blocka/a2.h')) a.cell.dependencies.explicit.add(a2.name) a2.cell.dependencies.explicit.add(b.name) tables = {va: [vb], vb: []} api = FakeApi(zip([va, va, vb], [a, a2, b]), tables) base_table = BlockVersionTable([vc, vbn]) biiout = OutputStream() graph, closure, _ = build_closure(api, references, base_table, biiout=biiout) expected_graph = BlockVersionGraph() expected_graph.add_nodes([va]) expected_graph.add_edge(va, vbn) self.assertEqual(expected_graph, graph) expected_closure = Closure({ a.name: ClosureItem(a, va), a2.name: ClosureItem(a2, va) }) self.assertEqual(expected_closure, closure) self.assertEqual("", str(biiout))
def test_has_main_and_dependency_declarations(self): processor = ParseProcessor() block_holder = mother.get_block_holder(['user/geom/main.cpp'], CPP) processor.do_process(block_holder, OutputStream()) main = block_holder['main.cpp'].cell self.assertTrue(main.hasMain, 'Main method not detected by parse processor') self.check_dependency_set(main.dependencies, unresolved=['iostream', 'sphere.h']) # now remove #include load = block_holder['main.cpp'].content.load.bytes load = load.replace('#include "sphere.h"', '') block_holder.add_resource(Resource(SimpleCell('user/geom/main.cpp', CPP), Content('user/geom/main.cpp', Blob(load)))) processor.do_process(block_holder, OutputStream()) main = block_holder['main.cpp'].cell self.check_dependency_set(main.dependencies, unresolved=['iostream'])
def simple_test(self): """ Blocks: C Deps: A, B C -> A -> B """ references = References() references[va].add('a.h') base_table = BlockVersionTable( [vc, va]) # The result including or excluding va is same b = Resource(SimpleCell('user/blockb/b.h')) a = Resource(SimpleCell('user/blocka/a.h')) a2 = Resource(SimpleCell('user/blocka/a2.h')) a.cell.dependencies.explicit.add(a2.name) a2.cell.dependencies.explicit.add(b.name) tables = {va: [vb], vb: []} api = FakeApi(zip([va, va, vb], [a, a2, b]), tables) biiout = OutputStream() graph, closure, _ = build_closure(api, references, base_table, biiout=biiout) expected_graph = BlockVersionGraph() expected_graph.add_nodes([va, vb]) expected_graph.add_edge(va, vb) self.assertEqual(expected_graph, graph) expected_closure = Closure({ a.name: ClosureItem(a, va), a2.name: ClosureItem(a2, va), b.name: ClosureItem(b, vb) }) self.assertEqual(expected_closure, closure) self.assertEqual("", str(biiout))
def overwrite_test(self): """ Blocks: C (defines in requirements B2) Deps: A, B2 C -> A -> B1 """ references = References() references[va].add('a.h') b = Resource(SimpleCell('user/blockb/b.h')) b2 = Resource(SimpleCell('user/blockb/b.h'), CPP) a = Resource(SimpleCell('user/blocka/a.h')) a2 = Resource(SimpleCell('user/blocka/a2.h')) a.cell.dependencies.explicit.add(a2.name) a2.cell.dependencies.explicit.add(b.name) tables = {va: [vb], vb: [], vb2: []} api = FakeApi(zip([va, va, vb, vb2], [a, a2, b, b2]), tables) base_table = BlockVersionTable([vc, va, vb2]) # Note B2 defined here biiout = OutputStream() graph, closure, _ = build_closure(api, references, base_table, biiout=biiout) expected_graph = BlockVersionGraph() expected_graph.add_nodes([va, vb2]) expected_graph.add_edge(va, vb2) self.assertEqual(expected_graph, graph) expected_closure = Closure({ a.name: ClosureItem(a, va), a2.name: ClosureItem(a2, va), b.name: ClosureItem(b2, vb2) }) self.assertEqual(expected_closure, closure) self.assertEqual("", str(biiout))
def parse_virtual_test(self): response = OutputStream() cell = VirtualCell('usr/block/sort_controllers.py') resource = Resource(cell, None) self.assertFalse(resource.parse(response)) self.assertIn( 'You\'re trying to parse a virtual file: usr/block/sort_controllers.py', str(response))
def test_has_main(self): '''some basic negative tests, from snippets of code''' sources = {'user/block/body.cpp': main_body} block_holder = self._process_from_contents(sources) ParseProcessor().do_process(block_holder, OutputStream()) self.assertTrue(block_holder._resources['body.cpp'].content.parser. has_main_function()) sources = {'user/block/body.cpp': no_main_body} block_holder = self._process_from_contents(sources) ParseProcessor().do_process(block_holder, OutputStream()) self.assertFalse(block_holder._resources['body.cpp'].content.parser. has_main_function())
def process_holder(holder, processor): """This function performs common operation in processor test: - Process holder @return changes.result_changes and process response """ biiout = OutputStream() processor.do_process(holder, biiout) return biiout
def __init__(self, ins=sys.stdin, out=None): ''' Params: ins: input stream out: output stream, should have write method ''' self._ins = ins if not out: out = OutputStream(sys.stdout) self._out = out
def test_basic_geom(self): block_cell_names = mother.make_folder_resources('dummy', 'virtual') self.block_holder = mother.get_block_holder(block_cell_names, CPP) VirtualConfigurationProcessor().do_process(self.block_holder, OutputStream()) self.assertEqual(8, len(self.block_holder.cell_names)) self.check_virtual_resource('sphere.cpp') self.check_virtual_resource('sphere.h')
def test_large_cell_reject(self): self.load.binary = bytearray(BII_FILE_SIZE_LIMIT) files = {"user/block/file": (None, self.load)} biiout = OutputStream() changevalidator.remove_large_cells(files, biiout) self.assertEquals(0, len(files)) self.assertEquals("WARN: File user/block/file is bigger " "than %s: discarded\n" % BII_FILE_SIZE_LIMIT_STR, str(biiout))
def launch(): # Default MongoClient params are: # w=1 perform a write acknowledgement only in primary # j=False the driver does not add j to the getlasterror command # fsync=False the server does not add Sync to disk. to the getlasterror command mongo_connection = MongoClient(BII_MONGO_URI, max_pool_size=BII_MAX_MONGO_POOL_SIZE) migration_store = MigrationStore(mongo_connection) server_store = MongoServerStore(mongo_connection) biiout = OutputStream() manager = MigrationManager(migration_store, SERVER_MIGRATIONS, biiout) # Pass in kwargs all variables migrations can need n1 = time.time() manager.migrate(server_store=server_store) n2 = time.time() biiout.info('All took %s seconds' % str(n2 - n1)) # DO NOT REMOVE THIS PRINT NOR REPLACE WITH LOGGER, ITS A CONSOLE SCRIPT # INVOKED IN DEPLOYMENT PROCESS AND ITS NECESSARY IT PRINTS TO OUTPUT print biiout
def test_migrate_with_several_files(self): biiout = OutputStream() deleted = migrate_bii_config(all_files, biiout) self.assertEqual(deleted, ['user/block/bii/parents.bii']) self.assertIn('file.cpp + mydata.txt', all_files['user/block/biicode.conf']) self.assertIn('john/smith: 3', all_files['user/block/biicode.conf']) self.assertIn('file.cpp + mydata.txt', all_files['user/block/biicode.conf']) self.assertNotIn('mydata2.txt', all_files['user/block/biicode.conf']) self.assertNotIn('mydata3.txt', all_files['user/block/biicode.conf'])
def setUp(self): self.common = { "file1.h": "Content of file1.h\n", "file2.h": "Content of file2.h\n", "file3.h": "Content of file3.h\n", "file4.h": "Content of file4.h\n" } self._biiout = OutputStream() self.merger = SetThreeWayMergeText(base_name="base", other_name="other", biiout=self._biiout)
def test_process_config_file_with_unknown_deps(self): my_conf = '''r1.h + r9.cpp''' block_holder = self._prepare_context(my_conf) block_holder[self.r1.cell_name].cell.dependencies.implicit.add(self.r2) changes = ProcessorChanges() biiout = OutputStream() self.processor.do_process(block_holder, changes, biiout) self.assertIn('There are no files matching pattern r9.cpp', str(biiout)) self.assertEqual(0, len(changes.upserted)) r1 = block_holder[self.r1.cell_name].cell self.assertEqual({self.r2}, r1.dependencies.implicit)
def test_create_missing_simple_resources(self): resources = {'bii/virtual.bii': Resource(SimpleCell('user/block/bii/virtual.bii'), Content(None, Blob(myConf1)))} self.block_holder = BlockHolder(BlockName('user/block'), resources) VirtualConfigurationProcessor().do_process(self.block_holder, OutputStream()) self._sphere_os_checks('sphere.h') self._sphere_os_checks('sphere.cpp') self.assertEqual(None, self.block_holder['sphere.h'].content) self.assertEqual(None, self.block_holder['sphere.cpp'].content)
def test_process_config_file_with_unknown_deps(self): my_conf = '''r1.h + r9.cpp''' block_holder = self._prepare_context(my_conf) block_holder[self.r1.cell_name].cell.dependencies.implicit.add(self.r2) biiout = OutputStream() self.processor.do_process(block_holder, biiout) self.assertIn('There are no files matching pattern r9.cpp', str(biiout)) content = block_holder[self.r1.cell_name].content self.assertTrue(content.meta_updated) self.assertFalse(content.blob_updated) r1 = block_holder[self.r1.cell_name].cell self.assertEqual({self.r2}, r1.dependencies.implicit)
def test_no_compare(self): base = copy(self.common) other = self._make_resources({ 'user/block1/file1.h': "file1content@modified", }) merger = BlobsMerger("user/block1#1", "user/block1#2", OutputStream()) merger.merge_elements = Mock( side_effect=Exception("No item must be compared!")) ret = merger.merge(base, other, self.common) self.assertEquals(ret['user/block1/file1.h'].load, "file1content@modified")
def test_size_reject_accept(self): self.load.binary = bytearray(BII_FILE_SIZE_LIMIT) load2 = Blob() load2.binary = bytearray(BII_FILE_SIZE_LIMIT - 1) files = {"user/block/filelarge": (None, self.load), "user/block/filesmall": (None, load2)} biiout = OutputStream() changevalidator.remove_large_cells(files, biiout) self.assertEquals(1, len(files)) self.assertEquals("WARN: File user/block/filelarge is " "bigger than %s: discarded\n" % BII_FILE_SIZE_LIMIT_STR, str(biiout)) self.assertIn("user/block/filesmall", files)
def test_add_item(self): c1 = Closure() r1 = Cell('user/block/name1') version = BlockVersion(BRLBlock('owner/user/block/branch'), 13) biiout = OutputStream() resource = Resource(r1, None) c1.add_item(resource, version, biiout) r2 = Cell('user/block/name1') r2.hasMain = True resource2 = Resource(r2, None) version2 = BlockVersion(BRLBlock('owner/user/block/branch'), 14) c1.add_item(resource2, version2, biiout) self.assertEqual(ClosureItem(resource, version), c1['user/block/name1']) self.assertIn('Incompatible dependency', str(biiout))
def python_parse_failure_test(self, parser): """ Weird bug miguel found. Python parser failure was causing 'You're trying to parse a virtual file' message to appear """ response = OutputStream() parser.side_effect = Exception cell = SimpleCell('usr/block/sort_controllers.py', biitype=PYTHON) content = Content(id_=1, load=Blob('print "hello"'), parser=None, is_parsed=False) resource = Resource(cell, content) self.assertFalse(resource.parse(response)) self.assertIn('Error parsing usr/block/sort_controllers.py file', str(response))
def test_with_compare(self): base = self._make_resources({'user/block1/file1.h': "@modified1"}) other = self._make_resources({'user/block1/file1.h': "@modified2"}) output = OutputStream() merger = BlobsMerger("user/block1#1", "user/block1#2", output) ret = merger.merge(base, other, self.common) self.assertEquals( ret['user/block1/file1.h'].text, '''<<<<<<<<<<<<<<<<<<<<<<<<< user/block1#1 @modified1 ========================= @modified2 >>>>>>>>>>>>>>>>>>>>>>>>> user/block1#2 ''') self.assertIn("CONFLICT", str(output))
def test_higher_version_ok(self): server_info = ServerInfo(version="0.9", message='Hey!', last_compatible="0.5") self.biiapi.get_server_info = Mock(return_value=server_info) manager = UpdatesManager(self.store, self.biiapi, ClientVersion("1.0")) last_time = self._save_info(manager, server_info, datetime.timedelta(days=-365)) biiout = OutputStream() manager.check_for_updates(biiout) self.assert_not_in_response(biiout, "There is a new version of biicode")
def test_with_binary_blobs(self): base = self._make_resources({ 'user/block1/file1.h': "@modified1", }, is_binary=True) other = self._make_resources({ 'user/block1/file1.h': "@modified2", }) output = OutputStream() merger = BlobsMerger("user/block1#1", "user/block1#2", output) merger.merge(base, other, self.common) self.assertIn("CONFLICT", str(output)) self.assertIn("WARN: Can't merge binary contents, your file is keeped", str(output)) self.assertIn( 'user/block1/file1.h: CONFLICT (modified/modified): Changed in ' 'user/block1#1 and changed in user/block1#2', str(output))
def diamond_test(self, conflict): """ Blocks: C Deps: A, B, D1-D2 C -> A, B; A->D1, B->D2 """ references = References() references[va].add('a.h') references[vb].add('b.h') b = Resource(SimpleCell('user/blockb/b.h')) a = Resource(SimpleCell('user/blocka/a.h')) d1 = Resource(SimpleCell('user/blockd/d.h')) if conflict: d2 = Resource(SimpleCell('user/blockd/d.h', CPP)) else: d2 = Resource(SimpleCell('user/blockd/d.h')) a.cell.dependencies.explicit.add(d1.name) b.cell.dependencies.explicit.add(d2.name) tables = {va: [vd1], vb: [vd2], vd1: [], vd2: []} api = FakeApi(zip([va, vb, vd1, vd2], [a, b, d1, d2]), tables) base_table = BlockVersionTable([vc, va, vb]) biiout = OutputStream() graph, closure, _ = build_closure(api, references, base_table, biiout=biiout) expected_graph = BlockVersionGraph() expected_graph.add_nodes([va, vb, vd1, vd2]) expected_graph.add_edge(va, vd1) expected_graph.add_edge(vb, vd2) self.assertEqual(expected_graph, graph) self.assertEqual({a.name, b.name, d1.name}, set(closure.keys())) if conflict: self.assertIn('Incompatible dependency "user/blockd/d.h"', str(biiout)) else: self.assertEqual("", str(biiout))
def setUp(self): self.testuser = BRLUser('user') self.edition_api = TestEditionAPI() self.hive_manager = HiveManager(self.edition_api, None, OutputStream()) self.block_name = BlockName('dummy/myblock')