Openembedded Core Discussions
 help / color / mirror / Atom feed
* [PATCH v3 1/2] go: extend runtime test
@ 2025-09-14 18:25 Osama Abdelkader
  2025-09-14 18:25 ` [PATCH v3 2/2] go: add sdk test Osama Abdelkader
  0 siblings, 1 reply; 4+ messages in thread
From: Osama Abdelkader @ 2025-09-14 18:25 UTC (permalink / raw)
  To: openembedded-core, alex.kanavin, mathieu.dubois-briand; +Cc: Osama Abdelkader

extend go runtime test with a simple test file, and simple
go module test to validate go compilation and execution on
target.

Signed-off-by: Osama Abdelkader <osama.abdelkader@gmail.com>
---
v2: add check for go command, skip tests if not found
v3: add changelog
---
 meta/lib/oeqa/files/test.go       |  7 ++++
 meta/lib/oeqa/runtime/cases/go.py | 68 +++++++++++++++++++++++++++++++
 2 files changed, 75 insertions(+)
 create mode 100644 meta/lib/oeqa/files/test.go

diff --git a/meta/lib/oeqa/files/test.go b/meta/lib/oeqa/files/test.go
new file mode 100644
index 0000000000..9ca9302654
--- /dev/null
+++ b/meta/lib/oeqa/files/test.go
@@ -0,0 +1,7 @@
+package main
+
+import "fmt"
+
+func main() {
+	fmt.Println("Hello from Go!")
+}
diff --git a/meta/lib/oeqa/runtime/cases/go.py b/meta/lib/oeqa/runtime/cases/go.py
index 39a80f4dca..fc7959b5f4 100644
--- a/meta/lib/oeqa/runtime/cases/go.py
+++ b/meta/lib/oeqa/runtime/cases/go.py
@@ -4,10 +4,78 @@
 # SPDX-License-Identifier: MIT
 #
 
+import os
 from oeqa.runtime.case import OERuntimeTestCase
 from oeqa.core.decorator.depends import OETestDepends
 from oeqa.runtime.decorator.package import OEHasPackage
 
+class GoCompileTest(OERuntimeTestCase):
+
+    @classmethod
+    def setUp(cls):
+        dst = '/tmp/'
+        src = os.path.join(cls.tc.files_dir, 'test.go')
+        cls.tc.target.copyTo(src, dst)
+
+    @classmethod
+    def tearDown(cls):
+        files = '/tmp/test.go /tmp/test'
+        cls.tc.target.run('rm %s' % files)
+        dirs = '/tmp/hello-go'
+        cls.tc.target.run('rm -r %s' % dirs)
+
+    @OETestDepends(['ssh.SSHTest.test_ssh'])
+    @OEHasPackage('go')
+    @OEHasPackage('go-runtime')
+    @OEHasPackage('go-runtime-dev')
+    @OEHasPackage('openssh-scp')
+    def test_go_compile(self):
+        # Check if go is available
+        status, output = self.target.run('which go')
+        if status != 0:
+            self.skipTest('go command not found, output: %s' % output)
+
+        # Compile the simple Go program
+        status, output = self.target.run('go build -o /tmp/test /tmp/test.go')
+        msg = 'go compile failed, output: %s' % output
+        self.assertEqual(status, 0, msg=msg)
+
+        # Run the compiled program
+        status, output = self.target.run('/tmp/test')
+        msg = 'running compiled file failed, output: %s' % output
+        self.assertEqual(status, 0, msg=msg)
+
+    @OETestDepends(['ssh.SSHTest.test_ssh'])
+    @OEHasPackage('go')
+    @OEHasPackage('go-runtime')
+    @OEHasPackage('go-runtime-dev')
+    @OEHasPackage('openssh-scp')
+    def test_go_module(self):
+        # Check if go is available
+        status, output = self.target.run('which go')
+        if status != 0:
+            self.skipTest('go command not found, output: %s' % output)
+
+        # Create a simple Go module
+        status, output = self.target.run('mkdir -p /tmp/hello-go')
+        msg = 'mkdir failed, output: %s' % output
+        self.assertEqual(status, 0, msg=msg)
+
+        # Copy the existing test.go file to the module
+        status, output = self.target.run('cp /tmp/test.go /tmp/hello-go/main.go')
+        msg = 'copying test.go failed, output: %s' % output
+        self.assertEqual(status, 0, msg=msg)
+
+        # Build the module
+        status, output = self.target.run('cd /tmp/hello-go && go build -o hello main.go')
+        msg = 'go build failed, output: %s' % output
+        self.assertEqual(status, 0, msg=msg)
+
+        # Run the module
+        status, output = self.target.run('cd /tmp/hello-go && ./hello')
+        msg = 'running go module failed, output: %s' % output
+        self.assertEqual(status, 0, msg=msg)
+
 class GoHelloworldTest(OERuntimeTestCase):
     @OETestDepends(['ssh.SSHTest.test_ssh'])
     @OEHasPackage(['go-helloworld'])
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v3 2/2] go: add sdk test
  2025-09-14 18:25 [PATCH v3 1/2] go: extend runtime test Osama Abdelkader
@ 2025-09-14 18:25 ` Osama Abdelkader
  2025-09-18 14:00   ` [OE-core] " Ross Burton
  0 siblings, 1 reply; 4+ messages in thread
From: Osama Abdelkader @ 2025-09-14 18:25 UTC (permalink / raw)
  To: openembedded-core, alex.kanavin, mathieu.dubois-briand; +Cc: Osama Abdelkader

- Add meta/lib/oeqa/sdk/cases/go.py with GoCompileTest and GoHostCompileTest classes
- Test validates Go cross-compilation toolchain functionality
- Includes native compilation, cross-compilation, and Go module support
- Uses dynamic architecture detection for portability

Signed-off-by: Osama Abdelkader <osama.abdelkader@gmail.com>
---
v2: add check for go command, skip tests if not found
v3: add changelog
---
 meta/lib/oeqa/sdk/cases/go.py | 128 ++++++++++++++++++++++++++++++++++
 1 file changed, 128 insertions(+)
 create mode 100644 meta/lib/oeqa/sdk/cases/go.py

diff --git a/meta/lib/oeqa/sdk/cases/go.py b/meta/lib/oeqa/sdk/cases/go.py
new file mode 100644
index 0000000000..9c15124f6a
--- /dev/null
+++ b/meta/lib/oeqa/sdk/cases/go.py
@@ -0,0 +1,128 @@
+#
+# Copyright OpenEmbedded Contributors
+#
+# SPDX-License-Identifier: MIT
+#
+
+import os
+import shutil
+import unittest
+
+from oeqa.core.utils.path import remove_safe
+from oeqa.sdk.case import OESDKTestCase
+
+from oeqa.utils.subprocesstweak import errors_have_output
+errors_have_output()
+
+class GoCompileTest(OESDKTestCase):
+    td_vars = ['MACHINE', 'TARGET_ARCH']
+
+    @classmethod
+    def setUpClass(self):
+        # Copy test.go file to SDK directory (same as GCC test uses files_dir)
+        shutil.copyfile(os.path.join(self.tc.files_dir, 'test.go'),
+                        os.path.join(self.tc.sdk_dir, 'test.go'))
+
+    def setUp(self):
+        target_arch = self.td.get("TARGET_ARCH")
+        # Check for go-cross-canadian package (uses target architecture)
+        if not self.tc.hasHostPackage("go-cross-canadian-%s" % target_arch):
+            raise unittest.SkipTest("GoCompileTest class: SDK doesn't contain a Go cross-canadian toolchain")
+
+        # Additional runtime check for go command availability
+        try:
+            self._run('which go')
+        except Exception as e:
+            raise unittest.SkipTest("GoCompileTest class: go command not available: %s" % str(e))
+
+    def test_go_build(self):
+        """Test Go build command (native compilation)"""
+        self._run('cd %s; go build -o test test.go' % self.tc.sdk_dir)
+
+    def test_go_module(self):
+        """Test Go module creation and building"""
+        # Create a simple Go module
+        self._run('cd %s; go mod init hello-go' % self.tc.sdk_dir)
+        self._run('cd %s; go build -o hello-go' % self.tc.sdk_dir)
+
+    @classmethod
+    def tearDownClass(self):
+        files = [os.path.join(self.tc.sdk_dir, f) \
+                for f in ['test.go', 'test', 'hello-go', 'go.mod', 'go.sum']]
+        for f in files:
+            remove_safe(f)
+
+class GoHostCompileTest(OESDKTestCase):
+    td_vars = ['MACHINE', 'SDK_SYS', 'TARGET_ARCH']
+
+    # Architecture mapping from Yocto/Poky to Go
+    ARCH_MAP = {
+        'aarch64': 'arm64',
+        'cortexa57': 'arm64',  # ARM Cortex-A57 is ARM64
+        'cortexa72': 'arm64',  # ARM Cortex-A72 is ARM64
+        'cortexa53': 'arm64',  # ARM Cortex-A53 is ARM64
+        'x86_64': 'amd64',
+        'i586': '386',
+        'i686': '386',
+        'mips': 'mips',
+        'mipsel': 'mipsle',
+        'powerpc64': 'ppc64',
+        'powerpc64le': 'ppc64le',
+        'riscv64': 'riscv64',
+    }
+
+    @classmethod
+    def setUpClass(self):
+        # Copy test.go file to SDK directory (same as GCC test uses files_dir)
+        shutil.copyfile(os.path.join(self.tc.files_dir, 'test.go'),
+                        os.path.join(self.tc.sdk_dir, 'test.go'))
+
+    def setUp(self):
+        target_arch = self.td.get("TARGET_ARCH")
+        # Check for go-cross-canadian package (uses target architecture)
+        if not self.tc.hasHostPackage("go-cross-canadian-%s" % target_arch):
+            raise unittest.SkipTest("GoHostCompileTest class: SDK doesn't contain a Go cross-canadian toolchain")
+
+        # Additional runtime check for go command availability
+        try:
+            self._run('which go')
+        except Exception as e:
+            raise unittest.SkipTest("GoHostCompileTest class: go command not available: %s" % str(e))
+
+    def _get_go_arch(self):
+        """Get Go architecture from SDK_SYS"""
+        sdksys = self.td.get("SDK_SYS")
+        arch = sdksys.split('-')[0]
+
+        # Handle ARM variants
+        if arch.startswith('arm'):
+            return 'arm'
+
+        # Use mapping for other architectures
+        return self.ARCH_MAP.get(arch, arch)
+
+    def test_go_cross_compile(self):
+        """Test Go cross-compilation for target"""
+        goarch = self._get_go_arch()
+        self._run('cd %s; GOOS=linux GOARCH=%s go build -o test-%s test.go' % (self.tc.sdk_dir, goarch, goarch))
+
+    def test_go_module_cross_compile(self):
+        """Test Go module cross-compilation"""
+        goarch = self._get_go_arch()
+        self._run('cd %s; go mod init hello-go' % self.tc.sdk_dir)
+        self._run('cd %s; GOOS=linux GOARCH=%s go build -o hello-go-%s' % (self.tc.sdk_dir, goarch, goarch))
+
+    @classmethod
+    def tearDownClass(self):
+        # Clean up files with dynamic architecture names
+        files = [os.path.join(self.tc.sdk_dir, f) \
+                for f in ['test.go', 'go.mod', 'go.sum']]
+        # Add architecture-specific files using the same mapping
+        for arch in self.ARCH_MAP.values():
+            files.extend([os.path.join(self.tc.sdk_dir, f) \
+                         for f in ['test-%s' % arch, 'hello-go-%s' % arch]])
+        # Add 'arm' for ARM variants
+        files.extend([os.path.join(self.tc.sdk_dir, f) \
+                     for f in ['test-arm', 'hello-go-arm']])
+        for f in files:
+            remove_safe(f)
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [OE-core] [PATCH v3 2/2] go: add sdk test
  2025-09-14 18:25 ` [PATCH v3 2/2] go: add sdk test Osama Abdelkader
@ 2025-09-18 14:00   ` Ross Burton
  2025-09-19 18:32     ` Osama Abdelkader
  0 siblings, 1 reply; 4+ messages in thread
From: Ross Burton @ 2025-09-18 14:00 UTC (permalink / raw)
  To: osama.abdelkader@gmail.com; +Cc: openembedded-core@lists.openembedded.org

Hi Osama,

On 14 Sep 2025, at 19:25, Osama Abdelkader via lists.openembedded.org <osama.abdelkader=gmail.com@lists.openembedded.org> wrote:
> 
> +class GoHostCompileTest(OESDKTestCase):
> +    td_vars = ['MACHINE', 'SDK_SYS', 'TARGET_ARCH']
> +
> +    # Architecture mapping from Yocto/Poky to Go
> +    ARCH_MAP = {
> +        'aarch64': 'arm64',
> +        'cortexa57': 'arm64',  # ARM Cortex-A57 is ARM64
> +        'cortexa72': 'arm64',  # ARM Cortex-A72 is ARM64
> +        'cortexa53': 'arm64',  # ARM Cortex-A53 is ARM64
> +        'x86_64': 'amd64',
> +        'i586': '386',
> +        'i686': '386',
> +        'mips': 'mips',
> +        'mipsel': 'mipsle',
> +        'powerpc64': 'ppc64',
> +        'powerpc64le': 'ppc64le',
> +        'riscv64': 'riscv64’,

We’ve merged these tests, thanks very much.

However, this mapping is duplicating an existing map that is in meta/lib/oe/go.py.  Can you instead use that directly (import oe.go)  and delete this copy?

Thanks,
Ross

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [OE-core] [PATCH v3 2/2] go: add sdk test
  2025-09-18 14:00   ` [OE-core] " Ross Burton
@ 2025-09-19 18:32     ` Osama Abdelkader
  0 siblings, 0 replies; 4+ messages in thread
From: Osama Abdelkader @ 2025-09-19 18:32 UTC (permalink / raw)
  To: Ross Burton; +Cc: openembedded-core

On Thu, Sep 18, 2025 at 02:00:01PM +0000, Ross Burton wrote:
> Hi Osama,
> 
> On 14 Sep 2025, at 19:25, Osama Abdelkader via lists.openembedded.org <osama.abdelkader=gmail.com@lists.openembedded.org> wrote:
> > 
> > +class GoHostCompileTest(OESDKTestCase):
> > +    td_vars = ['MACHINE', 'SDK_SYS', 'TARGET_ARCH']
> > +
> > +    # Architecture mapping from Yocto/Poky to Go
> > +    ARCH_MAP = {
> > +        'aarch64': 'arm64',
> > +        'cortexa57': 'arm64',  # ARM Cortex-A57 is ARM64
> > +        'cortexa72': 'arm64',  # ARM Cortex-A72 is ARM64
> > +        'cortexa53': 'arm64',  # ARM Cortex-A53 is ARM64
> > +        'x86_64': 'amd64',
> > +        'i586': '386',
> > +        'i686': '386',
> > +        'mips': 'mips',
> > +        'mipsel': 'mipsle',
> > +        'powerpc64': 'ppc64',
> > +        'powerpc64le': 'ppc64le',
> > +        'riscv64': 'riscv64’,
> 
> We’ve merged these tests, thanks very much.
> 
> However, this mapping is duplicating an existing map that is in meta/lib/oe/go.py.  Can you instead use that directly (import oe.go)  and delete this copy?
> 
> Thanks,
> Ross

Hi Ross,

Thanks for the notice, I'm going to do that yes.

Thanks,
Osama


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2025-09-19 18:32 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-14 18:25 [PATCH v3 1/2] go: extend runtime test Osama Abdelkader
2025-09-14 18:25 ` [PATCH v3 2/2] go: add sdk test Osama Abdelkader
2025-09-18 14:00   ` [OE-core] " Ross Burton
2025-09-19 18:32     ` Osama Abdelkader

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox