def testDigestEmpyEnv(self): """Adding empty entry must be detected""" s1 = CoreCheckoutStep(nullPkg, ("script", "digest", [], []), [], digestEnv=Env({ "a" : "b" })) s2 = CoreCheckoutStep(nullPkg, ("script", "digest", [], []), [], digestEnv=Env({ "a" : "b", "" : "" })) assert s1.variantId != s2.variantId
def testDigestStable(self): """Same input should yield same digest""" s1 = CoreCheckoutStep(nullPkg, ("script", "digest", [], []), [], Env({"a" : "asdf", "q": "qwer" }), Env({ "a" : "asdf" })) s2 = CoreCheckoutStep(nullPkg, ("script", "digest", [], []), [], Env({"a" : "asdf", "q": "qwer" }), Env({ "a" : "asdf" })) assert s1.variantId == s2.variantId
def testDigestEnv(self): """Env changes digest""" s1 = CheckoutStep() s1.construct(nullPkg, nullFmt, None, ("script", "digest", []), digestEnv=Env({"a": "asdf"})) # different value s2 = CheckoutStep() s2.construct(nullPkg, nullFmt, None, ("script", "digest", []), digestEnv=Env({"a": "qwer"})) assert s1.getVariantId() != s2.getVariantId() # added entry s2 = CheckoutStep() s2.construct(nullPkg, nullFmt, None, ("script", "digest", []), digestEnv=Env({ "a": "asdf", "b": "qwer" })) assert s1.getVariantId() != s2.getVariantId() # removed entry s2 = CheckoutStep() s2.construct(nullPkg, nullFmt, None, ("script", "digest", []), digestEnv=Env()) assert s1.getVariantId() != s2.getVariantId()
def testDigestFullEnv(self): """Full env does not change digest. It is only used for SCMs.""" s1 = CoreCheckoutStep(nullPkg, ("script", "digest", [], []), [], Env({"a" : "asdf", "q": "qwer" }), Env({ "a" : "asdf" })) s2 = CoreCheckoutStep(nullPkg, ("script", "digest", [], []), [], Env(), Env({ "a" : "asdf" })) assert s1.variantId == s2.variantId
def testDigestEnvRotation(self): """Rotating characters between key-value pairs must be detected""" s1 = CoreCheckoutStep(nullPkg, ("script", "digest", [], []), [], digestEnv=Env({ "a": "bc", "cd": "e" })) s2 = CoreCheckoutStep(nullPkg, ("script", "digest", [], []), [], digestEnv=Env({ "a": "bcc", "d": "e" })) assert s1.variantId != s2.variantId s1 = CoreCheckoutStep(nullPkg, ("script", "digest", [], []), [], digestEnv=Env({ "a": "bb", "c": "dd", "e": "ff" })) s2 = CoreCheckoutStep(nullPkg, ("script", "digest", [], []), [], digestEnv=Env({ "a": "bbc=dd", "e": "ff" })) assert s1.variantId != s2.variantId
def testDigestTools(self): """Tools must influence digest""" t1 = Empty() t1.step = Empty() t1.step.getVariantId = Mock(return_value=b'0123456789abcdef') t1.path = "p1" t1.libs = [] s1 = CheckoutStep() s1.construct(nullPkg, nullFmt, None, ("script", "digest", []), tools=Env({"a": t1})) # tool name has no influence s2 = CheckoutStep() s2.construct(nullPkg, nullFmt, None, ("script", "digest", []), tools=Env({"zz": t1})) assert s1.getVariantId() == s2.getVariantId() # step digest change t2 = Empty() t2.step = Empty() t2.step.getVariantId = Mock(return_value=b'0123456789000000') t2.path = "p1" t2.libs = [] s2 = CheckoutStep() s2.construct(nullPkg, nullFmt, None, ("script", "digest", []), tools=Env({"a": t2})) assert s1.getVariantId() != s2.getVariantId() # path change t2.step.getVariantId = Mock(return_value=b'0123456789abcdef') t2.path = "foo" t2.libs = [] s2 = CheckoutStep() s2.construct(nullPkg, nullFmt, None, ("script", "digest", []), tools=Env({"a": t2})) assert s1.getVariantId() != s2.getVariantId() # libs change t2.step.getVariantId = Mock(return_value=b'0123456789abcdef') t2.path = "p1" t2.libs = ["asdf"] s2 = CheckoutStep() s2.construct(nullPkg, nullFmt, None, ("script", "digest", []), tools=Env({"a": t2})) assert s1.getVariantId() != s2.getVariantId()
def testDigestScriptChange(self): """Script does influnce the digest""" s1 = CoreCheckoutStep(nullPkg, ("script", "digest", [], []), [], Env({"a" : "asdf", "q": "qwer" }), Env({ "a" : "asdf" })) evilPkg = MockCorePackage(checkoutScript="evil", checkoutDigestScript="other digest") s2 = CoreCheckoutStep(evilPkg, ("evil", "other digest", [], []), [], Env({"a" : "asdf", "q": "qwer" }), Env({ "a" : "asdf" })) assert s1.variantId != s2.variantId
def testDigestFullEnv(self): """Full env does not change digest. It is only used for SCMs.""" s1 = CheckoutStep() s1.construct(nullPkg, nullFmt, None, ("script", "digest", []), Env({ "a": "asdf", "q": "qwer" }), Env({"a": "asdf"})) s2 = CheckoutStep() s2.construct(nullPkg, nullFmt, None, ("script", "digest", []), Env(), Env({"a": "asdf"})) assert s1.getVariantId() == s2.getVariantId()
def testDeriveResetTwo(self): e1 = Env() e2 = e1.derive() e2.touchReset() e3 = e2.derive() e3.touchReset() e1.get('bar') e2.get('foo') e3.get('baz') self.assertEqual(e1.touchedKeys(), set(['foo', 'bar', 'baz'])) self.assertEqual(e2.touchedKeys(), set(['foo', 'baz'])) self.assertEqual(e3.touchedKeys(), set(['baz']))
def testDigestScriptChange(self): """Script does influnce the digest""" s1 = CheckoutStep() s1.construct(nullPkg, nullFmt, None, ("script", "digest", []), Env({ "a": "asdf", "q": "qwer" }), Env({"a": "asdf"})) s2 = CheckoutStep() s2.construct(nullPkg, nullFmt, None, ("evil", "other digest", []), Env({ "a": "asdf", "q": "qwer" }), Env({"a": "asdf"})) assert s1.getVariantId() != s2.getVariantId()
def testDigestStable(self): """Same input should yield same digest""" s1 = CheckoutStep() s1.construct(nullPkg, nullFmt, None, ("script", "digest", []), Env({ "a": "asdf", "q": "qwer" }), Env({"a": "asdf"})) s2 = CheckoutStep() s2.construct(nullPkg, nullFmt, None, ("script", "digest", []), Env({ "a": "asdf", "q": "qwer" }), Env({"a": "asdf"})) assert s1.getVariantId() == s2.getVariantId()
def testDigestEmpyEnv(self): """Adding empty entry must be detected""" s1 = CheckoutStep() s1.construct(nullPkg, nullFmt, None, ("script", "digest", []), digestEnv=Env({"a": "b"})) s2 = CheckoutStep() s2.construct(nullPkg, nullFmt, None, ("script", "digest", []), digestEnv=Env({ "a": "b", "": "" })) assert s1.getVariantId() != s2.getVariantId()
def testDigestEnv(self): """Env changes digest""" s1 = CoreCheckoutStep(nullPkg, ("script", "digest", [], []), [], digestEnv=Env({ "a" : "asdf" })) # different value s2 = CoreCheckoutStep(nullPkg, ("script", "digest", [], []), [], digestEnv=Env({ "a" : "qwer" })) assert s1.variantId != s2.variantId # added entry s2 = CoreCheckoutStep(nullPkg, ("script", "digest", [], []), [], digestEnv=Env({ "a" : "asdf", "b" : "qwer" })) assert s1.variantId != s2.variantId # removed entry s2 = CoreCheckoutStep(nullPkg, ("script", "digest", [], []), [], digestEnv=Env()) assert s1.variantId != s2.variantId
def testDigestEnvRotation(self): """Rotating characters between key-value pairs must be detected""" s1 = CheckoutStep() s1.construct(nullPkg, nullFmt, None, ("script", "digest", []), digestEnv=Env({ "a": "bc", "cd": "e" })) s2 = CheckoutStep() s2.construct(nullPkg, nullFmt, None, ("script", "digest", []), digestEnv=Env({ "a": "bcc", "d": "e" })) assert s1.getVariantId() != s2.getVariantId() s1 = CheckoutStep() s1.construct(nullPkg, nullFmt, None, ("script", "digest", []), digestEnv=Env({ "a": "bb", "c": "dd", "e": "ff" })) s2 = CheckoutStep() s2.construct(nullPkg, nullFmt, None, ("script", "digest", []), digestEnv=Env({ "a": "bbc=dd", "e": "ff" })) assert s1.getVariantId() != s2.getVariantId()
def testDerive(self): e1 = Env() e2 = e1.derive() e1.get('bar') e2.get('foo') self.assertEqual(e1.touchedKeys(), set(['foo', 'bar'])) self.assertEqual(e2.touchedKeys(), set(['foo', 'bar']))
def testDeriveResetSplit(self): e1 = Env() e2 = e1.derive() e2.touchReset() e3 = e1.derive() e3.touchReset() e1.get('bar') e2.get('foo') e3.get('baz') self.assertEqual(e1.touchedKeys(), set(['foo', 'bar', 'baz'])) self.assertEqual(e2.touchedKeys(), set(['foo'])) self.assertEqual(e3.touchedKeys(), set(['baz']))
def testTouch(self): e1 = Env() e1.touch(['foo']) self.assertEqual(e1.touchedKeys(), set(['foo']))