Source file
src/go/build/deps_test.go
1
2
3
4
5
6
7
8 package build
9
10 import (
11 "bytes"
12 "fmt"
13 "go/token"
14 "internal/dag"
15 "internal/testenv"
16 "io/fs"
17 "os"
18 "path/filepath"
19 "slices"
20 "strings"
21 "testing"
22 )
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 var depsRules = `
39 # No dependencies allowed for any of these packages.
40 NONE
41 < unsafe
42 < cmp,
43 container/list,
44 container/ring,
45 internal/byteorder,
46 internal/cfg,
47 internal/coverage,
48 internal/coverage/rtcov,
49 internal/coverage/uleb128,
50 internal/coverage/calloc,
51 internal/cpu,
52 internal/goarch,
53 internal/godebugs,
54 internal/goexperiment,
55 internal/goos,
56 internal/goversion,
57 internal/nettrace,
58 internal/platform,
59 internal/profilerecord,
60 internal/syslist,
61 internal/trace/tracev2,
62 internal/trace/traceviewer/format,
63 log/internal,
64 math/bits,
65 structs,
66 unicode,
67 unicode/utf8,
68 unicode/utf16;
69
70 internal/goarch < internal/abi;
71 internal/byteorder, internal/goarch < internal/chacha8rand;
72
73 # RUNTIME is the core runtime group of packages, all of them very light-weight.
74 internal/abi,
75 internal/chacha8rand,
76 internal/coverage/rtcov,
77 internal/cpu,
78 internal/goarch,
79 internal/godebugs,
80 internal/goexperiment,
81 internal/goos,
82 internal/profilerecord,
83 internal/trace/tracev2,
84 math/bits,
85 structs
86 < internal/bytealg
87 < internal/stringslite
88 < internal/itoa
89 < internal/unsafeheader
90 < internal/race
91 < internal/msan
92 < internal/asan
93 < internal/runtime/sys
94 < internal/runtime/syscall
95 < internal/runtime/atomic
96 < internal/runtime/exithook
97 < internal/runtime/math
98 < internal/runtime/maps
99 < runtime
100 < sync/atomic
101 < internal/sync
102 < weak
103 < sync
104 < internal/bisect
105 < internal/godebug
106 < internal/reflectlite
107 < errors
108 < internal/oserror;
109
110 cmp, runtime, math/bits
111 < iter
112 < maps, slices;
113
114 internal/oserror, maps, slices
115 < RUNTIME;
116
117 RUNTIME
118 < sort
119 < container/heap
120 < unique;
121
122 RUNTIME
123 < io;
124
125 RUNTIME
126 < arena;
127
128 syscall !< io;
129 reflect !< sort;
130
131 RUNTIME, unicode/utf8
132 < path;
133
134 unicode !< path;
135
136 RUNTIME
137 < internal/synctest
138 < testing/synctest;
139
140 # SYSCALL is RUNTIME plus the packages necessary for basic system calls.
141 RUNTIME, unicode/utf8, unicode/utf16, internal/synctest
142 < internal/syscall/windows/sysdll, syscall/js
143 < syscall
144 < internal/syscall/unix, internal/syscall/windows, internal/syscall/windows/registry
145 < internal/syscall/execenv
146 < SYSCALL;
147
148 # TIME is SYSCALL plus the core packages about time, including context.
149 SYSCALL
150 < time/tzdata
151 < time
152 < context
153 < TIME;
154
155 TIME, io, path, slices
156 < io/fs;
157
158 # MATH is RUNTIME plus the basic math packages.
159 RUNTIME
160 < math
161 < MATH;
162
163 unicode !< math;
164
165 MATH
166 < math/cmplx;
167
168 MATH
169 < math/rand, math/rand/v2;
170
171 MATH
172 < runtime/metrics;
173
174 MATH, unicode/utf8
175 < strconv;
176
177 unicode !< strconv;
178
179 # STR is basic string and buffer manipulation.
180 RUNTIME, io, unicode/utf8, unicode/utf16, unicode
181 < bytes, strings
182 < bufio;
183
184 bufio, path, strconv
185 < STR;
186
187 # OS is basic OS access, including helpers (path/filepath, os/exec, etc).
188 # OS includes string routines, but those must be layered above package os.
189 # OS does not include reflection.
190 io/fs
191 < internal/testlog
192 < internal/poll
193 < internal/filepathlite
194 < os
195 < os/signal;
196
197 io/fs
198 < embed;
199
200 unicode, fmt !< net, os, os/signal;
201
202 os/signal, internal/filepathlite, STR
203 < path/filepath
204 < io/ioutil;
205
206 path/filepath, internal/godebug < os/exec;
207
208 io/ioutil, os/exec, os/signal
209 < OS;
210
211 reflect !< OS;
212
213 OS
214 < golang.org/x/sys/cpu;
215
216 # FMT is OS (which includes string routines) plus reflect and fmt.
217 # It does not include package log, which should be avoided in core packages.
218 arena, strconv, unicode
219 < reflect;
220
221 os, reflect
222 < internal/fmtsort
223 < fmt;
224
225 OS, fmt
226 < FMT;
227
228 log !< FMT;
229
230 # Misc packages needing only FMT.
231 FMT
232 < html,
233 internal/dag,
234 internal/goroot,
235 internal/types/errors,
236 mime/quotedprintable,
237 net/internal/socktest,
238 net/url,
239 runtime/trace,
240 text/scanner,
241 text/tabwriter;
242
243 io, reflect
244 < internal/saferio;
245
246 # encodings
247 # core ones do not use fmt.
248 io, strconv, slices
249 < encoding, encoding/base32, encoding/base64;
250
251 encoding, reflect
252 < encoding/binary;
253
254 FMT, encoding < flag;
255
256 fmt !< encoding/base32, encoding/base64;
257
258 FMT, encoding, encoding/base32, encoding/base64, encoding/binary,
259 internal/saferio
260 < encoding/ascii85, encoding/csv, encoding/gob, encoding/hex,
261 encoding/json, encoding/pem, encoding/xml, mime;
262
263 # hashes
264 io
265 < hash
266 < hash/adler32, hash/crc32, hash/crc64, hash/fnv;
267
268 # math/big
269 FMT, math/rand
270 < math/big;
271
272 # compression
273 FMT, encoding/binary, hash/adler32, hash/crc32, sort
274 < compress/bzip2, compress/flate, compress/lzw, internal/zstd
275 < archive/zip, compress/gzip, compress/zlib;
276
277 # templates
278 FMT
279 < text/template/parse;
280
281 net/url, text/template/parse
282 < text/template
283 < internal/lazytemplate;
284
285 # regexp
286 FMT, sort
287 < regexp/syntax
288 < regexp
289 < internal/lazyregexp;
290
291 encoding/json, html, text/template, regexp
292 < html/template;
293
294 # suffix array
295 encoding/binary, regexp
296 < index/suffixarray;
297
298 # executable parsing
299 FMT, encoding/binary, compress/zlib, internal/saferio, internal/zstd, sort
300 < runtime/debug
301 < debug/dwarf
302 < debug/elf, debug/gosym, debug/macho, debug/pe, debug/plan9obj, internal/xcoff
303 < debug/buildinfo
304 < DEBUG;
305
306 # go parser and friends.
307 FMT, sort
308 < internal/gover
309 < go/version
310 < go/token
311 < go/scanner
312 < go/ast
313 < go/internal/typeparams;
314
315 FMT
316 < go/build/constraint;
317
318 FMT, sort
319 < go/doc/comment;
320
321 go/internal/typeparams, go/build/constraint
322 < go/parser;
323
324 go/doc/comment, go/parser, text/tabwriter
325 < go/printer
326 < go/format;
327
328 math/big, go/token
329 < go/constant;
330
331 FMT, internal/goexperiment
332 < internal/buildcfg;
333
334 container/heap, go/constant, go/parser, internal/buildcfg, internal/goversion, internal/types/errors
335 < go/types;
336
337 # The vast majority of standard library packages should not be resorting to regexp.
338 # go/types is a good chokepoint. It shouldn't use regexp, nor should anything
339 # that is low-enough level to be used by go/types.
340 regexp !< go/types;
341
342 go/doc/comment, go/parser, internal/lazyregexp, text/template
343 < go/doc;
344
345 go/build/constraint, go/doc, go/parser, internal/buildcfg, internal/goroot, internal/goversion, internal/platform, internal/syslist
346 < go/build;
347
348 # databases
349 FMT
350 < database/sql/internal
351 < database/sql/driver;
352
353 database/sql/driver, math/rand/v2 < database/sql;
354
355 # images
356 FMT, compress/lzw, compress/zlib
357 < image/color
358 < image, image/color/palette
359 < image/internal/imageutil
360 < image/draw
361 < image/gif, image/jpeg, image/png;
362
363 # cgo, delayed as long as possible.
364 # If you add a dependency on CGO, you must add the package
365 # to cgoPackages in cmd/dist/test.go as well.
366 RUNTIME
367 < C
368 < runtime/cgo
369 < CGO
370 < runtime/msan, runtime/asan;
371
372 # runtime/race
373 NONE < runtime/race/internal/amd64v1;
374 NONE < runtime/race/internal/amd64v3;
375 CGO, runtime/race/internal/amd64v1, runtime/race/internal/amd64v3 < runtime/race;
376
377 # Bulk of the standard library must not use cgo.
378 # The prohibition stops at net and os/user.
379 C !< fmt, go/types, CRYPTO-MATH, log/slog;
380
381 CGO, OS
382 < plugin;
383
384 CGO, FMT
385 < os/user
386 < archive/tar;
387
388 sync
389 < internal/singleflight;
390
391 os
392 < golang.org/x/net/dns/dnsmessage,
393 golang.org/x/net/lif;
394
395 internal/bytealg, internal/itoa, math/bits, slices, strconv, unique
396 < net/netip;
397
398 os, net/netip
399 < internal/routebsd;
400
401 # net is unavoidable when doing any networking,
402 # so large dependencies must be kept out.
403 # This is a long-looking list but most of these
404 # are small with few dependencies.
405 CGO,
406 golang.org/x/net/dns/dnsmessage,
407 golang.org/x/net/lif,
408 internal/godebug,
409 internal/nettrace,
410 internal/poll,
411 internal/routebsd,
412 internal/singleflight,
413 net/netip,
414 os,
415 sort
416 < net;
417
418 fmt, unicode !< net;
419 math/rand !< net; # net uses runtime instead
420
421 # NET is net plus net-helper packages.
422 FMT, net
423 < net/textproto;
424
425 mime, net/textproto, net/url
426 < NET;
427
428 # logging - most packages should not import; http and up is allowed
429 FMT, log/internal
430 < log;
431
432 log, log/slog !< crypto/tls, database/sql, go/importer, testing;
433
434 FMT, log, net
435 < log/syslog;
436
437 RUNTIME
438 < log/slog/internal, log/slog/internal/buffer;
439
440 FMT,
441 encoding, encoding/json,
442 log, log/internal,
443 log/slog/internal, log/slog/internal/buffer,
444 slices
445 < log/slog
446 < log/slog/internal/slogtest, log/slog/internal/benchmarks;
447
448 NET, log
449 < net/mail;
450
451 # FIPS is the FIPS 140 module.
452 # It must not depend on external crypto packages.
453 # See also fips140deps.AllowedInternalPackages.
454
455 io, math/rand/v2 < crypto/internal/randutil;
456
457 STR < crypto/internal/impl;
458
459 OS < crypto/internal/sysrand
460 < crypto/internal/entropy;
461
462 internal/byteorder < crypto/internal/fips140deps/byteorder;
463 internal/cpu, internal/goarch < crypto/internal/fips140deps/cpu;
464 internal/godebug < crypto/internal/fips140deps/godebug;
465
466 STR, crypto/internal/impl,
467 crypto/internal/entropy,
468 crypto/internal/randutil,
469 crypto/internal/fips140deps/byteorder,
470 crypto/internal/fips140deps/cpu,
471 crypto/internal/fips140deps/godebug
472 < crypto/internal/fips140
473 < crypto/internal/fips140/alias
474 < crypto/internal/fips140/subtle
475 < crypto/internal/fips140/sha256
476 < crypto/internal/fips140/sha512
477 < crypto/internal/fips140/sha3
478 < crypto/internal/fips140/hmac
479 < crypto/internal/fips140/check
480 < crypto/internal/fips140/pbkdf2
481 < crypto/internal/fips140/aes
482 < crypto/internal/fips140/drbg
483 < crypto/internal/fips140/aes/gcm
484 < crypto/internal/fips140/hkdf
485 < crypto/internal/fips140/mlkem
486 < crypto/internal/fips140/ssh
487 < crypto/internal/fips140/tls12
488 < crypto/internal/fips140/tls13
489 < crypto/internal/fips140/bigmod
490 < crypto/internal/fips140/nistec/fiat
491 < crypto/internal/fips140/nistec
492 < crypto/internal/fips140/ecdh
493 < crypto/internal/fips140/ecdsa
494 < crypto/internal/fips140/edwards25519/field
495 < crypto/internal/fips140/edwards25519
496 < crypto/internal/fips140/ed25519
497 < crypto/internal/fips140/rsa
498 < FIPS;
499
500 FIPS, internal/godebug < crypto/fips140;
501
502 crypto, hash !< FIPS;
503
504 # CRYPTO is core crypto algorithms - no cgo, fmt, net.
505 # Mostly wrappers around the FIPS module.
506
507 NONE < crypto/internal/boring/sig, crypto/internal/boring/syso;
508 sync/atomic < crypto/internal/boring/bcache;
509
510 FIPS, internal/godebug, hash, embed,
511 crypto/internal/boring/sig,
512 crypto/internal/boring/syso,
513 crypto/internal/boring/bcache
514 < crypto/internal/fips140only
515 < crypto
516 < crypto/subtle
517 < crypto/sha3
518 < crypto/internal/fips140hash
519 < crypto/cipher
520 < crypto/internal/boring
521 < crypto/boring
522 < crypto/aes,
523 crypto/des,
524 crypto/rc4,
525 crypto/md5,
526 crypto/sha1,
527 crypto/sha256,
528 crypto/sha512,
529 crypto/hmac,
530 crypto/hkdf,
531 crypto/pbkdf2,
532 crypto/ecdh,
533 crypto/mlkem
534 < CRYPTO;
535
536 CGO, fmt, net !< CRYPTO;
537
538 # CRYPTO-MATH is crypto that exposes math/big APIs - no cgo, net; fmt now ok.
539
540 CRYPTO, FMT, math/big
541 < crypto/internal/boring/bbig
542 < crypto/rand
543 < crypto/ed25519 # depends on crypto/rand.Reader
544 < encoding/asn1
545 < golang.org/x/crypto/cryptobyte/asn1
546 < golang.org/x/crypto/cryptobyte
547 < crypto/dsa, crypto/elliptic, crypto/rsa
548 < crypto/ecdsa
549 < CRYPTO-MATH;
550
551 CGO, net !< CRYPTO-MATH;
552
553 # TLS, Prince of Dependencies.
554
555 crypto/fips140, sync/atomic < crypto/tls/internal/fips140tls;
556
557 crypto/internal/boring/sig, crypto/tls/internal/fips140tls < crypto/tls/fipsonly;
558
559 CRYPTO, golang.org/x/sys/cpu, encoding/binary, reflect
560 < golang.org/x/crypto/internal/alias
561 < golang.org/x/crypto/internal/subtle
562 < golang.org/x/crypto/chacha20
563 < golang.org/x/crypto/internal/poly1305
564 < golang.org/x/crypto/chacha20poly1305;
565
566 CRYPTO-MATH, NET, container/list, encoding/hex, encoding/pem,
567 golang.org/x/crypto/chacha20poly1305, crypto/tls/internal/fips140tls
568 < crypto/internal/hpke
569 < crypto/x509/internal/macos
570 < crypto/x509/pkix
571 < crypto/x509
572 < crypto/tls;
573
574 # crypto-aware packages
575
576 DEBUG, go/build, go/types, text/scanner, crypto/sha256
577 < internal/pkgbits, internal/exportdata
578 < go/internal/gcimporter, go/internal/gccgoimporter, go/internal/srcimporter
579 < go/importer;
580
581 NET, crypto/rand, mime/quotedprintable
582 < mime/multipart;
583
584 crypto/tls
585 < net/smtp;
586
587 crypto/rand
588 < hash/maphash; # for purego implementation
589
590 # HTTP, King of Dependencies.
591
592 FMT
593 < golang.org/x/net/http2/hpack
594 < net/http/internal, net/http/internal/ascii, net/http/internal/testcert;
595
596 FMT, NET, container/list, encoding/binary, log
597 < golang.org/x/text/transform
598 < golang.org/x/text/unicode/norm
599 < golang.org/x/text/unicode/bidi
600 < golang.org/x/text/secure/bidirule
601 < golang.org/x/net/idna
602 < golang.org/x/net/http/httpguts, golang.org/x/net/http/httpproxy;
603
604 NET, crypto/tls
605 < net/http/httptrace;
606
607 compress/gzip,
608 golang.org/x/net/http/httpguts,
609 golang.org/x/net/http/httpproxy,
610 golang.org/x/net/http2/hpack,
611 net/http/internal,
612 net/http/internal/ascii,
613 net/http/internal/testcert,
614 net/http/httptrace,
615 mime/multipart,
616 log
617 < net/http/internal/httpcommon
618 < net/http;
619
620 # HTTP-aware packages
621
622 encoding/json, net/http
623 < expvar;
624
625 net/http, net/http/internal/ascii
626 < net/http/cookiejar, net/http/httputil;
627
628 net/http, flag
629 < net/http/httptest;
630
631 net/http, regexp
632 < net/http/cgi
633 < net/http/fcgi;
634
635 # Profiling
636 FMT, compress/gzip, encoding/binary, sort, text/tabwriter
637 < runtime/pprof;
638
639 OS, compress/gzip, internal/lazyregexp
640 < internal/profile;
641
642 html, internal/profile, net/http, runtime/pprof, runtime/trace
643 < net/http/pprof;
644
645 # RPC
646 encoding/gob, encoding/json, go/token, html/template, net/http
647 < net/rpc
648 < net/rpc/jsonrpc;
649
650 # System Information
651 bufio, bytes, internal/cpu, io, os, strings, sync
652 < internal/sysinfo;
653
654 # Test-only
655 log
656 < testing/iotest
657 < testing/fstest;
658
659 FMT, flag, math/rand
660 < testing/quick;
661
662 FMT, DEBUG, flag, runtime/trace, internal/sysinfo, math/rand
663 < testing;
664
665 log/slog, testing
666 < testing/slogtest;
667
668 FMT, crypto/sha256, encoding/binary, encoding/json,
669 go/ast, go/parser, go/token,
670 internal/godebug, math/rand, encoding/hex
671 < internal/fuzz;
672
673 OS, flag, testing, internal/cfg, internal/platform, internal/goroot
674 < internal/testenv;
675
676 OS, encoding/base64
677 < internal/obscuretestdata;
678
679 CGO, OS, fmt
680 < internal/testpty;
681
682 NET, testing, math/rand
683 < golang.org/x/net/nettest;
684
685 syscall
686 < os/exec/internal/fdtest;
687
688 FMT, sort
689 < internal/diff;
690
691 FMT
692 < internal/txtar;
693
694 CRYPTO-MATH, testing, internal/testenv, encoding/json
695 < crypto/internal/cryptotest;
696
697 CGO, FMT
698 < crypto/internal/sysrand/internal/seccomp;
699
700 FIPS
701 < crypto/internal/fips140/check/checktest;
702
703 # v2 execution trace parser.
704 FMT, io, internal/trace/tracev2
705 < internal/trace/version;
706
707 FMT, encoding/binary, internal/trace/version
708 < internal/trace/raw;
709
710 FMT, internal/trace/version, io, sort, encoding/binary
711 < internal/trace/internal/tracev1;
712
713 FMT, encoding/binary, internal/trace/version, internal/trace/internal/tracev1, container/heap, math/rand
714 < internal/trace;
715
716 regexp, internal/trace, internal/trace/raw, internal/txtar
717 < internal/trace/testtrace;
718
719 regexp, internal/txtar, internal/trace, internal/trace/raw
720 < internal/trace/internal/testgen;
721
722 # cmd/trace dependencies.
723 FMT,
724 embed,
725 encoding/json,
726 html/template,
727 internal/profile,
728 internal/trace,
729 internal/trace/traceviewer/format,
730 net/http
731 < internal/trace/traceviewer;
732
733 # Coverage.
734 FMT, hash/fnv, encoding/binary, regexp, sort, text/tabwriter,
735 internal/coverage, internal/coverage/uleb128
736 < internal/coverage/cmerge,
737 internal/coverage/pods,
738 internal/coverage/slicereader,
739 internal/coverage/slicewriter;
740
741 internal/coverage/slicereader, internal/coverage/slicewriter
742 < internal/coverage/stringtab
743 < internal/coverage/decodecounter, internal/coverage/decodemeta,
744 internal/coverage/encodecounter, internal/coverage/encodemeta;
745
746 internal/coverage/cmerge
747 < internal/coverage/cformat;
748
749 internal/coverage, crypto/sha256, FMT
750 < cmd/internal/cov/covcmd;
751
752 encoding/json,
753 runtime/debug,
754 internal/coverage/calloc,
755 internal/coverage/cformat,
756 internal/coverage/decodecounter, internal/coverage/decodemeta,
757 internal/coverage/encodecounter, internal/coverage/encodemeta,
758 internal/coverage/pods
759 < internal/coverage/cfile
760 < runtime/coverage;
761
762 internal/coverage/cfile, internal/fuzz, internal/testlog, runtime/pprof, regexp
763 < testing/internal/testdeps;
764
765 # Test-only packages can have anything they want
766 CGO, internal/syscall/unix < net/internal/cgotest;
767
768
769 `
770
771
772 func listStdPkgs(goroot string) ([]string, error) {
773
774 var pkgs []string
775
776 src := filepath.Join(goroot, "src") + string(filepath.Separator)
777 walkFn := func(path string, d fs.DirEntry, err error) error {
778 if err != nil || !d.IsDir() || path == src {
779 return nil
780 }
781
782 base := filepath.Base(path)
783 if strings.HasPrefix(base, ".") || strings.HasPrefix(base, "_") || base == "testdata" {
784 return filepath.SkipDir
785 }
786
787 name := filepath.ToSlash(path[len(src):])
788 if name == "builtin" || name == "cmd" {
789 return filepath.SkipDir
790 }
791
792 pkgs = append(pkgs, strings.TrimPrefix(name, "vendor/"))
793 return nil
794 }
795 if err := filepath.WalkDir(src, walkFn); err != nil {
796 return nil, err
797 }
798 return pkgs, nil
799 }
800
801 func TestDependencies(t *testing.T) {
802 testenv.MustHaveSource(t)
803
804 ctxt := Default
805 all, err := listStdPkgs(ctxt.GOROOT)
806 if err != nil {
807 t.Fatal(err)
808 }
809 slices.Sort(all)
810
811 sawImport := map[string]map[string]bool{}
812 policy := depsPolicy(t)
813
814 for _, pkg := range all {
815 imports, err := findImports(pkg)
816 if err != nil {
817 t.Error(err)
818 continue
819 }
820 if sawImport[pkg] == nil {
821 sawImport[pkg] = map[string]bool{}
822 }
823 var bad []string
824 for _, imp := range imports {
825 sawImport[pkg][imp] = true
826 if !policy.HasEdge(pkg, imp) {
827 bad = append(bad, imp)
828 }
829 }
830 if bad != nil {
831 t.Errorf("unexpected dependency: %s imports %v", pkg, bad)
832 }
833 }
834 }
835
836 var buildIgnore = []byte("\n//go:build ignore")
837
838 func findImports(pkg string) ([]string, error) {
839 vpkg := pkg
840 if strings.HasPrefix(pkg, "golang.org") {
841 vpkg = "vendor/" + pkg
842 }
843 dir := filepath.Join(Default.GOROOT, "src", vpkg)
844 files, err := os.ReadDir(dir)
845 if err != nil {
846 return nil, err
847 }
848 var imports []string
849 var haveImport = map[string]bool{}
850 if pkg == "crypto/internal/boring" {
851 haveImport["C"] = true
852 }
853 fset := token.NewFileSet()
854 for _, file := range files {
855 name := file.Name()
856 if name == "slice_go14.go" || name == "slice_go18.go" {
857
858 continue
859 }
860 if !strings.HasSuffix(name, ".go") || strings.HasSuffix(name, "_test.go") {
861 continue
862 }
863 info := fileInfo{
864 name: filepath.Join(dir, name),
865 fset: fset,
866 }
867 f, err := os.Open(info.name)
868 if err != nil {
869 return nil, err
870 }
871 err = readGoInfo(f, &info)
872 f.Close()
873 if err != nil {
874 return nil, fmt.Errorf("reading %v: %v", name, err)
875 }
876 if info.parsed.Name.Name == "main" {
877 continue
878 }
879 if bytes.Contains(info.header, buildIgnore) {
880 continue
881 }
882 for _, imp := range info.imports {
883 path := imp.path
884 if !haveImport[path] {
885 haveImport[path] = true
886 imports = append(imports, path)
887 }
888 }
889 }
890 slices.Sort(imports)
891 return imports, nil
892 }
893
894
895 func depsPolicy(t *testing.T) *dag.Graph {
896 g, err := dag.Parse(depsRules)
897 if err != nil {
898 t.Fatal(err)
899 }
900 return g
901 }
902
903
904
905 func TestStdlibLowercase(t *testing.T) {
906 testenv.MustHaveSource(t)
907
908 ctxt := Default
909 all, err := listStdPkgs(ctxt.GOROOT)
910 if err != nil {
911 t.Fatal(err)
912 }
913
914 for _, pkgname := range all {
915 if strings.ToLower(pkgname) != pkgname {
916 t.Errorf("package %q should not use upper-case path", pkgname)
917 }
918 }
919 }
920
921
922 func TestFindImports(t *testing.T) {
923 imports, err := findImports("go/build")
924 if err != nil {
925 t.Fatal(err)
926 }
927 t.Logf("go/build imports %q", imports)
928 want := []string{"bytes", "os", "path/filepath", "strings"}
929 wantLoop:
930 for _, w := range want {
931 for _, imp := range imports {
932 if imp == w {
933 continue wantLoop
934 }
935 }
936 t.Errorf("expected to find %q in import list", w)
937 }
938 }
939
View as plain text