Skip to content

Commit

Permalink
add test for send metadata stage
Browse files Browse the repository at this point in the history
  • Loading branch information
sarp committed Sep 9, 2024
1 parent 997af70 commit 3e95ff7
Showing 1 changed file with 95 additions and 0 deletions.
95 changes: 95 additions & 0 deletions internal/stage_magnet_metadata2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package internal

import (
"fmt"
"net"

"github.com/codecrafters-io/tester-utils/test_case_harness"
)

func testMagnetSendMetadata(stageHarness *test_case_harness.TestCaseHarness) error {
initRandom()

logger := stageHarness.Logger
executable := stageHarness.Executable

magnetLink := randomMagnetLink()
params, err := NewMagnetTestParams(magnetLink, logger)
if err != nil {
return err
}

go listenAndServeTrackerResponse(params.toTrackerParams())
go waitAndHandlePeerConnection(params.toPeerConnectionParams(), handleSendMetadata)

logger.Infof("Running ./your_bittorrent.sh magnet_info %q", params.MagnetUrlEncoded)
result, err := executable.Run("magnet_info", params.MagnetUrlEncoded)
if err != nil {
return err
}

if err = assertExitCode(result, 0); err != nil {
return err
}

expected := fmt.Sprintf("Tracker URL: http://%s/announce", params.TrackerAddress)
if err = assertStdoutContains(result, expected); err != nil {
return err
}

expected = fmt.Sprintf("Length: %d", params.MagnetLinkInfo.FileLengthBytes)
if err = assertStdoutContains(result, expected); err != nil {
return err
}

expected = fmt.Sprintf("Info Hash: %s", params.MagnetLinkInfo.InfoHashStr)
if err = assertStdoutContains(result, expected); err != nil {
return err
}

expected = fmt.Sprintf("Piece Length: %d", params.MagnetLinkInfo.PieceLengthBytes)
if err = assertStdoutContains(result, expected); err != nil {
return err
}

pieceHashes := params.MagnetLinkInfo.PieceHashes
for _, pieceHash := range pieceHashes {
if err = assertStdoutContains(result, pieceHash); err != nil {
return err
}
}

return nil
}

func handleSendMetadata(conn net.Conn, params PeerConnectionParams) {
defer conn.Close()
logger := params.logger

if err := receiveAndSendHandshake(conn, params); err != nil {
return
}

if err := sendBitfieldMessage(conn, params.bitfield, logger); err != nil {
return
}

if err := sendExtensionHandshake(conn, params.myMetadataExtensionID, params.metadataSizeBytes, logger); err != nil {
return
}

theirMetadataExtensionID, err := receiveAndAssertExtensionHandshake(conn, logger)
if err != nil {
return
}

if err := readMetadataRequest(conn, logger); err != nil {
return
}

if err := sendMetadataResponse(conn, theirMetadataExtensionID, params.magnetLink, logger); err != nil {
logger.Errorln(err.Error())
return
}
}

0 comments on commit 3e95ff7

Please sign in to comment.