From 6f6d8bfdeca529c82eabbf1887ad5ea967ab32d5 Mon Sep 17 00:00:00 2001 From: Sarp Centel Date: Wed, 21 Aug 2024 23:16:48 +0300 Subject: [PATCH] add test for send metadata stage --- internal/stage_magnet_metadata2.go | 95 ++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 internal/stage_magnet_metadata2.go diff --git a/internal/stage_magnet_metadata2.go b/internal/stage_magnet_metadata2.go new file mode 100644 index 0000000..ac81651 --- /dev/null +++ b/internal/stage_magnet_metadata2.go @@ -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 + } +} +