def testValidateDataMajorityPasses(): consense = consensing.CompositeConsense() response1 = builder.DideryResponseBuilder( builder.CompositeHistoryBuilder().withRotations()).withPort(8000) response2 = builder.DideryResponseBuilder(builder.CompositeHistoryBuilder( ).withRotations().withInvalidRotationSigAt(1)) response3 = builder.DideryResponseBuilder( builder.CompositeHistoryBuilder().withRotations()).withPort(8081) data = { 'http://localhost:8000/event/': response1.build(), 'http://localhost:8080/event/': response2.build(), 'http://localhost:8081/event/': response3.build() } consense.validateData(data) exp_data = response1.historyBuilder.build() sha = sha256(str(ODict(exp_data)).encode()).hexdigest() assert sha in consense.valid_data assert consense.valid_data[sha]['0'] == exp_data['0'].data assert consense.valid_data[sha]['1'] == exp_data['1'].data assert sha in consense.valid_match_counts assert consense.valid_match_counts == {sha: 2}
def testValidateDataValidSigsConflictingData(): consense = consensing.CompositeConsense() response1 = builder.DideryResponseBuilder( builder.CompositeHistoryBuilder().withRotations()).withPort(8000) response2 = builder.DideryResponseBuilder( builder.CompositeHistoryBuilder().withRotations().withRotations()) response3 = builder.DideryResponseBuilder( builder.CompositeHistoryBuilder().withRotations()).withPort(8081) data = { 'http://localhost:8000/event/': response1.build(), 'http://localhost:8080/event/': response2.build(), 'http://localhost:8081/event/': response3.build() } consense.validateData(data) exp_data = response1.historyBuilder.build() sha = sha256(str(ODict(exp_data)).encode()).hexdigest() bad_exp_data = response2.historyBuilder.build() bad_sha = sha256(str(ODict(bad_exp_data)).encode()).hexdigest() assert sha in consense.valid_data assert consense.valid_data[sha]['0'] == exp_data['0'].data assert consense.valid_data[sha]['1'] == exp_data['1'].data assert sha in consense.valid_match_counts assert consense.valid_match_counts[sha] == 2 assert bad_sha in consense.valid_data assert consense.valid_data[bad_sha]['0'] == bad_exp_data['0'].data assert consense.valid_data[bad_sha]['1'] == bad_exp_data['1'].data assert consense.valid_data[bad_sha]['2'] == bad_exp_data['2'].data assert bad_sha in consense.valid_match_counts assert consense.valid_match_counts[bad_sha] == 1
def testValidateDataValidSigsConflictingData(): consense = consensing.Consense() response1 = builder.DideryResponseBuilder( builder.SignedHistoryBuilder()).withPort(8000) response2 = builder.DideryResponseBuilder(builder.SignedHistoryBuilder()) response3 = builder.DideryResponseBuilder( builder.SignedHistoryBuilder().withRotation().withRotation()).withPort( 8081) data = { "http://localhost:8000/history": response1.build(), "http://localhost:8080/history": response2.build(), "http://localhost:8081/history": response3.build() } consense.validateData(data) history1 = response1.historyBuilder history3 = response3.historyBuilder assert consense.valid_data == { history1.signerSig: history1.build().data, history3.rotationSig: history3.build().data } assert history1.signerSig in consense.valid_match_counts assert consense.valid_match_counts[history1.signerSig] == 2 assert history3.rotationSig in consense.valid_match_counts assert consense.valid_match_counts[history3.rotationSig] == 1
def testValidateDataWithTimeOut(): consense = consensing.Consense() response1 = builder.DideryResponseBuilder( builder.SignedHistoryBuilder().withEmptyData()).withPort( 8000).withStatus(0) response2 = builder.DideryResponseBuilder(builder.SignedHistoryBuilder()) data = { "http://localhost:8000/history": response1.build(), "http://localhost:8080/history": response2.build() } consense.validateData(data) history2 = response2.historyBuilder assert consense.valid_data == {history2.signerSig: history2.build().data} assert consense.valid_match_counts == {history2.signerSig: 1}
def testConsenseIncompleteMajority(): consense = consensing.Consense() response1 = builder.DideryResponseBuilder( builder.SignedHistoryBuilder().withInvalidSignerSignature()).withPort( 8000) response2 = builder.DideryResponseBuilder( builder.SignedHistoryBuilder().withRotation()) response3 = builder.DideryResponseBuilder( builder.SignedHistoryBuilder().withRotation().withRotation()).withPort( 8081) data = { "http://localhost:8000/history": response1.build(), "http://localhost:8080/history": response2.build(), "http://localhost:8081/history": response3.build() } assert consense.consense(data)[0] is None
def testValidateDataInvalidSigsIncompleteMajority(): consense = consensing.Consense() response1 = builder.DideryResponseBuilder( builder.SignedHistoryBuilder().withInvalidSignerSignature()).withPort( 8000) response2 = builder.DideryResponseBuilder(builder.SignedHistoryBuilder()) data = { "http://localhost:8000/history": response1.build(), "http://localhost:8080/history": response2.build() } consense.validateData(data) history2 = response2.historyBuilder assert consense.valid_data == { history2.signerSig: builder.SignedHistoryBuilder().build().data } assert consense.valid_match_counts == {history2.signerSig: 1}
def test50_50Split(): consense = consensing.Consense() response1 = builder.DideryResponseBuilder( builder.SignedHistoryBuilder()).withPort(8000) response2 = builder.DideryResponseBuilder(builder.SignedHistoryBuilder()) response3 = builder.DideryResponseBuilder( builder.SignedHistoryBuilder().withRotation().withRotation()).withPort( 8081) response4 = builder.DideryResponseBuilder( builder.SignedHistoryBuilder().withRotation().withRotation()).withPort( 8001) data = { "http://localhost:8000/history": response1.build(), "http://localhost:8080/history": response2.build(), "http://localhost:8081/history": response3.build(), "http://localhost:8001/history": response4.build() } assert consense.consense(data)[0] is None
def testValidateDataWith200StatusNoData(): consense = consensing.CompositeConsense() response1 = builder.DideryResponseBuilder( builder.CompositeHistoryBuilder().withRotations()).withPort(8000) response2 = builder.DideryResponseBuilder( builder.CompositeHistoryBuilder().withEmptyData()).withStatus(200) data = { 'http://localhost:8000/event/': response1.build(), 'http://localhost:8080/event/': response2.build() } consense.validateData(data) exp_data = response1.historyBuilder.build() sha = sha256(str(ODict(exp_data)).encode()).hexdigest() assert len(consense.valid_data) == 1 assert sha in consense.valid_data assert consense.valid_data[sha]['0'] == exp_data['0'].data assert consense.valid_data[sha]['1'] == exp_data['1'].data assert sha in consense.valid_match_counts assert consense.valid_match_counts == {sha: 1}
def testConsenseAllEqual(): consense = consensing.Consense() response1 = builder.DideryResponseBuilder( builder.SignedHistoryBuilder().withRotation()).withPort(8000) data = { "http://localhost:8000/history": response1.withPort(8000).build(), "http://localhost:8080/history": response1.withPort(8080).build(), "http://localhost:8081/history": response1.withPort(8081).build() } signature = response1.historyBuilder.rotationSig assert consense.consense(data)[0] == response1.historyBuilder.build().data assert signature in consense.valid_data assert signature in consense.valid_match_counts assert consense.valid_match_counts[signature] == 3