From 7844028260bcccb3569b6aa1e7d3824d616acdf0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 4 Aug 2021 11:04:29 +0100 Subject: [PATCH] Start of shared item federation unit test --- epicyon.py | 3 + tests.py | 257 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 260 insertions(+) diff --git a/epicyon.py b/epicyon.py index 8a78c5bb9..5bbf4660d 100644 --- a/epicyon.py +++ b/epicyon.py @@ -54,6 +54,7 @@ from follow import clearFollows from follow import followerOfPerson from follow import sendFollowRequestViaServer from follow import sendUnfollowRequestViaServer +from tests import testSharedItemsFederation from tests import testGroupFollow from tests import testPostMessageBetweenServers from tests import testFollowBetweenServers @@ -612,6 +613,8 @@ if args.tests: sys.exit() if args.testsnetwork: print('Network Tests') + testSharedItemsFederation() + sys.exit() testGroupFollow() testPostMessageBetweenServers() testFollowBetweenServers() diff --git a/tests.py b/tests.py index 03ff5699a..292cb4a7a 100644 --- a/tests.py +++ b/tests.py @@ -139,6 +139,7 @@ from shares import generateSharedItemFederationTokens from shares import createSharedItemFederationToken from shares import updateSharedItemFederationToken from shares import mergeSharedItemTokens +from shares import sendShareViaServer testServerGroupRunning = False testServerAliceRunning = False @@ -1329,6 +1330,262 @@ def testFollowBetweenServers(): shutil.rmtree(baseDir + '/.tests') +def testSharedItemsFederation(): + print('Testing federation of shared items between Alice and Bob') + + global testServerAliceRunning + global testServerBobRunning + testServerAliceRunning = False + testServerBobRunning = False + + systemLanguage = 'en' + httpPrefix = 'http' + proxyType = None + federationList = [] + + baseDir = os.getcwd() + if os.path.isdir(baseDir + '/.tests'): + shutil.rmtree(baseDir + '/.tests') + os.mkdir(baseDir + '/.tests') + + # create the servers + aliceDir = baseDir + '/.tests/alice' + aliceDomain = '127.0.0.74' + alicePort = 61917 + aliceSendThreads = [] + aliceAddress = aliceDomain + ':' + str(alicePort) + + bobDir = baseDir + '/.tests/bob' + bobDomain = '127.0.0.81' + bobPort = 61983 + bobSendThreads = [] + bobAddress = bobDomain + ':' + str(bobPort) + bobPassword = 'bobpass' + bobCachedWebfingers = {} + bobPersonCache = {} + + global thrAlice + if thrAlice: + while thrAlice.is_alive(): + thrAlice.stop() + time.sleep(1) + thrAlice.kill() + + thrAlice = \ + threadWithTrace(target=createServerAlice, + args=(aliceDir, aliceDomain, alicePort, bobAddress, + federationList, False, False, + aliceSendThreads), + daemon=True) + + global thrBob + if thrBob: + while thrBob.is_alive(): + thrBob.stop() + time.sleep(1) + thrBob.kill() + + thrBob = \ + threadWithTrace(target=createServerBob, + args=(bobDir, bobDomain, bobPort, aliceAddress, + federationList, False, False, + bobSendThreads), + daemon=True) + + thrAlice.start() + thrBob.start() + assert thrAlice.is_alive() is True + assert thrBob.is_alive() is True + + # wait for all servers to be running + ctr = 0 + while not (testServerAliceRunning and testServerBobRunning): + time.sleep(1) + ctr += 1 + if ctr > 60: + break + print('Alice online: ' + str(testServerAliceRunning)) + print('Bob online: ' + str(testServerBobRunning)) + assert ctr <= 60 + time.sleep(1) + + # In the beginning all was calm and there were no follows + + print('*********************************************************') + print('Alice sends a follow request to Bob') + os.chdir(aliceDir) + sessionAlice = createSession(proxyType) + inReplyTo = None + inReplyToAtomUri = None + subject = None + alicePostLog = [] + followersOnly = False + saveToFile = True + clientToServer = False + ccUrl = None + alicePersonCache = {} + aliceCachedWebfingers = {} + alicePostLog = [] + bobActor = httpPrefix + '://' + bobAddress + '/users/bob' + sendResult = \ + sendFollowRequest(sessionAlice, aliceDir, + 'alice', aliceDomain, alicePort, httpPrefix, + 'bob', bobDomain, bobActor, + bobPort, httpPrefix, + clientToServer, federationList, + aliceSendThreads, alicePostLog, + aliceCachedWebfingers, alicePersonCache, + True, __version__) + print('sendResult: ' + str(sendResult)) + + for t in range(16): + if os.path.isfile(bobDir + '/accounts/bob@' + + bobDomain + '/followers.txt'): + if os.path.isfile(aliceDir + '/accounts/alice@' + + aliceDomain + '/following.txt'): + if os.path.isfile(aliceDir + '/accounts/alice@' + + aliceDomain + '/followingCalendar.txt'): + break + time.sleep(1) + + assert validInbox(bobDir, 'bob', bobDomain) + assert validInboxFilenames(bobDir, 'bob', bobDomain, + aliceDomain, alicePort) + assert 'alice@' + aliceDomain in open(bobDir + '/accounts/bob@' + + bobDomain + '/followers.txt').read() + assert 'bob@' + bobDomain in open(aliceDir + '/accounts/alice@' + + aliceDomain + '/following.txt').read() + assert 'bob@' + bobDomain in open(aliceDir + '/accounts/alice@' + + aliceDomain + + '/followingCalendar.txt').read() + assert not isGroupActor(aliceDir, bobActor, alicePersonCache) + + print('\n\n*********************************************************') + print('Bob publishes a shared item') + sessionBob = createSession(proxyType) + sharedItemName = 'cheddar' + sharedItemDescription = 'Some cheese' + sharedItemImageFilename = 'img/logo.png' + sharedItemQty = 1 + sharedItemType = 'Cheese' + sharedItemCategory = 'Food' + sharedItemLocation = "Bob's location" + sharedItemDuration = "10 days" + sharedItemPrice = "1.30" + sharedItemCurrency = "EUR" + shareJson = \ + sendShareViaServer(bobDir, sessionBob, + 'bob', bobPassword, + bobDomain, bobPort, + httpPrefix, sharedItemName, + sharedItemDescription, sharedItemImageFilename, + sharedItemQty, sharedItemType, sharedItemCategory, + sharedItemLocation, sharedItemDuration, + bobCachedWebfingers, bobPersonCache, + True, __version__, + sharedItemPrice, sharedItemCurrency) + assert shareJson + assert isinstance(shareJson, dict) + sharedItemName = 'Epicyon T-shirt' + sharedItemDescription = 'A fashionable item' + sharedItemImageFilename = 'img/logo.png' + sharedItemQty = 1 + sharedItemType = 'T-Shirt' + sharedItemCategory = 'Clothes' + sharedItemLocation = "Bob's location" + sharedItemDuration = "5 days" + sharedItemPrice = "0" + sharedItemCurrency = "EUR" + shareJson = \ + sendShareViaServer(bobDir, sessionBob, + 'bob', bobPassword, + bobDomain, bobPort, + httpPrefix, sharedItemName, + sharedItemDescription, sharedItemImageFilename, + sharedItemQty, sharedItemType, sharedItemCategory, + sharedItemLocation, sharedItemDuration, + bobCachedWebfingers, bobPersonCache, + True, __version__, + sharedItemPrice, sharedItemCurrency) + assert shareJson + assert isinstance(shareJson, dict) + sharedItemName = 'Soldering iron' + sharedItemDescription = 'A soldering iron' + sharedItemImageFilename = 'img/logo.png' + sharedItemQty = 1 + sharedItemType = 'Soldering iron' + sharedItemCategory = 'Tools' + sharedItemLocation = "Bob's location" + sharedItemDuration = "9 days" + sharedItemPrice = "10.00" + sharedItemCurrency = "EUR" + shareJson = \ + sendShareViaServer(bobDir, sessionBob, + 'bob', bobPassword, + bobDomain, bobPort, + httpPrefix, sharedItemName, + sharedItemDescription, sharedItemImageFilename, + sharedItemQty, sharedItemType, sharedItemCategory, + sharedItemLocation, sharedItemDuration, + bobCachedWebfingers, bobPersonCache, + True, __version__, + sharedItemPrice, sharedItemCurrency) + assert shareJson + assert isinstance(shareJson, dict) + + print('\n\n*********************************************************') + print('Alice sends a message to Bob') + alicePostLog = [] + alicePersonCache = {} + aliceCachedWebfingers = {} + alicePostLog = [] + isArticle = False + city = 'London, England' + sendResult = \ + sendPost(__version__, + sessionAlice, aliceDir, 'alice', aliceDomain, alicePort, + 'bob', bobDomain, bobPort, ccUrl, + httpPrefix, 'Alice message', followersOnly, saveToFile, + clientToServer, True, + None, None, None, city, federationList, + aliceSendThreads, alicePostLog, aliceCachedWebfingers, + alicePersonCache, isArticle, systemLanguage, inReplyTo, + inReplyToAtomUri, subject) + print('sendResult: ' + str(sendResult)) + + queuePath = bobDir + '/accounts/bob@' + bobDomain + '/queue' + inboxPath = bobDir + '/accounts/bob@' + bobDomain + '/inbox' + aliceMessageArrived = False + for i in range(20): + time.sleep(1) + if os.path.isdir(inboxPath): + if len([name for name in os.listdir(inboxPath) + if os.path.isfile(os.path.join(inboxPath, name))]) > 0: + aliceMessageArrived = True + print('Alice message sent to Bob!') + break + + assert aliceMessageArrived is True + print('Message from Alice to Bob succeeded') + + # stop the servers + thrAlice.kill() + thrAlice.join() + assert thrAlice.is_alive() is False + + thrBob.kill() + thrBob.join() + assert thrBob.is_alive() is False + + # queue item removed + time.sleep(4) + assert len([name for name in os.listdir(queuePath) + if os.path.isfile(os.path.join(queuePath, name))]) == 0 + + os.chdir(baseDir) + shutil.rmtree(baseDir + '/.tests') + + def testGroupFollow(): print('Testing following of a group')