blob: 4e16fbde315188d4746c61e288ffcd45582fa566 [file] [log] [blame]
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package arc
import (
"context"
"path/filepath"
"time"
"chromiumos/tast/common/testexec"
"chromiumos/tast/errors"
"chromiumos/tast/local/arc"
"chromiumos/tast/testing"
)
func init() {
testing.AddTest(&testing.Test{
Func: IPv6Connectivity,
Desc: "Checks IPv6 connectivity inside ARC",
Contacts: []string{"taoyl@google.com", "cros-networking@google.com"},
// FIXME: Uncomment Attr: after lab supports IPv6. http://b/161239666
// Attr: []string{"group:mainline", "informational"},
SoftwareDeps: []string{"android_p", "chrome"},
Timeout: 4 * time.Minute,
Fixture: "arcBooted",
})
}
func IPv6Connectivity(ctx context.Context, s *testing.State) {
const (
pingTimeout = 10 * time.Second
googleDNSIPv6 = "2001:4860:4860::8888"
googleDotComIPv6 = "ipv6.google.com"
)
a := s.FixtValue().(*arc.PreData).ARC
verify := func(ctx context.Context, cmd func(context.Context, string, ...string) *testexec.Cmd, bindir string) error {
// Verify global IPv6 address is configured correctly.
out, err := cmd(ctx, filepath.Join(bindir, "ip"), "-6", "addr", "show", "scope", "global").Output(testexec.DumpLogOnError)
if err != nil {
return errors.Wrap(err, "failed to get address information")
}
if len(out) == 0 {
return errors.New("no global IPv6 address is configured")
}
// Verify connectivity to literal IPv6 address destination.
if err := testing.Poll(ctx, func(ctx context.Context) error {
return cmd(ctx, filepath.Join(bindir, "ping6"), "-c1", "-w1", googleDNSIPv6).Run()
}, &testing.PollOptions{Timeout: pingTimeout}); err != nil {
return errors.Wrapf(err, "cannot ping %s", googleDNSIPv6)
}
// Verify connectivity to IPv6-only host name.
if err := testing.Poll(ctx, func(ctx context.Context) error {
return cmd(ctx, filepath.Join(bindir, "ping6"), "-c1", "-w1", googleDotComIPv6).Run()
}, &testing.PollOptions{Timeout: pingTimeout}); err != nil {
return errors.Wrapf(err, "cannot ping %s", googleDotComIPv6)
}
return nil
}
// Check IPv6 availablility at host first. If test fails in this part then it's a lab net issue instead of ARC issue.
if err := verify(ctx, testexec.CommandContext, "/bin"); err != nil {
s.Fatal("Failed to communicate from host, check lab network setting: ", err)
}
if err := verify(ctx, a.Command, "/system/bin"); err != nil {
s.Error("Failed to communicate from ARC: ", err)
}
}