def testSearchLabel(self): s1 = cml.SearchLabel(text='foo@bar:baz') self.assertEquals(repr(s1), "SearchLabel(text='foo@bar:baz', modified=True, index=None)") self.assertEquals(s1.format(), 'search foo@bar:baz') self.assertEquals(s1.asString(), 'foo@bar:baz') s2 = cml.SearchLabel(item = s1.item, modified=False, index=1) self.assertEquals(repr(s2), "SearchLabel(text='foo@bar:baz', modified=False, index=1)") self.assertEquals(s2.format(), 'search foo@bar:baz') self.assertEquals(s2.asString(), 'foo@bar:baz') self.assertEquals(str(s2), 'foo@bar:baz')
def testStartFromScratch(self): smf = self.getSystemModel('/fake') smf.parse(fileData=['# an initial comment\n']) smf.write() self.assertEquals( file(self.rootDir + '/fake').read(), '# an initial comment\n') smf.model.appendOpByName('update', 'foo') smf.write() self.assertEquals( file(self.rootDir + '/fake').read(), '# an initial comment\n' 'update foo\n') smf.model.appendOp(cml.SearchLabel('a@b:c')) smf.write() self.assertEquals( file(self.rootDir + '/fake').read(), '# an initial comment\n' 'update foo\n' 'search a@b:c\n') smf.write('/asdf') self.assertEquals( file(self.rootDir + '/asdf').read(), '# an initial comment\n' 'update foo\n' 'search a@b:c\n') self.assertEquals( stat.S_IMODE(os.stat(self.rootDir + '/asdf')[stat.ST_MODE]), 0644) os.chmod(self.rootDir + '/asdf', 0640) smf.write('/asdf') self.assertEquals( stat.S_IMODE(os.stat(self.rootDir + '/asdf')[stat.ST_MODE]), 0640)
def testParseWrite(self): fileData = '\n'.join(( '# Initial comment', 'search group-foo=a@b:c/1-1-1', '# comment 2', 'update foo #disappearing act', '# comment 3', 'install bar==a@b:c/1-1-1', '# comment 4', 'patch baz', '# comment 5', 'erase blah', '# comment 6', '', )) file(self.rootDir + '/real', 'w').write(fileData) smf = self.getSystemModel('/real') self.assertEquals(smf.model.format(), fileData) smf.write('/copy') self.assertEquals(file(self.rootDir + '/copy').read(), fileData) smf.model.modelOps[1].modified = True modFileData = fileData.replace(' #disappearing act', '') self.assertEquals(smf.model.format(), modFileData) smf.model.appendOp(cml.UpdateTroveOperation('newtrove')) modFileData = modFileData.replace('erase blah\n', 'erase blah\nupdate newtrove\n') self.assertEquals(smf.model.format(), modFileData) smf.model.appendOp(cml.SearchLabel('d@e:f')) modFileData = modFileData.replace('update newtrove\n', 'update newtrove\nsearch d@e:f\n') self.assertEquals(smf.model.format(), modFileData)
def testParseWrite(self): fileData = '\n'.join(( '# Initial comment', 'search group-foo=a@b:c/1-1-1', '# comment 2', 'offer optional', 'update foo #disappearing act', '# comment 3', 'install bar', '# comment 4', 'patch baz', '# comment 5', 'erase blah', '# comment 6', 'include cml-inc', '# comment 7', 'version 1.0 # ensure it does not move', '', )) smf = self.getCML() smf.parse(fileData=[x+'\n' for x in fileData.split('\n')][:-1]) self.assertEquals(smf.format(), fileData) self.assertEquals(str(smf.modelOps[3].getLocation( smf.modelOps[3].item[0])), '7:bar') self.assertEquals(smf.modelOps[3].format(), 'install bar') smf.modelOps[2].modified=True self.assertEquals(smf.modified(), True) modFileData = fileData.replace(' #disappearing act', '') self.assertEquals(smf.format(), modFileData) smf.appendOp(cml.UpdateTroveOperation('newtrove')) modFileData = modFileData.replace('include cml-inc\n', 'include cml-inc\nupdate newtrove\n') self.assertEquals(smf.format(), modFileData) smf.appendOp(cml.SearchLabel('d@e:f')) modFileData = modFileData.replace('update newtrove\n', 'update newtrove\nsearch d@e:f\n') self.assertEquals(smf.format(), modFileData) mockFile = mock.MockObject() smf.write(mockFile) mockFile.write._mock.assertCalled(modFileData) smf.parse(fileData=[x+'\n' for x in fileData.split('\n')][:-1], context='foo') self.assertEquals(str(smf.modelOps[3].getLocation( smf.modelOps[3].item[0])), 'foo:7:bar') self.assertEquals(smf.modelOps[3].format(), 'install bar')
def testCMRepresentation(self): m = self.getCM() gs = cml.SearchTrove(text='group-foo=g@h:i', modified=False, index=1) m.appendOp(gs) gl = cml.SearchLabel(text='j@k:l', modified=False, index=2) m.appendOp(gl) nop = cml.NoOperation('# comment', modified=False, index=3) m.appendNoOperation(nop) at = cml.UpdateTroveOperation(text=['bar', 'blah'], modified=False, index=4) m.appendOp(at) rt = cml.EraseTroveOperation(text='baz', modified=False, index=5) m.appendOp(rt) inc = cml.IncludeOperation(text='cml-foo', modified=False, index=6) m.appendOp(inc) self.assertEquals(m.getVersion(), None) ver = cml.VersionOperation('2.0', modified=False, index=7) m.setVersion(ver) self.assertEquals(str(m.getVersion()), '2.0') self.assertEquals(len(m.modelOps), 5) self.assertEquals(m.modelOps[0], gs) self.assertEquals(m.modelOps[1], gl) self.assertEquals(m.modelOps[2], at) self.assertEquals(m.modelOps[3], rt) self.assertEquals(m.modelOps[4], inc) self.assertEquals(m.noOps[0], nop) self.assertEquals(len(m.noOps), 1) self.assertEquals(sorted(m.indexes.keys()), [1,2,3,4,5,6,7]) self.assertEquals(m.indexes[1], [gs]) self.assertEquals(m.indexes[2], [gl]) self.assertEquals(m.indexes[3], [nop]) self.assertEquals(m.indexes[4], [at]) self.assertEquals(m.indexes[5], [rt]) self.assertEquals(m.indexes[6], [inc]) self.assertEquals(m.indexes[7], [ver]) self.assertEquals(m.modified(), False)
def testStartFromScratch(self): smf = self.getCML() smf.appendNoOpByText('# an initial comment') self.assertEquals(smf.format(), '# an initial comment\n') smf.appendOpByName('update', 'foo') self.assertEquals(smf.format(), '# an initial comment\n' 'update foo\n') smf.appendOp(cml.SearchLabel('a@b:c')) self.assertEquals(smf.format(), '# an initial comment\n' 'update foo\n' 'search a@b:c\n') smf.setVersion(cml.VersionOperation('1.0')) self.assertEquals(smf.format(), '# an initial comment\n' 'version 1.0\n' 'update foo\n' 'search a@b:c\n') smf.appendOpByName('offer', 'optional') self.assertEquals(smf.format(), '# an initial comment\n' 'version 1.0\n' 'update foo\n' 'search a@b:c\n' 'offer optional\n') smf.appendOpByName('include', 'cml-inc') self.assertEquals(smf.format(), '# an initial comment\n' 'version 1.0\n' 'update foo\n' 'search a@b:c\n' 'offer optional\n' 'include cml-inc\n') smf.appendNoOpByText('# a trailing comment', index=999) self.assertEquals(smf.format(), '# an initial comment\n' 'version 1.0\n' 'update foo\n' 'search a@b:c\n' 'offer optional\n' 'include cml-inc\n' '# a trailing comment\n') smf.appendNoOpByText('# another trailing comment', index=999) self.assertEquals(smf.format(), '# an initial comment\n' 'version 1.0\n' 'update foo\n' 'search a@b:c\n' 'offer optional\n' 'include cml-inc\n' '# a trailing comment\n' '# another trailing comment\n') smf2 = smf.copy() self.assertEquals(smf.format(), smf2.format())
def testRefreshVersionSnapshots(self): m = self.getCM() mockClient = mock.MockObject() self.mock(conaryclient, 'ConaryClient', mockClient) repos = mockClient().getRepos() repos.findTroves._mock.setDefaultReturn( {('group-foo', 'g@h:i', None): [('group-foo', versions.VersionFromString('/g@h:i/1.0-1-2'), deps.parseFlavor('foo'))], ('group-foo', 'g@h:i/1.0-1-1', None): [('group-foo', versions.VersionFromString('/g@h:i/1.0-1-1'), deps.parseFlavor('foo'))], ('bar', 'g@h:i', None): [('bar', versions.VersionFromString('/g@h:i/2.0-1-2'), deps.parseFlavor('foo'))], ('bar', 'g@h:i/2.0-1-1', None): [('bar', versions.VersionFromString('/g@h:i/2.0-1-1'), deps.parseFlavor('foo'))], ('pinned', 'g@h:i', None): [('pinned', versions.VersionFromString('/g@h:i/2.0-1-2'), deps.parseFlavor('foo'))], ('pinned', 'g@h:i/2.0-1-1', None): [('pinned', versions.VersionFromString('/g@h:i/2.0-1-1'), deps.parseFlavor('foo'))], ('cml-inc', 'g@h:i', None): [('cml-inc', versions.VersionFromString('/g@h:i/1.0-1-2'), deps.parseFlavor('foo'))], ('cml-inc', 'g@h:i/1.0-1-1', None): [('cml-inc', versions.VersionFromString('/g@h:i/1.0-1-1'), deps.parseFlavor('foo'))], } ) gs = cml.SearchTrove(text='group-foo=g@h:i/1.0-1-1', modified=False, index=1) m.appendOp(gs) gl = cml.SearchLabel(text='j@k:l', modified=False, index=2) m.appendOp(gl) up = cml.UpdateTroveOperation(text='bar=g@h:i/2.0-1-1', modified=False, index=3) m.appendOp(up) pi = cml.InstallTroveOperation(text='pinned==g@h:i/2.0-1-1', modified=False, index=4) m.appendOp(pi) inc = cml.IncludeOperation(text='cml-inc=g@h:i/1.0-1-1', modified=False, index=5) m.appendOp(inc) self.assertEquals(m.modified(), False) self.assertEquals([x.format() for x in m.modelOps], ['search group-foo=g@h:i/1.0-1-1', 'search j@k:l', 'update bar=g@h:i/2.0-1-1', 'install pinned==g@h:i/2.0-1-1', 'include cml-inc=g@h:i/1.0-1-1']) m.refreshVersionSnapshots() self.assertEquals(m.modified(), True) self.assertEquals([x.format() for x in m.modelOps], ['search group-foo=g@h:i/1.0-1-2', 'search j@k:l', 'update bar=g@h:i/2.0-1-2', 'install pinned==g@h:i/2.0-1-1', 'include cml-inc=g@h:i/1.0-1-2']) # and now, if it doesn't change: repos.findTroves._mock.setDefaultReturn( {('group-foo', 'g@h:i', None): [('group-foo', versions.VersionFromString('/g@h:i/1.0-1-2'), deps.parseFlavor('foo'))], ('group-foo', 'g@h:i/1.0-1-2', None): [('group-foo', versions.VersionFromString('/g@h:i/1.0-1-2'), deps.parseFlavor('foo'))], ('bar', 'g@h:i', None): [('bar', versions.VersionFromString('/g@h:i/2.0-1-2'), deps.parseFlavor('foo'))], ('bar', 'g@h:i/2.0-1-2', None): [('bar', versions.VersionFromString('/g@h:i/2.0-1-2'), deps.parseFlavor('foo'))], ('pinned', 'g@h:i', None): [('pinned', versions.VersionFromString('/g@h:i/2.0-1-2'), deps.parseFlavor('foo'))], ('pinned', 'g@h:i/2.0-1-1', None): [('pinned', versions.VersionFromString('/g@h:i/2.0-1-1'), deps.parseFlavor('foo'))], ('cml-inc', 'g@h:i', None): [('cml-inc', versions.VersionFromString('/g@h:i/1.0-1-2'), deps.parseFlavor('foo'))], ('cml-inc', 'g@h:i/1.0-1-2', None): [('cml-inc', versions.VersionFromString('/g@h:i/1.0-1-2'), deps.parseFlavor('foo'))], } ) m.refreshVersionSnapshots() self.assertEquals(m.modified(), True) self.assertEquals([x.format() for x in m.modelOps], ['search group-foo=g@h:i/1.0-1-2', 'search j@k:l', 'update bar=g@h:i/2.0-1-2', 'install pinned==g@h:i/2.0-1-1', 'include cml-inc=g@h:i/1.0-1-2']) # Old group is missing findtroves = { ('group-foo', 'g@h:i', None): [('group-foo', versions.VersionFromString('/g@h:i/1.0-1-2'), deps.parseFlavor('foo'))], #('group-foo', 'g@h:i/1.0-1-2', None): ('bar', 'g@h:i', None): [('bar', versions.VersionFromString('/g@h:i/2.0-1-2'), deps.parseFlavor('foo'))], ('bar', 'g@h:i/2.0-1-2', None): [('bar', versions.VersionFromString('/g@h:i/2.0-1-2'), deps.parseFlavor('foo'))], ('pinned', 'g@h:i', None): [('pinned', versions.VersionFromString('/g@h:i/2.0-1-2'), deps.parseFlavor('foo'))], ('pinned', 'g@h:i/2.0-1-1', None): [('pinned', versions.VersionFromString('/g@h:i/2.0-1-1'), deps.parseFlavor('foo'))], ('cml-inc', 'g@h:i', None): [('cml-inc', versions.VersionFromString('/g@h:i/1.0-1-2'), deps.parseFlavor('foo'))], ('cml-inc', 'g@h:i/1.0-1-2', None): [('cml-inc', versions.VersionFromString('/g@h:i/1.0-1-2'), deps.parseFlavor('foo'))], } repos.findTroves._mock.setDefaultReturn(findtroves) m.refreshVersionSnapshots() self.assertEquals(m.modified(), True) self.assertEquals([x.format() for x in m.modelOps], ['search group-foo=g@h:i/1.0-1-2', 'search j@k:l', 'update bar=g@h:i/2.0-1-2', 'install pinned==g@h:i/2.0-1-1', 'include cml-inc=g@h:i/1.0-1-2']) # New version is missing del findtroves[('group-foo', 'g@h:i', None)] err = self.assertRaises(TroveNotFound, m.refreshVersionSnapshots) self.assertEquals(str(err), "Trove not found: group-foo=g@h:i") del findtroves[('bar', 'g@h:i', None)] err = self.assertRaises(TroveNotFound, m.refreshVersionSnapshots) self.assertEquals(str(err), "2 troves not found:\nbar=g@h:i\ngroup-foo=g@h:i")