package middleware import ( "errors" model "github.com/cloudreve/Cloudreve/v3/models" "github.com/cloudreve/Cloudreve/v3/pkg/aria2/common" "github.com/cloudreve/Cloudreve/v3/pkg/auth" "github.com/cloudreve/Cloudreve/v3/pkg/cluster" "github.com/cloudreve/Cloudreve/v3/pkg/mocks/controllermock" "github.com/gin-gonic/gin" "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" "net/http/httptest" "testing" ) func TestMasterMetadata(t *testing.T) { a := assert.New(t) masterMetaDataFunc := MasterMetadata() rec := httptest.NewRecorder() c, _ := gin.CreateTestContext(rec) c.Request = httptest.NewRequest("GET", "/", nil) c.Request.Header = map[string][]string{ "X-Cr-Site-Id": {"expectedSiteID"}, "X-Cr-Site-Url": {"expectedSiteURL"}, "X-Cr-Cloudreve-Version": {"expectedMasterVersion"}, } masterMetaDataFunc(c) siteID, _ := c.Get("MasterSiteID") siteURL, _ := c.Get("MasterSiteURL") siteVersion, _ := c.Get("MasterVersion") a.Equal("expectedSiteID", siteID.(string)) a.Equal("expectedSiteURL", siteURL.(string)) a.Equal("expectedMasterVersion", siteVersion.(string)) } func TestSlaveRPCSignRequired(t *testing.T) { a := assert.New(t) np := &cluster.NodePool{} np.Init() slaveRPCSignRequiredFunc := SlaveRPCSignRequired(np) rec := httptest.NewRecorder() // id parse failed { c, _ := gin.CreateTestContext(rec) c.Request = httptest.NewRequest("GET", "/", nil) c.Request.Header.Set("X-Cr-Node-Id", "unknown") slaveRPCSignRequiredFunc(c) a.True(c.IsAborted()) } // node id not exist { c, _ := gin.CreateTestContext(rec) c.Request = httptest.NewRequest("GET", "/", nil) c.Request.Header.Set("X-Cr-Node-Id", "38") slaveRPCSignRequiredFunc(c) a.True(c.IsAborted()) } // success { authInstance := auth.HMACAuth{SecretKey: []byte("")} np.Add(&model.Node{Model: gorm.Model{ ID: 38, }}) c, _ := gin.CreateTestContext(rec) c.Request = httptest.NewRequest("POST", "/", nil) c.Request.Header.Set("X-Cr-Node-Id", "38") c.Request = auth.SignRequest(authInstance, c.Request, 0) slaveRPCSignRequiredFunc(c) a.False(c.IsAborted()) } } func TestUseSlaveAria2Instance(t *testing.T) { a := assert.New(t) // MasterSiteID not set { testController := &controllermock.SlaveControllerMock{} useSlaveAria2InstanceFunc := UseSlaveAria2Instance(testController) c, _ := gin.CreateTestContext(httptest.NewRecorder()) c.Request = httptest.NewRequest("GET", "/", nil) useSlaveAria2InstanceFunc(c) a.True(c.IsAborted()) } // Cannot get aria2 instances { testController := &controllermock.SlaveControllerMock{} useSlaveAria2InstanceFunc := UseSlaveAria2Instance(testController) c, _ := gin.CreateTestContext(httptest.NewRecorder()) c.Request = httptest.NewRequest("GET", "/", nil) c.Set("MasterSiteID", "expectedSiteID") testController.On("GetAria2Instance", "expectedSiteID").Return(&common.DummyAria2{}, errors.New("error")) useSlaveAria2InstanceFunc(c) a.True(c.IsAborted()) testController.AssertExpectations(t) } // Success { testController := &controllermock.SlaveControllerMock{} useSlaveAria2InstanceFunc := UseSlaveAria2Instance(testController) c, _ := gin.CreateTestContext(httptest.NewRecorder()) c.Request = httptest.NewRequest("GET", "/", nil) c.Set("MasterSiteID", "expectedSiteID") testController.On("GetAria2Instance", "expectedSiteID").Return(&common.DummyAria2{}, nil) useSlaveAria2InstanceFunc(c) a.False(c.IsAborted()) res, _ := c.Get("MasterAria2Instance") a.NotNil(res) testController.AssertExpectations(t) } }