| 
									
										
										
										
											2022-07-18 12:55:06 +02:00
										 |  |  | /* | 
					
						
							|  |  |  |    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 <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-29 15:41:41 +01:00
										 |  |  | package cache_test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2022-09-02 10:58:42 +01:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2021-08-29 15:41:41 +01:00
										 |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-01 10:08:21 +01:00
										 |  |  | 	"github.com/stretchr/testify/suite" | 
					
						
							| 
									
										
										
										
											2021-08-29 15:41:41 +01:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/cache" | 
					
						
							|  |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" | 
					
						
							| 
									
										
										
										
											2021-09-01 10:08:21 +01:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/testrig" | 
					
						
							| 
									
										
										
										
											2021-08-29 15:41:41 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-01 10:08:21 +01:00
										 |  |  | type StatusCacheTestSuite struct { | 
					
						
							|  |  |  | 	suite.Suite | 
					
						
							|  |  |  | 	data  map[string]*gtsmodel.Status | 
					
						
							|  |  |  | 	cache *cache.StatusCache | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-08-29 15:41:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-01 10:08:21 +01:00
										 |  |  | func (suite *StatusCacheTestSuite) SetupSuite() { | 
					
						
							|  |  |  | 	suite.data = testrig.NewTestStatuses() | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-08-29 15:41:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-01 10:08:21 +01:00
										 |  |  | func (suite *StatusCacheTestSuite) SetupTest() { | 
					
						
							|  |  |  | 	suite.cache = cache.NewStatusCache() | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-08-29 15:41:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-01 10:08:21 +01:00
										 |  |  | func (suite *StatusCacheTestSuite) TearDownTest() { | 
					
						
							|  |  |  | 	suite.data = nil | 
					
						
							|  |  |  | 	suite.cache = nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *StatusCacheTestSuite) TestStatusCache() { | 
					
						
							|  |  |  | 	for _, status := range suite.data { | 
					
						
							|  |  |  | 		// Place in the cache | 
					
						
							|  |  |  | 		suite.cache.Put(status) | 
					
						
							| 
									
										
										
										
											2021-08-29 15:41:41 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-09-01 10:08:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for _, status := range suite.data { | 
					
						
							|  |  |  | 		var ok bool | 
					
						
							|  |  |  | 		var check *gtsmodel.Status | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Check we can retrieve | 
					
						
							|  |  |  | 		check, ok = suite.cache.GetByID(status.ID) | 
					
						
							|  |  |  | 		if !ok && !statusIs(status, check) { | 
					
						
							| 
									
										
										
										
											2022-09-02 10:58:42 +01:00
										 |  |  | 			suite.Fail(fmt.Sprintf("Failed to fetch expected account with ID: %s", status.ID)) | 
					
						
							| 
									
										
										
										
											2021-09-01 10:08:21 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		check, ok = suite.cache.GetByURI(status.URI) | 
					
						
							|  |  |  | 		if status.URI != "" && !ok && !statusIs(status, check) { | 
					
						
							| 
									
										
										
										
											2022-09-02 10:58:42 +01:00
										 |  |  | 			suite.Fail(fmt.Sprintf("Failed to fetch expected account with URI: %s", status.URI)) | 
					
						
							| 
									
										
										
										
											2021-09-01 10:08:21 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		check, ok = suite.cache.GetByURL(status.URL) | 
					
						
							|  |  |  | 		if status.URL != "" && !ok && !statusIs(status, check) { | 
					
						
							| 
									
										
										
										
											2022-09-02 10:58:42 +01:00
										 |  |  | 			suite.Fail(fmt.Sprintf("Failed to fetch expected account with URL: %s", status.URL)) | 
					
						
							| 
									
										
										
										
											2021-09-01 10:08:21 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2021-08-29 15:41:41 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-15 12:35:05 +02:00
										 |  |  | func (suite *StatusCacheTestSuite) TestBoolPointerCopying() { | 
					
						
							|  |  |  | 	originalStatus := suite.data["local_account_1_status_1"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// mark the status as pinned + cache it | 
					
						
							|  |  |  | 	pinned := true | 
					
						
							|  |  |  | 	originalStatus.Pinned = &pinned | 
					
						
							|  |  |  | 	suite.cache.Put(originalStatus) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// retrieve it | 
					
						
							|  |  |  | 	cachedStatus, ok := suite.cache.GetByID(originalStatus.ID) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		suite.FailNow("status wasn't retrievable from cache") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// we should be able to change the original status values + cached | 
					
						
							|  |  |  | 	// values independently since they use different pointers | 
					
						
							|  |  |  | 	suite.True(*cachedStatus.Pinned) | 
					
						
							|  |  |  | 	*originalStatus.Pinned = false | 
					
						
							|  |  |  | 	suite.False(*originalStatus.Pinned) | 
					
						
							|  |  |  | 	suite.True(*cachedStatus.Pinned) | 
					
						
							|  |  |  | 	*originalStatus.Pinned = true | 
					
						
							|  |  |  | 	*cachedStatus.Pinned = false | 
					
						
							|  |  |  | 	suite.True(*originalStatus.Pinned) | 
					
						
							|  |  |  | 	suite.False(*cachedStatus.Pinned) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-01 10:08:21 +01:00
										 |  |  | func TestStatusCache(t *testing.T) { | 
					
						
							|  |  |  | 	suite.Run(t, &StatusCacheTestSuite{}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-29 15:41:41 +01:00
										 |  |  | func statusIs(status1, status2 *gtsmodel.Status) bool { | 
					
						
							| 
									
										
										
										
											2022-09-02 10:58:42 +01:00
										 |  |  | 	if status1 == nil || status2 == nil { | 
					
						
							|  |  |  | 		return status1 == status2 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return status1.ID == status2.ID && | 
					
						
							|  |  |  | 		status1.URI == status2.URI && | 
					
						
							|  |  |  | 		status1.URL == status2.URL | 
					
						
							| 
									
										
										
										
											2021-08-29 15:41:41 +01:00
										 |  |  | } |