Hi VIFF'ers,


I have a small class and a unit test for it. The unittest fails, but this is not the real issue. The issue is the strange behavior I see during execution.

During execution I see output similar to this:
>>>
Seeding random generator with random seed 5590
test_dealer
  DealerTest
    test_next_three_cards ... INIT Share value: None <Share at 0x278f0a8>
...
contains 3 []
...
contains 1 []
adding 1 <Share at 0x278ceb8  current result: {13}>
...
contains 2 []
adding 2 <Share at 0x278f558>
...
contains 2 [<Share at 0x278f558  current result: None>]
adding 2 <Share at 0x2787d50>
...
contains 3 [<Share at 0x278f440  current result: None>]
adding 3 <Share at 0x2791c38>
...
contains 1 [<Share at 0x278ceb8  current result: None>]
adding 1 <Share at 0x278fc88  current result: {9}>
...
<<<

As you see when player 1 adds a share to the value list, the current result of the share is 13. However when player 1 comes around to add a new share with current result 9, the current result of the share already contained in the list has transformed into None! It is clear from the hashcode that it is still the same object, so why does the current value change??

I have tried to boil down the code as much as possible. 

The test is executed with
trial test_dealer.py
on python 2.6.2

from viff.field import GF
Zp = GF(53)

class Dealer(object):
    
    def __init__(self, runtime):
        self.runtime = runtime
        self.values = []

    def next_card(self, a):
        print "n1", self.runtime.id
        def choose_random_card1(x, a, r):
            print "adding", self.runtime.id, r
            self.values.append(r)
            return r
            
        def choose_random_card(a):
            print "n3", self.runtime.id
            if 1 == self.runtime.id:
                r = self.runtime.input([1], Zp, 23)
            else:
                r = self.runtime.input([1], Zp)
            print "contains", self.runtime.id, self.values
            self.runtime.schedule_callback(a, choose_random_card1, a, r)
            print "n9", self.runtime.id
            a.addErrback(errorHandler)
            print "n10", self.runtime.id
            return a

        print "n2", self.runtime.id
        return choose_random_card(a)

def errorHandler(failure):
    print "Error: %s" % failure
    return failure
# Import VIFF packages.
from viff.test.util import RuntimeTestCase, protocol
from twisted.internet.defer import DeferredList

from dealer import Dealer

import pdb

from viff.field import GF
Zp = GF(53)

class DealerTest(RuntimeTestCase):

    def get_value(self, runtime, v):
        if 1 == runtime.id:
            a = runtime.input([1], Zp, v)
        else:
            a = runtime.input([1], Zp)
        return a

    @protocol
    def test_next_three_cards(self, runtime):
        dealer = Dealer(runtime)

        fourtwo = self.get_value(runtime, 42)
        card1 = dealer.next_card(fourtwo)

        def validation(x, c1, c2):
            print "VALIDATION"
            print ">>>>", x, c1, c2
            self.assertEquals(x, [7, 7, 7]) 
            return x

        def step3(card2, card1):
            print "STEP 3"
            card3 = dealer.next_card(fourtwo)
            c3 = runtime.output(card3)
            runtime.schedule_callback(c3, validation, card1, card2)
            return c3

        def step2(card1):
            print "STEP 2"
            card2 = dealer.next_card(fourtwo)
            c2 = runtime.output(card2)
            runtime.schedule_callback(c2, step3, card1)
            return c2      

        c1 = runtime.output(card1)
        runtime.schedule_callback(c1, step2)
        return c1
        


____________________________________________________

Janus Dam Nielsen

R&D SCIENTIST, PhD.
CENTRE FOR IT-SECURITY

THE ALEXANDRA INSTITUTE LTD.

T +45 42 22 93 56
W alexandra.dk
____________________________________________________

_______________________________________________
viff-devel mailing list (http://viff.dk/)
viff-devel@viff.dk
http://lists.viff.dk/listinfo.cgi/viff-devel-viff.dk

Reply via email to