1package deps 2 3import ( 4 "reflect" 5 "testing" 6 7 "github.com/bazelbuild/buildtools/build" 8) 9 10func TestRuleParser(t *testing.T) { 11 exampleRule := ` 12http_archive( 13 name = "com_google_absl", 14 sha256 = "44634eae586a7158dceedda7d8fd5cec6d1ebae08c83399f75dd9ce76324de40", # Last updated 2022-05-18 15 strip_prefix = "abseil-cpp-3e04aade4e7a53aebbbed1a1268117f1f522bfb0", 16 urls = ["https://github.com/abseil/abseil-cpp/archive/3e04aade4e7a53aebbbed1a1268117f1f522bfb0.zip"], 17)` 18 19 file, err := build.ParseWorkspace("WORKSPACE.bazel", []byte(exampleRule)) 20 if err != nil { 21 t.Fatal(err) 22 } 23 rule, ok := HTTPArchiveRule(file.Stmt[0]) 24 if !ok { 25 t.Fatal("The first rule encountered is not http_archive") 26 } 27 28 deps, err := ParseHTTPArchiveRule(rule) 29 if err != nil { 30 t.Fatal(err) 31 } 32 33 expected := Entry{ 34 Name: "com_google_absl", 35 SHA256: "44634eae586a7158dceedda7d8fd5cec6d1ebae08c83399f75dd9ce76324de40", 36 Prefix: "abseil-cpp-3e04aade4e7a53aebbbed1a1268117f1f522bfb0", 37 URL: "https://github.com/abseil/abseil-cpp/archive/3e04aade4e7a53aebbbed1a1268117f1f522bfb0.zip", 38 LastUpdated: "2022-05-18", 39 } 40 if !reflect.DeepEqual(*deps, expected) { 41 t.Errorf("Parsing returned incorret result, expected:\n %v\n, got:\n %v", expected, *deps) 42 } 43} 44 45func TestMultipleRules(t *testing.T) { 46 exampleRules := ` 47http_archive( 48 name = "com_google_absl", 49 sha256 = "44634eae586a7158dceedda7d8fd5cec6d1ebae08c83399f75dd9ce76324de40", # Last updated 2022-05-18 50 strip_prefix = "abseil-cpp-3e04aade4e7a53aebbbed1a1268117f1f522bfb0", 51 urls = ["https://github.com/abseil/abseil-cpp/archive/3e04aade4e7a53aebbbed1a1268117f1f522bfb0.zip"], 52) 53 54irrelevant_call() 55 56http_archive( 57 name = "com_google_protobuf", 58 sha256 = "8b28fdd45bab62d15db232ec404248901842e5340299a57765e48abe8a80d930", # Last updated 2022-05-18 59 strip_prefix = "protobuf-3.20.1", 60 urls = ["https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.20.1.tar.gz"], 61) 62` 63 64 rules, err := ParseHTTPArchiveRules([]byte(exampleRules)) 65 if err != nil { 66 t.Fatal(err) 67 } 68 if len(rules) != 2 { 69 t.Fatalf("Expected 2 rules, got %d", len(rules)) 70 } 71 if rules[0].Name != "com_google_absl" || rules[1].Name != "com_google_protobuf" { 72 t.Errorf("Expected the two rules to be com_google_absl and com_google_protobuf, got %s and %s", rules[0].Name, rules[1].Name) 73 } 74} 75 76func TestBazelParseError(t *testing.T) { 77 exampleRule := ` 78http_archive( 79 name = "com_google_absl", 80 sha256 = "44634eae586a7158dceedda7d8fd5cec6d1ebae08c83399f75dd9ce76324de40", # Last updated 2022-05-18 81 strip_prefix = "abseil-cpp-3e04aade4e7a53aebbbed1a1268117f1f522bfb0", 82 urls = ["https://github.com/abseil/abseil-cpp/archive/3e04aade4e7a53aebbbed1a1268117f1f522bfb0.zip"], 83` 84 85 _, err := ParseHTTPArchiveRules([]byte(exampleRule)) 86 if err == nil { 87 t.Errorf("Expected parser error") 88 } 89} 90 91func TestMissingField(t *testing.T) { 92 exampleRule := ` 93http_archive( 94 name = "com_google_absl", 95 strip_prefix = "abseil-cpp-3e04aade4e7a53aebbbed1a1268117f1f522bfb0", 96 urls = ["https://github.com/abseil/abseil-cpp/archive/3e04aade4e7a53aebbbed1a1268117f1f522bfb0.zip"], 97)` 98 99 _, err := ParseHTTPArchiveRules([]byte(exampleRule)) 100 if err == nil || err.Error() != "missing the sha256 field" { 101 t.Errorf("Expected the missing sha256 error, got %v", err) 102 } 103} 104