Dragonfly2
778 строк · 27.0 Кб
1/*
2* Copyright 2020 The Dragonfly Authors
3*
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8* http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*/
16
17package resource18
19import (20"testing"21"time"22
23"github.com/stretchr/testify/assert"24"go.uber.org/atomic"25
26commonv2 "d7y.io/api/v2/pkg/apis/common/v2"27
28"d7y.io/dragonfly/v2/pkg/idgen"29"d7y.io/dragonfly/v2/pkg/types"30"d7y.io/dragonfly/v2/scheduler/config"31)
32
33var (34mockRawHost = Host{35ID: mockHostID,36Type: types.HostTypeNormal,37Hostname: "foo",38IP: "127.0.0.1",39Port: 8003,40DownloadPort: 8001,41OS: "darwin",42Platform: "darwin",43PlatformFamily: "Standalone Workstation",44PlatformVersion: "11.1",45KernelVersion: "20.2.0",46CPU: mockCPU,47Memory: mockMemory,48Network: mockNetwork,49Disk: mockDisk,50Build: mockBuild,51CreatedAt: atomic.NewTime(time.Now()),52UpdatedAt: atomic.NewTime(time.Now()),53}54
55mockRawSeedHost = Host{56ID: mockSeedHostID,57Type: types.HostTypeSuperSeed,58Hostname: "bar",59IP: "127.0.0.1",60Port: 8003,61DownloadPort: 8001,62OS: "darwin",63Platform: "darwin",64PlatformFamily: "Standalone Workstation",65PlatformVersion: "11.1",66KernelVersion: "20.2.0",67CPU: mockCPU,68Memory: mockMemory,69Network: mockNetwork,70Disk: mockDisk,71Build: mockBuild,72CreatedAt: atomic.NewTime(time.Now()),73UpdatedAt: atomic.NewTime(time.Now()),74}75
76mockCPU = CPU{77LogicalCount: 4,78PhysicalCount: 2,79Percent: 1,80ProcessPercent: 0.5,81Times: CPUTimes{82User: 240662.2,83System: 317950.1,84Idle: 3393691.3,85Nice: 0,86Iowait: 0,87Irq: 0,88Softirq: 0,89Steal: 0,90Guest: 0,91GuestNice: 0,92},93}94
95mockMemory = Memory{96Total: 17179869184,97Available: 5962813440,98Used: 11217055744,99UsedPercent: 65.291858,100ProcessUsedPercent: 41.525125,101Free: 2749598908,102}103
104mockNetwork = Network{105TCPConnectionCount: 10,106UploadTCPConnectionCount: 1,107Location: mockHostLocation,108IDC: mockHostIDC,109}110
111mockDisk = Disk{112Total: 499963174912,113Free: 37226479616,114Used: 423809622016,115UsedPercent: 91.92547406065952,116InodesTotal: 4882452880,117InodesUsed: 7835772,118InodesFree: 4874617108,119InodesUsedPercent: 0.1604884305611568,120}121
122mockBuild = Build{123GitVersion: "v1.0.0",124GitCommit: "221176b117c6d59366d68f2b34d38be50c935883",125GoVersion: "1.18",126Platform: "darwin",127}128
129mockHostID = idgen.HostIDV2("127.0.0.1", "foo")130mockSeedHostID = idgen.HostIDV2("127.0.0.1", "bar")131mockHostLocation = "baz"132mockHostIDC = "bas"133)
134
135func TestHost_NewHost(t *testing.T) {136tests := []struct {137name string138rawHost Host
139options []HostOption140expect func(t *testing.T, host *Host)141}{142{143name: "new host",144rawHost: mockRawHost,145expect: func(t *testing.T, host *Host) {146assert := assert.New(t)147assert.Equal(host.ID, mockRawHost.ID)148assert.Equal(host.Type, types.HostTypeNormal)149assert.Equal(host.Hostname, mockRawHost.Hostname)150assert.Equal(host.IP, mockRawHost.IP)151assert.Equal(host.Port, mockRawHost.Port)152assert.Equal(host.DownloadPort, mockRawHost.DownloadPort)153assert.Equal(host.ObjectStoragePort, int32(0))154assert.Equal(host.SchedulerClusterID, uint64(0))155assert.Equal(host.ConcurrentUploadLimit.Load(), int32(config.DefaultPeerConcurrentUploadLimit))156assert.Equal(host.ConcurrentUploadCount.Load(), int32(0))157assert.Equal(host.UploadCount.Load(), int64(0))158assert.Equal(host.UploadFailedCount.Load(), int64(0))159assert.NotNil(host.Peers)160assert.Equal(host.PeerCount.Load(), int32(0))161assert.NotEmpty(host.CreatedAt.Load())162assert.NotEmpty(host.UpdatedAt.Load())163assert.NotNil(host.Log)164},165},166{167name: "new seed host",168rawHost: mockRawSeedHost,169expect: func(t *testing.T, host *Host) {170assert := assert.New(t)171assert.Equal(host.ID, mockRawSeedHost.ID)172assert.Equal(host.Type, mockRawSeedHost.Type)173assert.Equal(host.Hostname, mockRawSeedHost.Hostname)174assert.Equal(host.IP, mockRawSeedHost.IP)175assert.Equal(host.Port, mockRawSeedHost.Port)176assert.Equal(host.DownloadPort, mockRawSeedHost.DownloadPort)177assert.Equal(host.ObjectStoragePort, int32(0))178assert.Equal(host.SchedulerClusterID, uint64(0))179assert.Equal(host.ConcurrentUploadLimit.Load(), int32(config.DefaultSeedPeerConcurrentUploadLimit))180assert.Equal(host.ConcurrentUploadCount.Load(), int32(0))181assert.Equal(host.UploadCount.Load(), int64(0))182assert.Equal(host.UploadFailedCount.Load(), int64(0))183assert.NotNil(host.Peers)184assert.Equal(host.PeerCount.Load(), int32(0))185assert.NotEmpty(host.CreatedAt.Load())186assert.NotEmpty(host.UpdatedAt.Load())187assert.NotNil(host.Log)188},189},190{191name: "new host and set scheduler cluster id",192rawHost: mockRawHost,193options: []HostOption{WithSchedulerClusterID(1)},194expect: func(t *testing.T, host *Host) {195assert := assert.New(t)196assert.Equal(host.ID, mockRawHost.ID)197assert.Equal(host.Type, types.HostTypeNormal)198assert.Equal(host.Hostname, mockRawHost.Hostname)199assert.Equal(host.IP, mockRawHost.IP)200assert.Equal(host.Port, mockRawHost.Port)201assert.Equal(host.DownloadPort, mockRawHost.DownloadPort)202assert.Equal(host.SchedulerClusterID, uint64(1))203assert.Equal(host.ConcurrentUploadLimit.Load(), int32(config.DefaultPeerConcurrentUploadLimit))204assert.Equal(host.ConcurrentUploadCount.Load(), int32(0))205assert.Equal(host.UploadCount.Load(), int64(0))206assert.Equal(host.UploadFailedCount.Load(), int64(0))207assert.NotNil(host.Peers)208assert.Equal(host.PeerCount.Load(), int32(0))209assert.NotEmpty(host.CreatedAt.Load())210assert.NotEmpty(host.UpdatedAt.Load())211assert.NotNil(host.Log)212},213},214{215name: "new host and set object storage port",216rawHost: mockRawHost,217options: []HostOption{WithObjectStoragePort(1)},218expect: func(t *testing.T, host *Host) {219assert := assert.New(t)220assert.Equal(host.ID, mockRawHost.ID)221assert.Equal(host.Type, types.HostTypeNormal)222assert.Equal(host.Hostname, mockRawHost.Hostname)223assert.Equal(host.IP, mockRawHost.IP)224assert.Equal(host.Port, mockRawHost.Port)225assert.Equal(host.DownloadPort, mockRawHost.DownloadPort)226assert.Equal(host.ObjectStoragePort, int32(1))227assert.Equal(host.SchedulerClusterID, uint64(0))228assert.Equal(host.ConcurrentUploadLimit.Load(), int32(config.DefaultPeerConcurrentUploadLimit))229assert.Equal(host.ConcurrentUploadCount.Load(), int32(0))230assert.Equal(host.UploadCount.Load(), int64(0))231assert.Equal(host.UploadFailedCount.Load(), int64(0))232assert.NotNil(host.Peers)233assert.Equal(host.PeerCount.Load(), int32(0))234assert.NotEmpty(host.CreatedAt.Load())235assert.NotEmpty(host.UpdatedAt.Load())236assert.NotNil(host.Log)237},238},239{240name: "new host and set upload loadlimit",241rawHost: mockRawHost,242options: []HostOption{WithConcurrentUploadLimit(200)},243expect: func(t *testing.T, host *Host) {244assert := assert.New(t)245assert.Equal(host.ID, mockRawHost.ID)246assert.Equal(host.Type, types.HostTypeNormal)247assert.Equal(host.Hostname, mockRawHost.Hostname)248assert.Equal(host.IP, mockRawHost.IP)249assert.Equal(host.Port, mockRawHost.Port)250assert.Equal(host.DownloadPort, mockRawHost.DownloadPort)251assert.Equal(host.ObjectStoragePort, int32(0))252assert.Equal(host.SchedulerClusterID, uint64(0))253assert.Equal(host.ConcurrentUploadLimit.Load(), int32(200))254assert.Equal(host.ConcurrentUploadCount.Load(), int32(0))255assert.Equal(host.UploadCount.Load(), int64(0))256assert.Equal(host.UploadFailedCount.Load(), int64(0))257assert.NotNil(host.Peers)258assert.Equal(host.PeerCount.Load(), int32(0))259assert.NotEmpty(host.CreatedAt.Load())260assert.NotEmpty(host.UpdatedAt.Load())261assert.NotNil(host.Log)262},263},264{265name: "new host and set os",266rawHost: mockRawHost,267options: []HostOption{WithOS("linux")},268expect: func(t *testing.T, host *Host) {269assert := assert.New(t)270assert.Equal(host.ID, mockRawHost.ID)271assert.Equal(host.Type, types.HostTypeNormal)272assert.Equal(host.Hostname, mockRawHost.Hostname)273assert.Equal(host.IP, mockRawHost.IP)274assert.Equal(host.Port, mockRawHost.Port)275assert.Equal(host.DownloadPort, mockRawHost.DownloadPort)276assert.Equal(host.ObjectStoragePort, int32(0))277assert.Equal(host.OS, "linux")278assert.Equal(host.SchedulerClusterID, uint64(0))279assert.Equal(host.ConcurrentUploadLimit.Load(), int32(config.DefaultPeerConcurrentUploadLimit))280assert.Equal(host.ConcurrentUploadCount.Load(), int32(0))281assert.Equal(host.UploadCount.Load(), int64(0))282assert.Equal(host.UploadFailedCount.Load(), int64(0))283assert.NotNil(host.Peers)284assert.Equal(host.PeerCount.Load(), int32(0))285assert.NotEmpty(host.CreatedAt.Load())286assert.NotEmpty(host.UpdatedAt.Load())287assert.NotNil(host.Log)288},289},290{291name: "new host and set platform",292rawHost: mockRawHost,293options: []HostOption{WithPlatform("ubuntu")},294expect: func(t *testing.T, host *Host) {295assert := assert.New(t)296assert.Equal(host.ID, mockRawHost.ID)297assert.Equal(host.Type, types.HostTypeNormal)298assert.Equal(host.Hostname, mockRawHost.Hostname)299assert.Equal(host.IP, mockRawHost.IP)300assert.Equal(host.Port, mockRawHost.Port)301assert.Equal(host.DownloadPort, mockRawHost.DownloadPort)302assert.Equal(host.ObjectStoragePort, int32(0))303assert.Equal(host.Platform, "ubuntu")304assert.Equal(host.SchedulerClusterID, uint64(0))305assert.Equal(host.ConcurrentUploadLimit.Load(), int32(config.DefaultPeerConcurrentUploadLimit))306assert.Equal(host.ConcurrentUploadCount.Load(), int32(0))307assert.Equal(host.UploadCount.Load(), int64(0))308assert.Equal(host.UploadFailedCount.Load(), int64(0))309assert.NotNil(host.Peers)310assert.Equal(host.PeerCount.Load(), int32(0))311assert.NotEmpty(host.CreatedAt.Load())312assert.NotEmpty(host.UpdatedAt.Load())313assert.NotNil(host.Log)314},315},316{317name: "new host and set platform family",318rawHost: mockRawHost,319options: []HostOption{WithPlatformFamily("debian")},320expect: func(t *testing.T, host *Host) {321assert := assert.New(t)322assert.Equal(host.ID, mockRawHost.ID)323assert.Equal(host.Type, types.HostTypeNormal)324assert.Equal(host.Hostname, mockRawHost.Hostname)325assert.Equal(host.IP, mockRawHost.IP)326assert.Equal(host.Port, mockRawHost.Port)327assert.Equal(host.DownloadPort, mockRawHost.DownloadPort)328assert.Equal(host.ObjectStoragePort, int32(0))329assert.Equal(host.PlatformFamily, "debian")330assert.Equal(host.SchedulerClusterID, uint64(0))331assert.Equal(host.ConcurrentUploadLimit.Load(), int32(config.DefaultPeerConcurrentUploadLimit))332assert.Equal(host.ConcurrentUploadCount.Load(), int32(0))333assert.Equal(host.UploadCount.Load(), int64(0))334assert.Equal(host.UploadFailedCount.Load(), int64(0))335assert.NotNil(host.Peers)336assert.Equal(host.PeerCount.Load(), int32(0))337assert.NotEmpty(host.CreatedAt.Load())338assert.NotEmpty(host.UpdatedAt.Load())339assert.NotNil(host.Log)340},341},342{343name: "new host and set platform version",344rawHost: mockRawHost,345options: []HostOption{WithPlatformVersion("22.04")},346expect: func(t *testing.T, host *Host) {347assert := assert.New(t)348assert.Equal(host.ID, mockRawHost.ID)349assert.Equal(host.Type, types.HostTypeNormal)350assert.Equal(host.Hostname, mockRawHost.Hostname)351assert.Equal(host.IP, mockRawHost.IP)352assert.Equal(host.Port, mockRawHost.Port)353assert.Equal(host.DownloadPort, mockRawHost.DownloadPort)354assert.Equal(host.ObjectStoragePort, int32(0))355assert.Equal(host.PlatformVersion, "22.04")356assert.Equal(host.ConcurrentUploadLimit.Load(), int32(config.DefaultPeerConcurrentUploadLimit))357assert.Equal(host.ConcurrentUploadCount.Load(), int32(0))358assert.Equal(host.UploadCount.Load(), int64(0))359assert.Equal(host.UploadFailedCount.Load(), int64(0))360assert.NotNil(host.Peers)361assert.Equal(host.PeerCount.Load(), int32(0))362assert.NotEmpty(host.CreatedAt.Load())363assert.NotEmpty(host.UpdatedAt.Load())364assert.NotNil(host.Log)365},366},367{368name: "new host and set kernel version",369rawHost: mockRawHost,370options: []HostOption{WithKernelVersion("5.15.0-27-generic")},371expect: func(t *testing.T, host *Host) {372assert := assert.New(t)373assert.Equal(host.ID, mockRawHost.ID)374assert.Equal(host.Type, types.HostTypeNormal)375assert.Equal(host.Hostname, mockRawHost.Hostname)376assert.Equal(host.IP, mockRawHost.IP)377assert.Equal(host.Port, mockRawHost.Port)378assert.Equal(host.DownloadPort, mockRawHost.DownloadPort)379assert.Equal(host.ObjectStoragePort, int32(0))380assert.Equal(host.KernelVersion, "5.15.0-27-generic")381assert.Equal(host.SchedulerClusterID, uint64(0))382assert.Equal(host.ConcurrentUploadLimit.Load(), int32(config.DefaultPeerConcurrentUploadLimit))383assert.Equal(host.ConcurrentUploadCount.Load(), int32(0))384assert.Equal(host.UploadCount.Load(), int64(0))385assert.Equal(host.UploadFailedCount.Load(), int64(0))386assert.NotNil(host.Peers)387assert.Equal(host.PeerCount.Load(), int32(0))388assert.NotEmpty(host.CreatedAt.Load())389assert.NotEmpty(host.UpdatedAt.Load())390assert.NotNil(host.Log)391},392},393{394name: "new host and set cpu",395rawHost: mockRawHost,396options: []HostOption{WithCPU(mockCPU)},397expect: func(t *testing.T, host *Host) {398assert := assert.New(t)399assert.Equal(host.ID, mockRawHost.ID)400assert.Equal(host.Type, types.HostTypeNormal)401assert.Equal(host.Hostname, mockRawHost.Hostname)402assert.Equal(host.IP, mockRawHost.IP)403assert.Equal(host.Port, mockRawHost.Port)404assert.Equal(host.DownloadPort, mockRawHost.DownloadPort)405assert.Equal(host.ObjectStoragePort, int32(0))406assert.EqualValues(host.CPU, mockCPU)407assert.Equal(host.SchedulerClusterID, uint64(0))408assert.Equal(host.ConcurrentUploadLimit.Load(), int32(config.DefaultPeerConcurrentUploadLimit))409assert.Equal(host.ConcurrentUploadCount.Load(), int32(0))410assert.Equal(host.UploadCount.Load(), int64(0))411assert.Equal(host.UploadFailedCount.Load(), int64(0))412assert.NotNil(host.Peers)413assert.Equal(host.PeerCount.Load(), int32(0))414assert.NotEmpty(host.CreatedAt.Load())415assert.NotEmpty(host.UpdatedAt.Load())416assert.NotNil(host.Log)417},418},419{420name: "new host and set memory",421rawHost: mockRawHost,422options: []HostOption{WithMemory(mockMemory)},423expect: func(t *testing.T, host *Host) {424assert := assert.New(t)425assert.Equal(host.ID, mockRawHost.ID)426assert.Equal(host.Type, types.HostTypeNormal)427assert.Equal(host.Hostname, mockRawHost.Hostname)428assert.Equal(host.IP, mockRawHost.IP)429assert.Equal(host.Port, mockRawHost.Port)430assert.Equal(host.DownloadPort, mockRawHost.DownloadPort)431assert.Equal(host.ObjectStoragePort, int32(0))432assert.EqualValues(host.Memory, mockMemory)433assert.Equal(host.SchedulerClusterID, uint64(0))434assert.Equal(host.ConcurrentUploadLimit.Load(), int32(config.DefaultPeerConcurrentUploadLimit))435assert.Equal(host.ConcurrentUploadCount.Load(), int32(0))436assert.Equal(host.UploadCount.Load(), int64(0))437assert.Equal(host.UploadFailedCount.Load(), int64(0))438assert.NotNil(host.Peers)439assert.Equal(host.PeerCount.Load(), int32(0))440assert.NotEmpty(host.CreatedAt.Load())441assert.NotEmpty(host.UpdatedAt.Load())442assert.NotNil(host.Log)443},444},445{446name: "new host and set network",447rawHost: mockRawHost,448options: []HostOption{WithNetwork(mockNetwork)},449expect: func(t *testing.T, host *Host) {450assert := assert.New(t)451assert.Equal(host.ID, mockRawHost.ID)452assert.Equal(host.Type, types.HostTypeNormal)453assert.Equal(host.Hostname, mockRawHost.Hostname)454assert.Equal(host.IP, mockRawHost.IP)455assert.Equal(host.Port, mockRawHost.Port)456assert.Equal(host.DownloadPort, mockRawHost.DownloadPort)457assert.Equal(host.ObjectStoragePort, int32(0))458assert.EqualValues(host.Network, mockNetwork)459assert.Equal(host.SchedulerClusterID, uint64(0))460assert.Equal(host.ConcurrentUploadLimit.Load(), int32(config.DefaultPeerConcurrentUploadLimit))461assert.Equal(host.ConcurrentUploadCount.Load(), int32(0))462assert.Equal(host.UploadCount.Load(), int64(0))463assert.Equal(host.UploadFailedCount.Load(), int64(0))464assert.NotNil(host.Peers)465assert.Equal(host.PeerCount.Load(), int32(0))466assert.NotEmpty(host.CreatedAt.Load())467assert.NotEmpty(host.UpdatedAt.Load())468assert.NotNil(host.Log)469},470},471{472name: "new host and set disk",473rawHost: mockRawHost,474options: []HostOption{WithDisk(mockDisk)},475expect: func(t *testing.T, host *Host) {476assert := assert.New(t)477assert.Equal(host.ID, mockRawHost.ID)478assert.Equal(host.Type, types.HostTypeNormal)479assert.Equal(host.Hostname, mockRawHost.Hostname)480assert.Equal(host.IP, mockRawHost.IP)481assert.Equal(host.Port, mockRawHost.Port)482assert.Equal(host.DownloadPort, mockRawHost.DownloadPort)483assert.Equal(host.ObjectStoragePort, int32(0))484assert.EqualValues(host.Disk, mockDisk)485assert.Equal(host.SchedulerClusterID, uint64(0))486assert.Equal(host.ConcurrentUploadLimit.Load(), int32(config.DefaultPeerConcurrentUploadLimit))487assert.Equal(host.ConcurrentUploadCount.Load(), int32(0))488assert.Equal(host.UploadCount.Load(), int64(0))489assert.Equal(host.UploadFailedCount.Load(), int64(0))490assert.NotNil(host.Peers)491assert.Equal(host.PeerCount.Load(), int32(0))492assert.NotEmpty(host.CreatedAt.Load())493assert.NotEmpty(host.UpdatedAt.Load())494assert.NotNil(host.Log)495},496},497{498name: "new host and set build",499rawHost: mockRawHost,500options: []HostOption{WithBuild(mockBuild)},501expect: func(t *testing.T, host *Host) {502assert := assert.New(t)503assert.Equal(host.ID, mockRawHost.ID)504assert.Equal(host.Type, types.HostTypeNormal)505assert.Equal(host.Hostname, mockRawHost.Hostname)506assert.Equal(host.IP, mockRawHost.IP)507assert.Equal(host.Port, mockRawHost.Port)508assert.Equal(host.DownloadPort, mockRawHost.DownloadPort)509assert.Equal(host.ObjectStoragePort, int32(0))510assert.EqualValues(host.Build, mockBuild)511assert.Equal(host.SchedulerClusterID, uint64(0))512assert.Equal(host.ConcurrentUploadLimit.Load(), int32(config.DefaultPeerConcurrentUploadLimit))513assert.Equal(host.ConcurrentUploadCount.Load(), int32(0))514assert.Equal(host.UploadCount.Load(), int64(0))515assert.Equal(host.UploadFailedCount.Load(), int64(0))516assert.NotNil(host.Peers)517assert.Equal(host.PeerCount.Load(), int32(0))518assert.NotEmpty(host.CreatedAt.Load())519assert.NotEmpty(host.UpdatedAt.Load())520assert.NotNil(host.Log)521},522},523}524
525for _, tc := range tests {526t.Run(tc.name, func(t *testing.T) {527tc.expect(t, NewHost(528tc.rawHost.ID, tc.rawHost.IP, tc.rawHost.Hostname,529tc.rawHost.Port, tc.rawHost.DownloadPort, tc.rawHost.Type,530tc.options...))531})532}533}
534
535func TestHost_LoadPeer(t *testing.T) {536tests := []struct {537name string538rawHost Host
539peerID string540expect func(t *testing.T, peer *Peer, loaded bool)541}{542{543name: "load peer",544rawHost: mockRawHost,545peerID: mockPeerID,546expect: func(t *testing.T, peer *Peer, loaded bool) {547assert := assert.New(t)548assert.Equal(loaded, true)549assert.Equal(peer.ID, mockPeerID)550},551},552{553name: "peer does not exist",554rawHost: mockRawHost,555peerID: idgen.PeerIDV1("0.0.0.0"),556expect: func(t *testing.T, peer *Peer, loaded bool) {557assert := assert.New(t)558assert.Equal(loaded, false)559},560},561{562name: "load key is empty",563rawHost: mockRawHost,564peerID: "",565expect: func(t *testing.T, peer *Peer, loaded bool) {566assert := assert.New(t)567assert.Equal(loaded, false)568},569},570}571
572for _, tc := range tests {573t.Run(tc.name, func(t *testing.T) {574host := NewHost(575tc.rawHost.ID, tc.rawHost.IP, tc.rawHost.Hostname,576tc.rawHost.Port, tc.rawHost.DownloadPort, tc.rawHost.Type)577mockTask := NewTask(mockTaskID, mockTaskURL, mockTaskTag, mockTaskApplication, commonv2.TaskType_DFDAEMON, mockTaskFilteredQueryParams, mockTaskHeader, mockTaskBackToSourceLimit, WithDigest(mockTaskDigest))578mockPeer := NewPeer(mockPeerID, mockResourceConfig, mockTask, host)579
580host.StorePeer(mockPeer)581peer, loaded := host.LoadPeer(tc.peerID)582tc.expect(t, peer, loaded)583})584}585}
586
587func TestHost_StorePeer(t *testing.T) {588tests := []struct {589name string590rawHost Host
591peerID string592options []HostOption593expect func(t *testing.T, peer *Peer, loaded bool)594}{595{596name: "store peer",597rawHost: mockRawHost,598peerID: mockPeerID,599expect: func(t *testing.T, peer *Peer, loaded bool) {600assert := assert.New(t)601assert.Equal(loaded, true)602assert.Equal(peer.ID, mockPeerID)603},604},605{606name: "store key is empty",607rawHost: mockRawHost,608peerID: "",609expect: func(t *testing.T, peer *Peer, loaded bool) {610assert := assert.New(t)611assert.Equal(loaded, true)612assert.Equal(peer.ID, "")613},614},615}616
617for _, tc := range tests {618t.Run(tc.name, func(t *testing.T) {619host := NewHost(620tc.rawHost.ID, tc.rawHost.IP, tc.rawHost.Hostname,621tc.rawHost.Port, tc.rawHost.DownloadPort, tc.rawHost.Type)622mockTask := NewTask(mockTaskID, mockTaskURL, mockTaskTag, mockTaskApplication, commonv2.TaskType_DFDAEMON, mockTaskFilteredQueryParams, mockTaskHeader, mockTaskBackToSourceLimit, WithDigest(mockTaskDigest))623mockPeer := NewPeer(tc.peerID, mockResourceConfig, mockTask, host)624
625host.StorePeer(mockPeer)626peer, loaded := host.LoadPeer(tc.peerID)627tc.expect(t, peer, loaded)628})629}630}
631
632func TestHost_DeletePeer(t *testing.T) {633tests := []struct {634name string635rawHost Host
636peerID string637options []HostOption638expect func(t *testing.T, host *Host)639}{640{641name: "delete peer",642rawHost: mockRawHost,643peerID: mockPeerID,644expect: func(t *testing.T, host *Host) {645assert := assert.New(t)646_, loaded := host.LoadPeer(mockPeerID)647assert.Equal(loaded, false)648},649},650{651name: "delete key is empty",652rawHost: mockRawHost,653peerID: "",654expect: func(t *testing.T, host *Host) {655assert := assert.New(t)656peer, loaded := host.LoadPeer(mockPeerID)657assert.Equal(loaded, true)658assert.Equal(peer.ID, mockPeerID)659},660},661}662
663for _, tc := range tests {664t.Run(tc.name, func(t *testing.T) {665host := NewHost(666tc.rawHost.ID, tc.rawHost.IP, tc.rawHost.Hostname,667tc.rawHost.Port, tc.rawHost.DownloadPort, tc.rawHost.Type)668mockTask := NewTask(mockTaskID, mockTaskURL, mockTaskTag, mockTaskApplication, commonv2.TaskType_DFDAEMON, mockTaskFilteredQueryParams, mockTaskHeader, mockTaskBackToSourceLimit, WithDigest(mockTaskDigest))669mockPeer := NewPeer(mockPeerID, mockResourceConfig, mockTask, host)670
671host.StorePeer(mockPeer)672host.DeletePeer(tc.peerID)673tc.expect(t, host)674})675}676}
677
678func TestHost_LeavePeers(t *testing.T) {679tests := []struct {680name string681rawHost Host
682options []HostOption683expect func(t *testing.T, host *Host, mockPeer *Peer)684}{685{686name: "leave peers",687rawHost: mockRawHost,688expect: func(t *testing.T, host *Host, mockPeer *Peer) {689assert := assert.New(t)690host.StorePeer(mockPeer)691assert.Equal(host.PeerCount.Load(), int32(1))692host.LeavePeers()693host.Peers.Range(func(_, value any) bool {694peer := value.(*Peer)695assert.True(peer.FSM.Is(PeerStateLeave))696return true697})698},699},700{701name: "peers is empty ",702rawHost: mockRawHost,703expect: func(t *testing.T, host *Host, mockPeer *Peer) {704assert := assert.New(t)705assert.Equal(host.PeerCount.Load(), int32(0))706host.LeavePeers()707host.Peers.Range(func(_, value any) bool {708assert.Fail("host peers is not empty")709return true710})711},712},713}714
715for _, tc := range tests {716t.Run(tc.name, func(t *testing.T) {717host := NewHost(718tc.rawHost.ID, tc.rawHost.IP, tc.rawHost.Hostname,719tc.rawHost.Port, tc.rawHost.DownloadPort, tc.rawHost.Type)720mockTask := NewTask(mockTaskID, mockTaskURL, mockTaskTag, mockTaskApplication, commonv2.TaskType_DFDAEMON, mockTaskFilteredQueryParams, mockTaskHeader, mockTaskBackToSourceLimit, WithDigest(mockTaskDigest))721mockPeer := NewPeer(mockPeerID, mockResourceConfig, mockTask, host)722
723tc.expect(t, host, mockPeer)724})725}726}
727
728func TestHost_FreeUploadCount(t *testing.T) {729tests := []struct {730name string731rawHost Host
732options []HostOption733expect func(t *testing.T, host *Host, mockTask *Task, mockPeer *Peer)734}{735{736name: "get free upload load",737rawHost: mockRawHost,738expect: func(t *testing.T, host *Host, mockTask *Task, mockPeer *Peer) {739assert := assert.New(t)740mockSeedPeer := NewPeer(mockSeedPeerID, mockResourceConfig, mockTask, host)741mockPeer.Task.StorePeer(mockSeedPeer)742mockPeer.Task.StorePeer(mockPeer)743err := mockPeer.Task.AddPeerEdge(mockSeedPeer, mockPeer)744assert.NoError(err)745assert.Equal(host.FreeUploadCount(), int32(config.DefaultPeerConcurrentUploadLimit-1))746err = mockTask.DeletePeerInEdges(mockPeer.ID)747assert.NoError(err)748assert.Equal(host.FreeUploadCount(), int32(config.DefaultPeerConcurrentUploadLimit))749err = mockPeer.Task.AddPeerEdge(mockSeedPeer, mockPeer)750assert.NoError(err)751assert.Equal(host.FreeUploadCount(), int32(config.DefaultPeerConcurrentUploadLimit-1))752err = mockTask.DeletePeerOutEdges(mockSeedPeer.ID)753assert.NoError(err)754assert.Equal(host.FreeUploadCount(), int32(config.DefaultPeerConcurrentUploadLimit))755},756},757{758name: "upload peer does not exist",759rawHost: mockRawHost,760expect: func(t *testing.T, host *Host, mockTask *Task, mockPeer *Peer) {761assert := assert.New(t)762assert.Equal(host.FreeUploadCount(), int32(config.DefaultPeerConcurrentUploadLimit))763},764},765}766
767for _, tc := range tests {768t.Run(tc.name, func(t *testing.T) {769host := NewHost(770tc.rawHost.ID, tc.rawHost.IP, tc.rawHost.Hostname,771tc.rawHost.Port, tc.rawHost.DownloadPort, tc.rawHost.Type)772mockTask := NewTask(mockTaskID, mockTaskURL, mockTaskTag, mockTaskApplication, commonv2.TaskType_DFDAEMON, mockTaskFilteredQueryParams, mockTaskHeader, mockTaskBackToSourceLimit, WithDigest(mockTaskDigest))773mockPeer := NewPeer(mockPeerID, mockResourceConfig, mockTask, host)774
775tc.expect(t, host, mockTask, mockPeer)776})777}778}
779