From f0c9f4169be6c5c7dd913f348cdd294a19038d63 Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Mon, 23 May 2022 17:40:03 +0200 Subject: [bugfix] Fix multiple dereferences of boosted status causing media duplication (#589) * add some announces to test models * start on announce test logic * test federatingDB.Announce * change signature of GetRemoteStatus * remove 'refresh' logic and replace it with refetch * go fmt * remove timeline manager from processor test * make zork created at determinate * test get account statuses * test get + serialize zork * make account keys determinate * make admin accountCreate time determinate * test account to as * init test config before test log * test status to frontend * remove daft Within check * hack around a bit * use index of slice --- internal/federation/federatingdb/announce_test.go | 93 ++++++++++++++++++++++ .../federation/federatingdb/federatingdb_test.go | 3 +- 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 internal/federation/federatingdb/announce_test.go (limited to 'internal/federation/federatingdb') diff --git a/internal/federation/federatingdb/announce_test.go b/internal/federation/federatingdb/announce_test.go new file mode 100644 index 000000000..f63910298 --- /dev/null +++ b/internal/federation/federatingdb/announce_test.go @@ -0,0 +1,93 @@ +/* + GoToSocial + Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package federatingdb_test + +import ( + "testing" + + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/activity/streams/vocab" + "github.com/superseriousbusiness/gotosocial/internal/ap" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +) + +type AnnounceTestSuite struct { + FederatingDBTestSuite +} + +func (suite *AnnounceTestSuite) TestNewAnnounce() { + receivingAccount1 := suite.testAccounts["local_account_1"] + announcingAccount := suite.testAccounts["remote_account_1"] + + ctx := createTestContext(receivingAccount1, announcingAccount) + announce1 := suite.testActivities["announce_forwarded_1_zork"] + + err := suite.federatingDB.Announce(ctx, announce1.Activity.(vocab.ActivityStreamsAnnounce)) + suite.NoError(err) + + // should be a message heading to the processor now, which we can intercept here + msg := <-suite.fromFederator + suite.Equal(ap.ActivityAnnounce, msg.APObjectType) + suite.Equal(ap.ActivityCreate, msg.APActivityType) + + boost, ok := msg.GTSModel.(*gtsmodel.Status) + suite.True(ok) + suite.Equal(announcingAccount.ID, boost.AccountID) + + // only the URI will be set on the boosted status because it still needs to be dereferenced + suite.NotEmpty(boost.BoostOf.URI) +} + +func (suite *AnnounceTestSuite) TestAnnounceTwice() { + receivingAccount1 := suite.testAccounts["local_account_1"] + receivingAccount2 := suite.testAccounts["local_account_2"] + + announcingAccount := suite.testAccounts["remote_account_1"] + + ctx1 := createTestContext(receivingAccount1, announcingAccount) + announce1 := suite.testActivities["announce_forwarded_1_zork"] + + err := suite.federatingDB.Announce(ctx1, announce1.Activity.(vocab.ActivityStreamsAnnounce)) + suite.NoError(err) + + // should be a message heading to the processor now, which we can intercept here + msg := <-suite.fromFederator + suite.Equal(ap.ActivityAnnounce, msg.APObjectType) + suite.Equal(ap.ActivityCreate, msg.APActivityType) + boost, ok := msg.GTSModel.(*gtsmodel.Status) + suite.True(ok) + suite.Equal(announcingAccount.ID, boost.AccountID) + + // only the URI will be set on the boosted status because it still needs to be dereferenced + suite.NotEmpty(boost.BoostOf.URI) + + ctx2 := createTestContext(receivingAccount2, announcingAccount) + announce2 := suite.testActivities["announce_forwarded_1_turtle"] + + err = suite.federatingDB.Announce(ctx2, announce2.Activity.(vocab.ActivityStreamsAnnounce)) + suite.NoError(err) + + // since this is a repeat announce with the same URI, just delivered to a different inbox, + // we should have nothing in the messages channel... + suite.Empty(suite.fromFederator) +} + +func TestAnnounceTestSuite(t *testing.T) { + suite.Run(t, &AnnounceTestSuite{}) +} diff --git a/internal/federation/federatingdb/federatingdb_test.go b/internal/federation/federatingdb/federatingdb_test.go index 8e6c1802d..ded817c98 100644 --- a/internal/federation/federatingdb/federatingdb_test.go +++ b/internal/federation/federatingdb/federatingdb_test.go @@ -63,8 +63,9 @@ func (suite *FederatingDBTestSuite) SetupSuite() { } func (suite *FederatingDBTestSuite) SetupTest() { - testrig.InitTestLog() testrig.InitTestConfig() + testrig.InitTestLog() + suite.fedWorker = concurrency.NewWorkerPool[messages.FromFederator](-1, -1) suite.fromFederator = make(chan messages.FromFederator, 10) suite.fedWorker.SetProcessor(func(ctx context.Context, msg messages.FromFederator) error { -- cgit v1.3