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